Montag, 16. Juli 2007

Excel-Arbeitsmappe mit PHP erstellen

Wie erstellt man am besten mit Hilfe von PHP eine Microsoft Excel-Arbeitsmappe? Ich habe eine ganze Weile lang mit Google gesucht. Dabei sind die verschiedensten Methoden zu Tage getreten. Bei den einen konnte man nur ganz einfache Tabellen ohne Formatierung usw. erstellen und bei denen, die alle Funktionen zur Verfügung stellen, war die Installation, Konfiguration und Einbindung der entsprechenden PHP-Klassen mit einem nicht unerheblichen Aufwand verbunden.

Irgendwie war das alles nicht so das Wahre. Ich suchte also weiter. In irgendeinem Forum erwähnte dann jemand die Möglichkeit, dass Microsoft Excel auch XML-Dateien lesen kann. Leider verlief dieser Forums-Thread im Sande und es gab keine weiteren Informationen. So schaute ich mir dann also selber mal Excel und dessen Import- & Export-Möglichkeiten an. So, gefunden. Man kann also eine Excel-Arbeitsmappe auch als XML-Kalkulationstabelle abspeichern. Das tat ich auch mit einer kleinen Test-Datei. Heraus kam dabei einen schöne saubere XML-Datei:

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:
o="urn:schemas-microsoft-com:office:office"
xmlns:
x="urn:schemas-microsoft-com:office:excel"
xmlns:
html="http://www.w3.org/TR/REC-html40"
xmlns:
ss="urn:schemas-microsoft-com:office:spreadsheet">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Dirk Einecke</Author>
<LastAuthor>Dirk Einecke</LastAuthor>
<Created>2007-07-16T19:38:22Z</Created>
<Version>11.773</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>22000</WindowHeight>
<WindowWidth>-31136</WindowWidth>
<WindowTopX>-20</WindowTopX>
<WindowTopY>-20</WindowTopY>
<Date1904/>
<AcceptLabelsInFormulas/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Verdana"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s22">
<Font ss:FontName="Verdana" ss:Bold="1"/>
<Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s23">
<Font ss:FontName="Verdana" ss:Color="#0000D4"/>
</Style>
</Styles>
<Worksheet ss:Name="Tabelle1">
<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1"
x:
FullRows="1">
<Row>
<Cell ss:StyleID="s22"><Data ss:Type="String">Vorname</Data></Cell>
<Cell ss:StyleID="s22"><Data ss:Type="String">Nachname</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s23"><Data ss:Type="String">Dirk</Data></Cell>
<Cell ss:StyleID="s23"><Data ss:Type="String">Einecke</Data></Cell>
</Row>
<Row>
<Cell ss:StyleID="s23"><Data ss:Type="String">Max</Data></Cell>
<Cell ss:StyleID="s23"><Data ss:Type="String">Müller</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>0</PaperSizeIndex>
<HorizontalResolution>-4</HorizontalResolution>
<VerticalResolution>-4</VerticalResolution>
</Print>
<ShowPageLayoutZoom/>
<PageLayoutZoom>100</PageLayoutZoom>
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>1</ActiveRow>
<RangeSelection>R2C1:R3C2</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Tabelle2">
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>0</PaperSizeIndex>
<HorizontalResolution>-4</HorizontalResolution>
<VerticalResolution>-4</VerticalResolution>
</Print>
<ShowPageLayoutZoom/>
<PageLayoutZoom>100</PageLayoutZoom>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Tabelle3">
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>0</PaperSizeIndex>
<HorizontalResolution>-4</HorizontalResolution>
<VerticalResolution>-4</VerticalResolution>
</Print>
<ShowPageLayoutZoom/>
<PageLayoutZoom>100</PageLayoutZoom>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>

Finaler Test: was passiert, wenn ich diese XML-Datei wieder mit Excel öffne? Juhu! Schaut genau so aus wie die Original-Excel-Arbeitsmappe.

Fazit:
Wenn man eine Excel-Arbeitsmappe mit Hilfe von PHP (oder einer beliebigen anderen Programmiersprache) erstellen möchte, dann genügt es eine XML-Datei im richtigen (für Excel verarbeitbaren) Format zu erstellen. Am besten man geht dabei so vor, dass man zunächst mit Excel selbst eine Beispieldatei erstellt und diese als XML-Kalkulationstabelle speichert. Öffnet man diese dann in einem beliebigen Texteditor kann man sich die Struktur ansehen und kann sie mit den richtigen Daten "nachbauen". Das es so einfach ist hätte ich echt nicht gedacht.

1 Kommentar:

  1. Vielen Dank für diesen Tipp.

    Es gibt ein PEAR-Paket (Spreadsheet_Excel_Writer) das auch gut funktioniert. Jedoch konnte ich auf einem bestimmten Webserver kein Pear installieren ... der Weg über XML ist die Alternative.

    Gruß Olaf

    AntwortenLöschen