PHP i Windows - Tworzenie arkuszy kalkulacyjnych za pomocą biblioteki PHPExcel  Udostępnij na: Facebook

Autor: Maciej Wilgucki

Opublikowano: 2010-10-17

Z poprzedniego artykułu, poświęconego bibliotece PHPExcel dowiedziałeś się, w jaki sposób można odczytywać arkusze kalkulacyjne w PHP. W tym artykule zostanie opisane, jak tworzyć arkusze kalkulacyjne.

Implementacja

Odczytywanie arkuszy kalkulacyjnych było możliwe dzięki readerom – klasom odpowiedzialnym za wczytanie zawartości pliku, niezależnie od jego formatu. Dla każdego formatu przygotowana została osobna klasa, której wybór pozostawiony został metodzie, nazywanej fabryce. W przypadku tworzenia arkuszy kalkulacyjnych, klasami pomocniczymi są writery, dedykowane dla każdego typu. W zależności od wybranej przez nas klasy, będzie można utworzyć nowy dokument Excel, Open Office Calc czy CSV.

Podobnie, jak w przypadku odczytywania arkuszy kalkulacyjnych, będziesz korzystać z klasy PHPExcel. Jednak zamiast wczytania pliku, utworzysz go. Zacznij od utworzenia nowego obiektu:

require_once 'library/PHPExcel/PHPExcel.php';
$PHPExcel = new PHPExcel();

Mając gotowy obiekt, możesz od razu uzupełnić go danymi. Musisz przy tym pamiętać, aby wskazać arkusz, do którego dane mają trafić. W tym celu możesz wykorzystać metodę getActiveSheet. Dane możesz dodać do komórek, które możesz wskazać za pomocą współrzędnych [litera][liczba], gdzie litera oznacza kolumnę, a liczba wiersz.

$PHPExcel->getActiveSheet()->setCellValue('A1', 'zawartość komórki');

Innym sposobem jest podanie numerów kolumny i wiersza. W tym przypadku, zamiast litery, podajesz indeks kolumny, numerowany od zera. Oznacza to, że dla kolumny A indeksem jest 0, dla kolumny B indeksem jest 1 i tak dalej. Numeracja wierszy nie ulega zmianie i rozpoczyna się od 1.

$PHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, 2, 'inna zawartość komórki');

Pomocną funkcjonalnością biblioteki PHPExcel są value binders. Dzięki nim, danym zapisywanym do komórek, nadawany jest odpowiedni typ, np. data. Aby wykorzystać value binders musisz przed wstawieniem danych do komórek, wskazać value binder, z którego będziesz korzystał. PHPExcel dostarcza klasę, która wykrywa podstawowe typy danych. Poniższy przykład, zaczerpnięty z oficjalnej dokumentacji, ilustruje sposób wykorzystania bindowania wartości.

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_AdvancedValueBinder());
$PHPExcel = new PHPExcel();
$PHPExcel->getActiveSheet()->setCellValue('A4', 'Percentage value:');
$PHPExcel->getActiveSheet()->setCellValue('B4', '10%');
$PHPExcel->getActiveSheet()->setCellValue('A5', 'Date/time value:');
$PHPExcel->getActiveSheet()->setCellValue('B5', '21 December 1983');

Oprócz value binders masz możliwość bezpośredniego wskazania typu danych, zapisywanych do komórki.

$PHPExcel->getActiveSheet()->setCellValueExplicit('C5', '001', PHPExcel_Cell_DataType::TYPE_NUMERIC);

Dostępne typy danych to TYPE_STRING, TYPE_STRING2, TYPE_FORMULA, TYPE_NUMERIC, TYPE_BOOL, TYPE_NULL, TYPE_INLINE oraz TYPE_ERROR.

Ważną funkcją arkusza kalkulacyjnego są formuły. PHPExcel daje możliwość ich definiowania. Najprostszym przykładem zastosowania formuł jest sumowanie zawartości komórek.

$PHPExcel = new PHPExcel();
$PHPExcel->getActiveSheet()->setCellValue('B1', 6);
$PHPExcel->getActiveSheet()->setCellValue('B2', 3);
$PHPExcel->getActiveSheet()->setCellValue('B3', 9);
$PHPExcel->getActiveSheet()->setCellValue('A4', 'Suma:');
$PHPExcel->getActiveSheet()->setCellValue('B4', '=SUM(B1:B3)');

Bardzo ważnym aspektem tworzenia arkusza kalkulacyjnego jest jego poprawne opisanie za pomocą metadanych. PHPExcel dostarcza odpowiednich metod umożliwiających zapisanie tego typu danych.

$PHPExcel->getProperties()->setCreator('Jan Kowalski');
$PHPExcel->getProperties()->setLastModifiedBy('Anna Nowak');
$PHPExcel->getProperties()->setTitle('Raport finansowy');
$PHPExcel->getProperties()->setSubject('Sprawozdanie za trzeci kwartał 2011');
$PHPExcel->getProperties()->setDescription('Dużo zarobiliśmy, zarobimy jeszcze więcej');
$PHPExcel->getProperties()->setKeywords('raport zestawienie finanse');
$PHPExcel->getProperties()->setCategory('Finanse');

Po dodaniu wszystkich niezbędnych danych do arkusza kalkulacyjnego, możesz go wreszcie zapisać. Masz dwie możliwości. Metoda pierwsza – zapisanie na dysku, druga – wysłanie do przeglądarki. W obu przypadkach możesz wykorzystać tę samą metodę do zapisania arkusza, zmieni się tylko miejsce zapisu. Do zapisania danych możesz wykorzystać, wspomnianego na początku artykułu, writera. W przykładzie posłużyłem się typem dokumentu Excel 2007, jednak nic nie stoi na przeszkodzie, aby wykorzystać inny typ.

Writer można utworzyć na dwa sposoby – bezpośrednio, tworząc obiekt klasy lub wykorzystując fabrykę. Oba sposoby są równie dobre i wybór zależy tylko i wyłącznie od preferencji programisty.

$writer = new PHPExcel_Writer_Excel2007($PHPExcel);
// lub
$writer = PHPExcel_IOFactory::createWriter($PHPExcel, 'Excel2007');

Samo zapisanie pliku polega na wywołaniu metody save na obiekcie writera. Wymaganym argumentem metody save jest lokalizacja, w której chcesz zapisać plik. Na tym właśnie etapie możesz zdecydować, czy chcesz zapisać plik na dysku, czy wysłać do przeglądarki. W pierwszym przypadku musisz podać nazwę pliku, w drugim – strumień.

// zapisanie na dysku
$writer->save('raport finansowy.xlsx');

// wyslanie do przeglądarki
$writer->save('php://output');
Informacja
W przypadku wysyłania danych do strumienia, musisz wziąć pod uwagę, że taka operacja w konsoli spowoduje wysłanie danych do okna konsoli. Dlatego lepszym rozwiązaniem jest zapisanie danych do pliku, a dopiero potem wysłanie pliku do przeglądarki.

Podsumowanie

Z artykułu dowiedziałeś się, w jaki sposób tworzyć arkusze kalkulacyjne z poziomu PHP. Dzięki zastosowaniu biblioteki PHPExcel jesteś w stanie przygotować profesjonalne zestawienie danych w postaci poprawnie sformatowanego arkusza kalkulacyjnego, zawierającego dane oraz formuły.