Export do CSV
Dostałem ostatnio w pracy do napisania klasę do exportu danych z bazy do exela. Jako że trochę byłem ograniczony czasowo, poszedłem po najmniejszej linii oporu, czyli odpaliłem google i zacząłem szukać.
Najprostsze rozwiązanie do zapisu surowych danych to export to csv’ a. Znalazłem dość prosty skrypt i zacząłem go przerabiać.
Klasa posiada jedną metodę publiczną i jedną prywatną i oczywiście konstruktor, w którym ustawiana jest ścieżka do zapisu wygenerowanego pliku i nazwa wygenerowanego pliku.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <?php class csvExport { private $separator = "\t"; private $pathToFile; private $fileName; /** * Konstruktor ustawia ściezkę i nazwę pliku * * @param string $pathToFile ścieżka do zapisania pliku * @param string $fileName nazwa pliku */ public function __construct( $pathToFile = null, $fileName = null ) { $this->pathToFile = (is_dir($pathToFile)) ? $pathToFile : "/"; $this->fileName = (!empty($fileName)) ? $fileName : date("Y-m-d"); } /** * Metoda w zależności od parametru $writeOut wyświetla dane * 0 - wyrzuca na ektran plik do ściagnięcia * 1 - Zapisuje pli na dysku w podanej lokalizacji * 2 - 0 i 1 jednocześnie * * @param array $data tablica danych * @param int $writeOut zmienna sterująca zachowaniem metody */ public function writeCsv(array $data, $writeOut = 0) { $prepared = $this->prepareCsvData($data); if(empty($prepared)) { throw new Exception("nie udało się przygotować danych."); } //wyrzuca na ekran plik do ściągnięcia if($writeOut == 0 or $writeOut == 2) { header("Content-type: text/csv"); header("Content-disposition: attachment; filename=" . $this->fileName .".csv"); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); print $prepared; } //zapisuje dane do pliku na dysku if($writeOut == 1 or $writeOut == 2) { $this->pathToFile; if( is_writable($this->pathToFile.$this->fileName) ) file_put_contents($this->pathToFile.$this->fileName.".csv", $prepared); else throw new Exception("Nie można zapisać do pliku, podana ściezka nie jest zapisywalna"); } } /** * Metoda przygotowuje dane do CSV w postaci stringa * * @name prepareCsvData * @param array $data * @return string dane przygotowane pod cvs'a (kolumny oddzielone \t, wiersze \n) * pierwszy wiersz kluczy. */ private function prepareCsvData(array $data) { if(!empty($data)) { foreach($data as $key => $v) { if( $key == 0 ) { if(is_array($v) and !empty($v)) { foreach($v as $vkey =>$vv) $arrvkey[] = $vkey; } else throw new Exception("Dane wejściowe są nieprawidłowe"); $preaparedCsv[] = implode($this->separator, $arrvkey); $preaparedCsv[] = implode($this->separator, $v); } else $preaparedCsv[] = implode($this->separator, $v); } return implode("\n", $preaparedCsv); } else throw new Exception("Dane wejściowe są nieprawidłowe"); } } ?> |
Publiczna metoda writeCsv() przyjmuje dwa parametry pierwszy to tablica danych pochodząca z bazy danych, drugi $writeOut w zależności od wartości pozwala wyrzucić plik na ekran do ściągnięcia bądź zapisać na serwerze lub jedno i drugie.
Prywatna metoda prepareCsvData() przygotowuje dane do zapisu czyli kolumny oddzielane są tabulacją a wiersze znakiem końca wiersza “\n”.
Całość jest dosyć prosta, wywołanie sprowadza się do:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php require_once 'csv.export.class.php'; $data = array( '0' => array( 'id' => '1', 'title' => 'Title of aplication', 'description' => 'Lorem ipsum', 'date' => '0000-00-00 00:00', ), '1' => array( 'id' => '2', 'title' => 'Title of second aplication', 'description' => 'New lorem ipsum', 'date' => '0000-00-00 00:00', ) ); $pathToFile = dirname(__FILE__)."/data/"; $newCsv = new csvExport($pathToFile, "plik"); $newCsv->writeCsv($data , 1); ?> |
W sieci można znaleźć kilka rozwiązań dotyczących exportu danych do exela np. pakiet PEAR Spreadsheet_Excel_Writer, albo PHPExcel.
W wolnej chwili pobawię się PHPExcelem - wygląda dosyć obiecująco.
Powiązane wpisy:
A już myślałem, że znajdę tutaj odpowiedź na pytanie: jak przekazać polskie znaki do excela
robiłem wiele razy csv-ki i zawsze z tym jest problem niestety. Całe szczęście że jest coś takiego jak Open Office, który rozumie moje ulubione UTF8:) Chwilke się pobawiłem Twoją klasą i pojawił się problem przy zapisie pliku na dysk. Dopisałem pare linijek i problem zniknął:) tak czy siak powinieneś dopracować troszkę to narzędzie. Pozdrawiam
@szpakoo przecież excelu masz coś takiego jak wybór kodowania pliku CSV
Wybierasz sobie UTF i pozamiatane.