Home > PHP, Praca > Export do CSV

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:

Kategorie:PHP, Praca Tagi:, , ,
  1. szpakoo
    wrzesień 27th, 2008 at 14:40 | #1

    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

  2. sierpień 5th, 2009 at 16:59 | #2

    @szpakoo przecież excelu masz coś takiego jak wybór kodowania pliku CSV ;) Wybierasz sobie UTF i pozamiatane.

  1. Brak jeszcze trackbacków

agencja reklamowa lublin ślub i wesele senniki