Bardzo często generowaniu raportów, listy kontaktów czy też innych zbiorów danych prezentowanych w postaci tabeli, towarzyszy eksport tych danych do formatu CSV bądź XLS (Excel Binary File Format). O ile w przypadku formatu CSV wygenerowanie takiego pliku jest proste, wydajne i dostępne dla każdego języka programowania, o tyle format XLS wymaga użycia dedykowanych bibliotek, a przy tym bardzo często wydajność takiego rozwiązania nie spełnia naszych oczekiwań.

Po analizie istniejących rozwiązań dla języka PHP (jako podstawowego języka w codziennej pracy) zdecydowałem się przyjrzeć bliżej następującym bibliotekom:

Pierwsze dwa rozwiązania (PHPExcel, PEAR::Spreadsheet_Excel_Writer) to bardzo złożone i zaawansowane biblioteki oferujące niemalże pełen zakres funkcjonalności MS Excel. Wadą tych rozwiązań jest bardzo mała wydajność oraz częste błędy OOM. WriteExcel to port popularnej perlowej biblioteki Spreadsheet::WriteExcel. Niestety nie obsługuje kodowania UTF-8. Natomiast ostatnie dwie pozycje (HExcel, MS-Excel Stream Handler) to bardzo proste, szybkie i wydajne rozwiązania umożliwijące zapis pojedynczego arkusza w formacie XLS, ale podobnie jak WriteExcel nie umożliwiają zapisu w UTF-8.

Z uwagi na wymagania wobec generowania raportów i eksportu danych do XLS (kodowanie UTF-8, duża wydajność oraz małe wymagania pamięciowe) postanowiłem wykorzystać kod z WriteExcel, HExcel oraz MS-Excel Stream Handler, ale z taką różnicą, że finalne rozwiązanie powinno obsługiwać kodowanie UTF-8.

SimpleExcelStreamWriter

Dlatego też konieczne było zapoznanie się z dokumentacją formatu XLS a dokładniej BIFF. Efektem weekendu spędzonego na studiowaniu tej dokumentacji jest moja wersja klasy umożliwiającej zapis wiersz po wierszu do arkusza MS Excel - SimpleExcelStreamWriter. Przykładowe użycie:

$objExcelStream = new SimpleExcelStreamWriter('test.xls');
$objExcelStream->addNextRow($headers);
$objExcelStream->addNextRow($row_1);
$objExcelStream->addNextRow($row_2);
$objExcelStream->addNextRow($row_3);
$objExcelStream->addNextRow($row_n);
$objExcelStream->close();

Podsumowując, SimpleExcelStreamWriter to przykład prostego i dość wydajnego rozwiązania umożliwiającego zapis wiersz po wierszu tabelarycznych danych w formacie .xls. Co prawda posiada szereg ograniczeń, np. tylko pojedynczy arkusz, ale do eksportu raportów powinno to w zupełności wystarczyć. Na koniec jeszcze kilka przydatnych linków:

tagi:  ,  ,  , 

Komentarze