© VectorKnight/Shutterstock.com
Drei Wege, ein Word-Dokument mit PHPWord zu erstellen

Alles andere als eine Textwüste


Ein Word-Dokument in PHP zu erstellen klingt zunächst einmal nach einer großen Tüftelarbeit, die viel Zeit beansprucht. Anwendungsmöglichkeiten gibt es einige, und so lohnt es sich, gleich mehrere Möglichkeiten auszuprobieren, um diese Aufgabe vernünftig zu lösen. Und wir werden sehen: Es ist doch einfacher als man denkt.

Ein Word-Dokument in PHP zu erstellen, kann eine ganz schöne Herausforderung werden. Microsoft Word bietet eine Vielzahl an Optionen und Einstellungen, und die möchte man natürlich auch nutzen, um ein zufriedenstellendes Ergebnis zu erhalten. Vielleicht ist man ja in der Situation, Dokumente für einen Geschäftskunden erstellen zu müssen, der nur Word kennt, aber keine Ahnung von den Einschränkungen in PHP hat. Da kann es natürlich passieren, dass der Kunde unzufrieden ist, wenn etwas auf einmal nicht machbar ist.

In diesem Artikel werden wir uns PHPWord etwas genauer anschauen und drei verschiedene Wege zeigen, mit denen man Word-Dokumente erstellen kann: grundlegendes einfaches Templating, die Erstellung von Dokumenten komplett in PHP und – um ein bisschen verrückt zu werden und die Sache auf die Spitze zu treiben – die Kombination von beidem. Nach der Lektüre sollte man auf jeden Fall eine Idee davon haben, wie man sich am besten seinen persönlichen Word-Creator gestalten könnte.

PHPWord

PHPWord ist Teil der PHPOffice-Bibliothek [1], die es erlaubt, Dokumente in verschiedenen Dateiformaten komplett in PHP zu lesen und zu schreiben. Die unterstützten Formate sind HTML, ODText, PDF, RTF und Word 2007, das wir uns genauer anschauen werden. PHPWord ist aktuell in Version 0.14 auf GitHub [2] verfügbar. Noch ist nicht jedes Feature aus Microsoft Word komplett implementiert, doch die zur Verfügung stehenden Optionen sind schon sehr umfangreich. Einige davon werden im Folgenden anhand von Codebeispielen vorgestellt oder erwähnt. Damit diese Codebeispiele laufen, muss man natürlich PHPWord in sein Projekt einbinden. Zu Beginn beschäftigen wir uns mit dem einfachen Templating aus Word heraus.

Grundlegendes einfaches Templating

Mit PHPWord kann man sehr leicht mit Word-Templates arbeiten. Wenn man ein einfaches Dokument mit statischem Layout hat, in dem sich beispielsweise nur die Empfängeradressen ändern sollen, dann ist das der schnellste Weg. In Abbildung 1 sieht man das Template Template.docx, das mit Word erstellt wurde. Wie man sehen kann, sind Datum und Empfängeradresse durch Platzhalter ersetzt. Sie haben die Form ${placeholder}. Der PHP-Code, den man benötigt, um dieses Template dynamisch zu füllen, findet sich in Listing 1.

haubner_phpword_1.tif_fmt1.jpgAbb. 1: Einfaches, in Word erstelltes Template

Listing 1: Einfaches Templating

$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor('Template.docx'); $templateProcessor->setValue('date', date("d-m-Y")); $templateProcessor->setValue('name', 'John Doe'); $templateProcessor->setValue( ['city', 'street'], ['Sunnydale, 54321 Wisconsin', '123 International Lane']); $templateProcessor->saveAs('MyWordFile.docx');

Sehen wir uns das mal genauer an: Erst lädt man das Template in einen Template Processor, indem man die entsprechende Klasse aufruft und den Pfad zum Template als Parameter übergibt. Jetzt kann man die Platzhalter durch Werte ersetzen. Man sollte darauf achten, dass die setValue-Methode als erstes Argument den Namen des Platzhalters benötigt – jedoch ohne Dollarzeichen und geschweifte Klammern. Nachdem die Platzhalter ersetzt sind, speichert man das geänderte Template und ist fertig. Das Ergebnis ist in Abbildung 2 zu sehen.

haubner_phpword_2.tif_fmt1.jpgAbb. 2: Template mit ersetzten Platzhaltern

Der Template Processor kann noch mehr als nur Werte setzen, dennoch ist er sehr eingeschränkt. Zum Beispiel ist es nicht möglich, mehrere Textabsätze in einen Platzhalter zu packen; das geht nur mit einzeiligen Texten. Wenn man sich den Template Processor genauer anschauen möchte, sollte man einen Blick in die Dokumentation werfen [3].

Der größte Vorteil dieser Methode ist die Freiheit, Templates in Word zu erstellen. Man kann also alle Einstellungsmöglichkeiten nutzen und ist nicht durch PHP eingeschränkt. Wenn man aber mehrere Absätze oder kompliziertere Strukturen wie Tabellen in ein Dokument einfügen möchte, wird das so nicht klappen. Aber schauen wir doch mal die nächste Möglichkeit an und erstellen Dokumente komplett in PHPWord.

Word-Dokumente in PHPword erstellen

Um ein Word-Dokument zu generieren, muss man zuerst ein PhpWord-Objekt erstellen, welches dann mit Inhalten gefüllt werden kann: $phpWord = new PhpWord(); Um aus diesem Objekt ein Word-Dokument zu erstellen, muss man es mit einem Word 2007 Writer speichern:

$objWriter = IOFactory::createWriter($phpWord, 'Word2007'); $objWriter->save('MyDocument.docx');

Es nützt allerdings nicht viel, ein leeres Dokument zu erstellen, also packen wir ein bisschen Inhalt rein. PHPWord hat zwei grundlegende Objekte: Container [4] und Elemente [5]. Wenig überraschend können Container entweder Elemente oder andere Container enthalten. Einige Beispiele für Container sind header, footer, textrun (das sind Textabsätze), table, row und cell. Elemente sind text, link, image, checkbox und viele mehr. Die meisten Container oder Elemente können Styleinformationen erhalten, aber auf diese gehen wir hier nicht näher ein. Wenn man genauere Informationen ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang