Automatisierte Dokumentenerstellung mit PHPExcel

Teil 2: Erstklassig
Kommentare

Voraussetzungen und Installation: PHPExcel setzt PHP ab der Version 5.2.0 sowie die Erweiterungen php_xml, php_gd2 und php_zip voraus. Die letzte ist aber nur erforderlich, wenn Dateien im Excel-2007-Format xlxs gelesen oder geschrieben werden sollen.

Die Installation ist denkbar einfach. Die aktuelle Version von PHPExcel lässt sich unter http://phpexcel.codeplex.com/ als Zip-Archiv herunterladen und anschließend auf dem Webserver entpacken. Sinnvolle Speicherorte sind das Root-Verzeichnis des Webservers, was zu einer Struktur nach folgendem Schema führt:
/var/www/Classes/PHPExcel.php
/var/www/Classes/PHPExcel/Calculation.php
/var/www/Classes/PHPExcel/Cell.php
Das Archiv umfasst viele erläuternde Beispiele zur Funktionsweise, die als Vorlagen für die eigene Umsetzung dienen können. Aber nur bei den ersten drei Skripten (01simple-download-pdf.php, 01simple-download-xls.php und 01simple-download-xlsx.php) werden Dateien erzeugt und zum Download angeboten. Bei allen anderen Beispielen werden die Dateien auf dem Server erzeugt, aber im Verzeichnis der Beispiele abgespeichert. Neben den Referenzmustern enthält das Zip-Archiv noch die sehr ausführliche, absolut lesenswerte Dokumentation PHPExcel developer documentation.doc.

Aufbau des Dokuments

