Lekce 16 - Práce s dokumenty Excel v PHP - Úvod a první skripty
V minulé lekci, Šablonovací systém XSLT v PHP - Vícejazyčné šablony, jsme si ukázali jednoduchý způsob vytváření vícejazyčných šablon v XSLT.
V následujících lekcích si ukážeme, jak zapisovat do souboru
.xlsx
(formát tabulkového procesoru), neboli jak generovat
.xlsx
soubory přímo v PHP.
Motivace
PHP jde ruku v ruce s databázemi, zejména MySQL. Někdy ale potřebujeme s
daty pracovat v trochu jiném formátu. Někdy potřebujeme zaslat výpis z
databáze, umožnit dalším lidem práci s daty bez nutnosti znalosti SQL a PHP
a tak dále. Pro tyto případy se nejlépe hodí Excel, přesněji .xlsx
dokumenty.
Knihovna PhpSpreadsheet je určitě skvělou volbou. Je součástí balíku PHPOffice, který mimo tabulek umožňuje práci i s dokumenty Word nebo třeba PowerPoint.
S pomocí knihovny PhpSpreadsheet v několika dalších lekcích:
- převedeme data do tabulky v Excelu,
- provedeme jednoduché výpočty,
- vytvoříme několik přehledných grafů.
Vše si ukážeme na příkladu zpracování dat z meteostanice.
Prostředí
Knihovna PhpSpreadsheet
využívá Composer.
Kdo jej nemá nainstalovaný, může si ho stáhnout z oficiálních stránek, celá instalace
zabere jenom pár minut a kliknutí. Pokud vás nástroj Composer zajímá víc,
jeho instalace a základní příkazy jsou probrány v samostatné lekci o nástroji Composer.
Dále potřebujeme nějakou instanci PHP (>7.2). Vzhledem k tomu, že se jedná už o pokročilejší lekci, předpokládám, že všichni máme nějaké PHP prostředí k dispozici. Já osobně využívám pro testovací účely XAMPP, jeho zprovoznění je také otázka několika málo minut a kompletní návod najdete v samostatné lekci v kurzu PHP základy.
Samozřejmostí je potom nějaký tabulkový editor jako
LibreOffice či Excel. Knihovna
PhpSpreadsheet
podporuje řadu formátů, my budeme využívat
Microsoft Excel (>2007) a formát .xlsx
(novější formát .xls
).
Základní nastavení
Vytvoříme si pracovní adresář, v mém případě se jedná o složku
phpspreadsheet/
v adresáři xampp/htdocs/
.
Otevřeme příkazovou řádku (administrační mód) a pomocí příkazu change directory se přesuneme do pracovního adresáře, v mém případě to bude tedy příkaz:
Konzolová aplikace
> cd C:\xampp\htdocs\phpspreadsheet
Pomocí Composeru nainstalujeme celý balík:
composer require phpoffice/phpspreadsheet
Pokud instalace proběhla v pořádku, třikrát hurá. S velkou pravděpodobností narazíte na chybovou hlášku o nenalezených rozšířeních, něco jako:
Díky chybové hlášce můžeme zjistit, co je špatně:
phpoffice/phpspreadsheet 1.18.0 requires ext-gd * -> it is missing from your system. Install or enable PHP's gd extension.
V jejím textu se píše, že nám chybí rozšíření gd
pro
PHP. Otevřeme soubor C:\xampp\php\php.ini
, najdeme patřičný
zakomentovaný řádek a odkomentujeme ho odstraněním středníku. U mě to
byl řádek:
extension=gd
Nyní by instalace měla proběhnout v pořádku. Pokud máte za sebou práci s obrázky v PHP, tak toto rozšíření máte už pravděpodobně aktivované
Hello World!
Než se pustíme do nějakého většího projektu, pojďme otestovat, že nám vše funguje tak, jak má. Knihovna je dobře zdokumentovaná, pro klasický Hello World využijeme příklad od autorů:
require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); // vezmi list, na kterém právě jsme $sheet = $spreadsheet->getActiveSheet(); // zapiš do buňky A1 $sheet->setCellValue('A1', 'Hello World!'); // zapiš do buňky B1 $sheet->setCellValue('B1', "I'm here!"); // vytvoř xlsx objekt $writer = new Xlsx($spreadsheet); // vytvoř z xlsx objektu soubor "helloworld.xlsx" $writer->save('helloworld.xlsx');
Skript umístíme pod libovolným názvem (například
index.php
) do pracovního adresáře a spustíme Apache. Potom
najdeme cestu k našemu skriptu (podle konfigurace XAMPP, třeba
http://localhost/phpspreadsheet/index.php
. Zdánlivě se nic
nestane, ale když otevřeme pracovní složku, najdeme v ní soubor
helloworld.xlsx
. Pokud vidíte jakýkoliv výstup, nejspíš jste
někde v postupu nebo skriptu udělali chybu. Pokud vygenerovaný soubor
otevřeme v Excelu, uvidíme následující:
Pokud bychom nechtěli soubor ukládat přímo na disk, ale stáhnout ho, je
potřeba výstup přesměrovat na php://output
:
$writer->save('php://output');
Pokud bychom udělali jenom to, prohlížeč by soubor pokládal za klasický
text a jenom vypsal změť znaků. Proto musíme upravit header, neboli
hlavičku. Je důležité před samotným voláním zavolat funkci
ob_end_clean()
, protože jakýkoliv výpis před samotným
stažením by způsobil poškození souboru, a ten by pak nešel otevřít.
Celý skript by mohl vypadat třeba takto:
require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\IOFactory; $spreadsheet = new Spreadsheet(); // vezmi list, na kterém právě jsme $sheet = $spreadsheet->getActiveSheet(); // zapiš do buňky A1 $sheet->setCellValue('A1', 'Hello World!'); // zapiš do buňky B1 $sheet->setCellValue('B1', "I'm here!"); // vytvoření nového zapisovače do xlsx $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); // vyslání hlavičky - spreadsheet soubor header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // vyslání hlavičky - soubor ke stažení header('Content-Disposition: attachment; filename="helloworld.xlsx"'); // vymazání bufferu, aby nedošlo ke znehodnocení souboru ob_end_clean(); // vyslání souboru na výstup $writer->save('php://output');
Všimněte si, že jsme využili místo přímo Xlsx
objektu
IOFactory
. Není to podmínkou pro stažení souboru, jenom další
možnost, jak k tabulkám přistupovat.
Jak můžeme vidět, práce s .xlsx
soubory není s knihovnou
PhpSpreadsheet
nikterak složitá. S pomocí několika řádků
jsme úspěšně vytvořili soubor a zapsali do něj.
V další lekci, Práce s dokumenty Excel v PHP - Tabulka a graf, zpracujeme data ze souboru do dokumentu Excel, vytvoříme první tabulku i čárový graf.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 82x (1.8 MB)