PHPWord: vytvářejte a upravujte dokumenty přímo z PHP

Hledáte způsob, jakým vytvářet nebo upravovat soubory pro Microsoft Word ze skriptů v PHP? Z různých řešení doporučuji vyzkoušet bezplatnou knihovnu PHPWord. Běží samozřejmě i na linuxovém hostingu.
reklama

Jak vytvářet dokumenty pro Word v aplikacích psaných v PHP? Na internetu najdete mnoho řešení a služeb, které vám toto umožňují. Někdy jde o knihovny, které jen začleníte do svých existujících projektů, jindy o řešení postavené na některém frameworku (třeba pro Zend), jindy zase o služby běžící někde na jiném serveru a jsou přístupné pomocí nějakého API.

Z mého pohledu nejsnazším způsobem, jak dokumenty Wordu z PHP vytvářet, je použití nějaké knihovny začleněné do projektu. Přesně tak můžete pracovat s knihovnou PHPWord. Stačí si ji nakopírovat do svého projektu, připojit jeden soubor a hned můžete začít vytvářet nebo upravovat dokumenty.

Co všechno PHPWord dovede?

Je asi vhodné upozornit, že PHPWord pracuje s dokumenty Open XML, tedy se soubory s příponou DOCX. Nikoli se starým binárním DOC. Open XML je tu s námi již řadu let, používat jej lze v Microsoft Office od verze 2003, takže není třeba se tohoto formátu bát.

Soubory DOCX, stejně jako další ve formátu Open XML jsou vlastně balíčky ZIP, které obsahují popis dokumentu ve formátu XML. Klidně se podívejte, stačí soubor přejmenovat na příponu ZIP a rozbalit.

Knihovna PHPWord dovede vkládat a formátovat text v dokumentech, pracovat se zalamováním, doplňovat do dokumentu obrázky včetně vodoznaků, nastavovat hlavičku a patičku dokumentu, vkládat tabulky, seznamy a odkazy a také vyvářet obsah dokumentu. Zvládá tedy vše, co obvykle s dokumentem děláte přímo ve Wordu.

Navíc je k dispozici šablonovací systém. Do objektu PHPWordu ve svém skriptu načtete již existující soubor a necháte v něm nahradit připravené značky za vlastní hodnoty. Tím se otevírají nové možnosti využití této knihovny, například pro vytváření dokumentů na základě nějakých údajů vyplněných ve webovém formuláři.

Jak používat PHPWord a vytvořit soubor DOCX v PHP

Ve staženém balíčku najdete konkrétní ukázky použití ve složce Examples. Podívejme se na jednoduchou ukázku práce s textem v nově vytvořeném dokumentu.

Jako první je třeba do stávajícího skriptu napojit soubor PHPWord.php, který najdete v rozbaleném balíčku knihovny PHPWord. Následně vytvoříte nový objekt reprezentující dokument ve Wordu. Poté je potřeba do dokumentu přidat sekci a už můžete začít vkládat jeho obsah.

Pro uložení dokumentu do souboru jsou potřeba dva příkazy. První, s trochu složitějším zápisem, vytvoří objekt zapisovače, kterému předáváte jako jeden z parametrů objekt naplněný daty. Druhý příkaz pak tato data zapíše do souboru se zvolenou cestou a názvem.

<?php
require_once '../PHPWord.php';
 
// Vytvoření nového dokumentu
$PHPWord = new PHPWord();
 
// Vytvoření nové sekce
$section = $PHPWord->createSection();
 
// Přidání textových polí
$section->addText('Ahoj světe!');
$section->addTextBreak(2);
 
// Uložení souboru
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('Text.docx');
?>

PHPWord a šablony

Také pro práci se šablonami najdete ve staženém balíčku příklad, stejně jako pro pokročilejší práci s obsahem a formátováním. Co se šablon týče, základní použití je velice jednoduché:

<?php
require_once '../PHPWord.php';
 
$PHPWord = new PHPWord();
 
$document = $PHPWord->loadTemplate('sablona.docx');
 
$document->setValue('jmeno', 'Jan');
$document->setValue('prijmeni', 'Polzer');
 
$document->save('vysledek.docx');
?>

Tedy opět připojíte soubor PHPWord.php a vytvoříte nový objekt. Do něj ale napojíte existující soubor DOCX načtený jako šablonu (neplést se šablonami z Wordu jako takového). PHPWord vyhledává v takto napojeném dokumentu řetězce ve tvaru ${hodnota}, u kterých pomocí volání setValue() nahrazuje původní vzorek v šabloně za vámi definovaný text.

V příkladu, který mám uveden výše, tedy dojde k nahrazení výrazu ${jmeno} za slovo Jan a výrazu ${prijmeni} za slovo Polzer. Po nahrazení všech požadovaných řetězců pak dokument jen uložíte.

Problém je v tom, že v řadě případů je ve zdrojovém XML nahrazovací vzorek olepen mnoha značkami a není tam čistě jako řetězec ${hodnota}, který PHPWord očekává. Abyste se vyhnuli problémům, vyhledejte si v balíčku PHPWordu soubor PHPWord/Template.php a funkci setValue() upravte do podoby uvedené v tomto příspěvku. Poté vše funguje bez problémů.

Kde stahovat PHPWord

Knihovnu PHPWord si můžete stáhnout z webových stránek phpword.codeplex.com. Tamtéž najdete i sesterské knihovny PHPPowerPoint a PHPExcel, o které jsem psal v článku Jak vytvořit excelové sešity pomocí PHP.

Tagy
Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal a Symfony. Obojí také školím spolu se základy SEO. Jsem Acquia Certified Developer a Site Builder a napsal jsem několik knih o Drupalu. Ve volných chvílích cestuji a podnikám výlety. Více se dozvíte na mém firemním webu.

reklama

Komentáře k článku

návštěvník

Podařilo se Vám prosím rozchodit české znaky? Vše mi funguje právě až na češtinu.

 

Děkuji

návštěvník

Tak už jsem na to přišel, stačilo v souboru Section.php nahradit ve funkci addText řádek

$givenText = utf8_encode($text);

za

$givenText = ($text);

 

 

 

Přidat komentář

Filtered HTML

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <p> <br>
  • Řádky a odstavce se zalomí automaticky.
  • Web page addresses and email addresses turn into links automatically.

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
reklama
Nové diskuze
reklama
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

Knihy o Drupalu

Kniha Drupal 8 Kniha Drupal 7 333 tipů a triků pro Drupal
Více na KnihyPolzer.cz

Co píší na Interval.cz
@maxiorel na Twitteru

Maxiorel na Twitteru