Implementując ostatnio jedną z funkcji portalu potrzebowałem sobie wygenerować plik w formacie XLS. Chodziło mi o przygotowanie pliku XLS w locie, po kliknięciu przez użytkownika przycisku i podanie tak stworzonego pliku użytkownikowi do ściągnięcia.
Znalazłem sporo prostych skryptów, które miały jedną wspólną cechę – nie działały dobrze. Generowały albo uszkodzone pliki XLS, albo stosowały różne obejścia (np. generowanie tabeli w HTML i zapisanie jej z rozszerzeniem XLS
).
W końcu udało mi się znaleźć chyba idealną bibliotekę.
PHPExcel
PHPExcel jest to rozbudowana biblioteka (zajmuje około 5 MB) napisana w PHP do obsługi plików Excela. Nie dość, że zapisuje pliki XLS, to jeszcze potrafi je odczytywać. W dodatku obsługuje różne wersje dokumentów XLS.
Poniżej sposób, który wykorzystałem przy generowaniu przykładowego pliku Excela oraz wyświetleniu użytkownikowi okna pobierania pliku.
<?php
// PHPExcel
include 'PHPExcel.php';
// PHPExcel_IOFactory
include 'PHPExcel/IOFactory.php';
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0); // ustawienie aktualnego arkusza
// tu wypełniamy komórki arkusza
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($Column, $Row, $Value);
// (...)
// wygenerowanie u użytkownika okna zapisu pliku o podanej nazwie
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $NazwaPliku . '"');
header('Cache-Control: max-age=0');
// zapis pliku do katalogu tymczasowego i wysłanie użytkownikowi do ściągnięcia
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); // albo 'Excel2007'
$objWriter->setTempDir("./");
$objWriter->save('php://output');
?>
Pliki generują się bezproblemowo – nie spotkałem się jeszcze z sytuacją, żeby plik był uszkodzony albo jakichś danych nie było. Jak widać powyżej, można generować zarówno pliki dla starszych wersji Office’a (XLS), jak i dla Office 2007 (XLSX). Tej drugiej możliwości nie testowałem, ale polecam przejrzenie dokumentacji, która jest całkiem przystępnie opracowana i okraszona przykładami.
Biblioteka jest darmowa, na licencji LGPL, zatem można ją swobodnie wykorzystywać do większości zastosowań.