Nun wollen wir aber mit unserem eigenen Beispiel beginnen. PHPExcel arbeitet auf Basis UTF8 und setzt das für alle Inhalte voraus. Wie man auch mit anderen Zeichensätzen arbeiten kann, werden wir später in unserem Skript aufzeigen. Am Anfang wird einmalig die Klasse über PHPExcel.php eingebunden, alle anderen Klassen werden automatisch bei Bedarf nachgeladen (Lazy Loader). Für einige sprachabhängige Elemente (z. B. das Übersetzen von MS-Excel-Funktionen) wird die Sprachumgebung auf Deutsch eingestellt. Nach der Definition einiger Variablen werden die Aufrufparameter geprüft und initialisiert. Mit diesen Parametern kann unser Programm „ferngesteuert“ werden. Die Kundennummer $customerNo dient zum Filtern der Datensätze auf der Datenbank. Ein Kundenname für die Metadaten des Dokuments und den späteren Ausdruck wird mit $customerName übergeben. Als letzter Parameter wird mit $outputFormat das gewünschte Ausgabeformat festgelegt. Über ADOdb (http://adodb.sourceforge.net/) wird eine Verbindung zur Datenbank aufgebaut, die uns im weiteren Verlauf die Umsatzinformationen des gewünschten Kunden liefern wird. In Listing 1 „erzeugt“ der Klassenaufruf $objPHPExcel = new PHPExcel()nun ein neues Excel-Objekt. Zu Beginn werden die Dokumenteneigenschaften wie Autor oder Titel festgelegt. Diese sind sowohl für die späteren Empfänger als auch weiterverarbeitende Programme wie Dokumentenmanagementsysteme (DMS) sehr nützlich. Hierbei ist zu beachten, dass nur bei der Ausgabe in Excel 2007 und PDF die Werte gefüllt werden, bei Excel 5 bleiben sie leer. Um auch Kundennamen mit z. B. deutschen Umlauten ausgeben zu können, wird der übergebene Wert mittels utf8_encode in die UTF-8-Kodierung umgewandelt.
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Document Properties not working for every outputFormat, especially Excel5
$objPHPExcel->getProperties()->setCreator('Ralf Hohoff')
->setLastModifiedBy('Ralf Hohoff')
->setTitle(utf8_encode('Umsatzauswertung ' . $customerName ))

// Define margins
$objPHPExcel->getActiveSheet()->getPageMargins()->setTop(0.4)
->setRight(0.4)
->setLeft(0.4)
->setBottom(0.4);
Der Code in Listing 1 ist ein Musterbeispiel für aufgeräumten Quellcode – ermöglicht durch verkettete Methoden (Fluent Interfaces). Häufig will man auf einem Objekt mehrere Methoden nacheinander aufrufen. Das wird aber schnell unübersichtlich, wenn man immer den Objektnamen vor den Methodennamen schreiben muss. Mit den verketteten Methoden wird der Quellcode wesentlich lesbarer und erleichtert auf diese Weise die Anwendung der objektorientierten Programmierung. In unserem Beispiel werden nacheinander die Methoden setCreatorsetLastModifiedByusw. auf dem Objekt $objPHPExcel->getProperties() aufgerufen, ohne in jeder Zeile den Teil $objPHPExcel->getProperties() zu wiederholen. Im nächsten Block wird die Druckausgabe nach den individuellen Wünschen eingerichtet. Der Ausdruck erfolgt im Querformat auf DIN A4, wird automatisch auf eine Seite angepasst und zentriert ausgerichtet. Die Seitenränder werden definiert und die Kopf- und Fußzeile mit Text und Variablen gefüllt. In MS Excel sind für Kopf- und Fußzeile drei Bereiche Links (Left), Mitte (Center) undRechts (Right) vorgegeben, in denen Informationen ausgegeben werden können. Hierbei werden von PHPExcel zahlreiche Variablen und Formatierungen unterstützt, die alle durch das et-Zeichen& gekennzeichnet werden. Mit &C und &L werden die Bereiche Center und Left angesprochen, durch die Variable &D wird das aktuelle Datum ausgegeben. Die Standard-Formatierung des späteren Inhalts wird über die Variable $style definiert und mit der Anweisung $objPHPExcel->getActiveSheet()->getStyle(‚A1:I20‘)->applyFromArray($style) dem Bereich von A1 bis I20 zugewiesen. Mit einer simplen Anweisung ist ein ganzer Bereich formatiert. Nach der Festlegung der ersten Zeile (Spaltenkopf) mit den Spaltenüberschriften werden die Umsätze, die bereits vorbereitet pro Monat in einer Tabelle vorliegen, aus der Datenbank gelesen (Listing 2).
// Retrieve predefined values
$result = $db->Execute(' SELECT Monat, Monatsname, OffeneAuftraegeNettoLJ, UmsatzNettoLJ, UmsatzNettoVJ, 
UNprozent, RetourenNettoLJ, RetourenNettoVJ, RNprozent FROM umsaetze WHERE KundenNummer = '. $customerNo);

if ($result === false) die('no data');

// Output database rows
$row=2; // start output in second row of sheet
$columns=$result->FieldCount();
while (!$result->EOF) {
for ($i=0; $i setActiveSheetIndex(0)->setCellValue($arrAlphabet[$i].$row,utf8_encode($result->fields[$i]));
$result->MoveNext();
$row++;
}
Danach erfolgt die Ausgabe der Datensätze. Es werden alle Datensätze zeilen- und spaltenweise ausgegeben. Hierfür nutzen wir das Array $arrAlphabet und sprechen es im Methodenaufruf wie folgt an setCellValue($arrAlphabet[$i]. $row,utf8_encode($result->fields[$i]));. $i ist der aktuelle Datensatz und $row die gewünschte Zeile im Excel-Dokument. Es wird also jede Zelle einzeln angesprochen. Auf diese Weise wird z. B. im dritten Durchlauf und in der vierten Spalte der Wert 23239 in D4 ausgegeben. Nach dieser Ausgabe wird für eine verbesserte Lesbarkeit der Zeilenhintergrund alternierend eingefärbt. Über die Methodenaufrufe setFillType(PHPExcel_Style_Fill::FILL_SOLID) und getStartColor()->setRGB($bgColour) erfolgt die Zuweisung der Füllung mit der oben definierten Farbe. Die Konstante FILL_SOLID ist von PHPExcel vorgegeben, ein Blick in die Dokumentation und die Beispiele sei hier empfohlen. Die Ausgabe der Datensätze und deren Formatierung wurden bewusst getrennt, um nicht künstlich die Komplexität des Quelltextes zu erhöhen und flexibler für die Zukunft zu bleiben. Weiter mit: Teil 3 Alle Teile: Teil 1, Teil 2, Teil 3
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -