Microsoft Office unter Kontrolle
von Markus Eisele

Als Softwareentwickler tut man sich heute an vielen Stellen schon nicht mehr so schwer, wie noch vor ein paar Jahren. Vieles ist standardisiert, austauschbar, komponentenorientiert und plattformübergreifend geworden. Eine der letzten großen Bastionen proprietärer Softwareentwicklung hat noch lange Zeit Microsoft beigesteuert. Mit den binären Dateiformaten
der wohl bekanntesten Office Suite des Planeten wurde immer wieder gehadert. Ende letzten Jahres wurde auch dieser Sumpf ausgehoben. Den Nachfolgern von .doc und Co wurde ein x an die
Dateiendung gehangen. Dieses folgt ausnahmsweise keinem Marketingeinfall sondern versinnbildlicht das zugrunde liegende Dateiformat. Hinter den Kürzeln .docx, .xlsx, usw. verstecken sich seit Office 2007 xml basierte Dokumente.

Auch wenn es auf den ersten Blick erscheinen mag, als sei XML ein alter Hut: Tatsache ist, dass die
Kombination mit einem defacto Standard wie Office und seinen Artefakten eine sehr schlagkräftige
Kombination ergibt. Sichtbar wird dies erst, wenn man den heimischen Desktop gedanklich verlässt und sich in die tägliche Arbeit der „Information Worker“ hineinversetzt. Dieser von Microsoft geprägte Begriff bezeichnet all diejenigen, die bei der Büroarbeit mehrheitlich mit Informationen zu tun haben und dafür die unterschiedlichsten Werkzeuge verwenden. In Zeiten, in denen die meisten Unternehmen zentralisierte Anwendungslandschaften betreiben und sich dort verschiedenste, zumeist webbasierte Lösungen tummeln, besteht der Alltag der „Büromenschen“ zumeist darin sich mit dem Webbrowser durch Anwendungen zu Klicken. Leider ist das komplett papierlose Büro noch immer keine Wirklichkeit. Daher werden gesammelte und aufbereitete Informationen anschließend in menschenlesbare und / oder rechtlich geeignete Formate (Rechnungen, Lieferscheine, Briefe, etc.) gebracht. Das geschieht immer noch recht häufig per
Kopieren und Einfügen. Ein, nicht nur auf den ersten Blick, gewöhnungsbedürftiger Zustand. Dieses
Vorgehen ist nicht nur fehleranfällig, es schafft auch einen zusätzlichen Arbeitsschritt. Viel einfacher wäre es doch, wenn die zentralen Anwendungen die aufbereiteten Dokumente direkt fertig abliefern würden. Was sich einfach anhört, war bisher alles andere als das. Der Grund dafür war nicht zuletzt vor allem das bisher binäre und nicht offengelegte Dateiformat von Microsofts Office Paket und den enthaltenen Werkzeugen.

Was bisher geschah

Aber natürlich hat sich die Entwicklergemeinde nicht von solchen Schwierigkeiten abschrecken lassen und auch dafür Lösungen gefunden. Zumindest ansatzweise. Findige Köpfe haben Mittel und Wege gefunden das geheime Office Format zu entschlüsseln und Frameworks(Java, PHP, etc.) bereitgestellt, welche einfachste Aufgaben zur Dokumenterstellung übernahmen. Zumindest unter Unix bzw. Linux Systemen waren aber weder umfangreiche Formatierungen noch komplexere Aufgaben (bspw. Pivot Grafiken in Excel) bei der okumentengenerierung möglich. Lediglich auf Windows basierten Systemen können, dank der modularen Bauweise von Office,
mehrere Möglichkeiten genutzt werden. Per COM Zugriff können Word, Excel und Co gestartet
werden oder gar nur einzelne Funktionen aufgerufen werden. Was sich komplex anhört ist im Programmieralltag noch viel schlimmer. Zumindest, wenn man sich nicht auf einem Microsoft Betriebssystem bewegen muss. Im einfachsten Fall sind die erhältlichen Frameworks nur langsam und speicherhungrig. Im schlimmsten Fall können sie genau die eine, benötigte Funktion gar nicht abbilden. Schlussendlich blieb zumeist nur ein recht einfacher Weg übrig. Der einfache Export von textbasierten Dateiformaten (bspw csv, o.ä) und ein manueller Import in die gewünschte Office Anwendung.

Fünfundvierzig

Das technische Komitee 45 (TC45) der Ecma International hat diesen leidvollen Zustand im Dezember 2006 behoben, nachdem Microsoft, auch auf Drängen von Internationalen Regierungen, das neue XML basierte Dateiformat zur Standardisierung offengelegt hat. Unter dem Namen „Office Open XML“ verbirgt sich ein auf XML basierendes Dateiformat für Büroanwendungspakete. Als offener Standard soll es den problemlosen Daten- und Dateienaustausch zwischen Büroanwendungspaketen ermöglichen. Aktuelle Referenzimplementierung ist dabei natürlich
Microsoft Office 2007. Ein Bestandteil des Standards ist dabei die sogenannte WordprocessingML (auch nur WordML). Die Buchstaben ML stehen dabei für Markup Language. Diese Untermenge wurde auch schon von Office 2003 verstanden. Auf Grund von Patentansprüchen und der damals fehlenden Offenlegung war dieser Ansatz aber anscheinend nicht weitgehend genug. Darüber hinaus wurden die WordML Dokumente als unkomprimierte XML Dateien gespeichert. Was im Gegensatz zu einem komprimierten Binärformat zu deutlich größeren Dateien geführt hat. Auch handelte es sich dabei lediglich um eine Ergänzung von Word. Alle anderen Office Dokumententypen konnten diese nicht nutzen. Erst die weiterentwickelte Version behebt diese Schwachstellen komplett und öffnet den etablierten Industriestandard für einen übergreifenden Dokumentenaustausch.

Von Packages, Parts und Beziehungen

Um in der Anwendungsentwicklung von dem neuen Standard profitieren zu können muss man sich erstmal mit dessen Aufbau beschäftigen. Auf Basis der veröffentlichten Spezifikation ist das Unterfangen allerdings nahezu zum Scheitern verurteil. Sie umfasst mehrere tausend Seiten. Ein einfaches „Hello Word“ kann aber recht simpel erstellt werden. Das soll im Folgenden dann auch passieren. Zuerst zu Fuß und im Anschluss mithilfe von Java. Der neue Office Dateicontainer baut auf einer einfachen, komponentenbasierten und komprimierten ZIP-Datei auf (Package). Jede Datei setzt sich dabei aus einer beliebigen Anzahl von einzelnen Komponenten (Parts) zusammen. Dazu gehören neben XML Dokumenten auch binäre Dateien (bspw. Bilder oder OLE-Objekte). Die XML Dateien haben unterschiedliche Aufgaben. Neben Anwendungsdaten, Metadaten und eigenen Datensätzen werden auch die Beziehungen zwischen den Komponenten in XML Dateien abgebildet. Alle Einzelteile werden im ZIP Format in der entsprechenden Containerdatei (.docx, xlsx, etc.) gespeichert. Beachtenswert ist die Tatsache, dass alle Office-Anwendungen einige Arten von Komponenten gemeinsam verwenden. Dazu gehören beispielsweise Miniaturansichten, Metadaten, Medien und Beziehungen und Dokumenteigenschaften. Viele Komponenten gibt es jedoch nur in dem speziellen Dokumenttyp einer Anwendung. Eine Arbeitsblattkomponente gibt es beispielsweise nur in einem Excel-Dokument. Einen Folienmaster findet man als Komponente nur in einem PowerPoint-Dokument. Wer das alles live und in Farbe sehen möchte, der kann ein von Office 2007 generiertes Dokument einfach umbenennen. Statt .docx einfach in .zip. Mit dem Zipprogramm der Wahl einfach auspacken und sich die Strukturen auf der Festplatte selber anschauen. Allerdings sollte man keinen all zu großen Schock bekommen. Die von den Office Programmen generierten Dokumente weisen schon eine recht komplexe Struktur aus.

Word Dokument ohne Word

Am besten startet man daher vielleicht doch direkt selber mit einem Beispiel. Alles, was man dafür benötigt ist ein Editor der Wahl (gerne auch ein XML Editor) und einen Rechner. Zuerst wird ein leeres Verzeichnis beliebigen Namens erstellt. Gerne c:\heisewordbeispiel\. Hier hinein gehört die erste XML Datei mit dem zugegebenermaßen komischen Namen [Content_Types].xml. Sie sollte den folgenden Inhalt haben:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Types xmlns="http://schemas.openxmlformats.org/
package/2006/content-
types">
<Default Extension="rels" ContentType="application/vnd.openxmlformats-
package.relationships+xml"/>
<Default Extension="xml" ContentType="application/vnd.openxmlformats-
officedocument.wordprocessingml.document.main+xml"/>
<Default Extension="gif" ContentType="image/gif"/>
</Types>

Neben der Datei muss in diesem Ordner noch ein neues leeres Verzeichnis mit dem Namen _rels entstehen. Für dieses Beispiel soll noch das iX Logo in das Word Dokument. Mit dem Namen ix_logo.gif wandert es ebenfalls in den zuerst angelegten Beispielordner. Jetzt fehlt noch das eigentlich Dokument mit den Inhalten. Dafür muss erstmal eine leere Datei document.xml in den Beispielordner. Sind die Einzelteile an ihrem Platz, dann fehlen noch die Beziehungen zwischen allen. Dafür wird zuerst die Datei .rels im noch leeren Unterzeichnis _rels erstellt. Auch wenn sie einen ungewöhnlichen Namen hat handelt es sich wiederum um eine XML Datei. Unter Windows ist das allerdings nicht so einfach. Ein simples umbenennen eines neuen Dokumentes mit dem Explorer funktioniert nicht. Entweder kopiert man sich eine vorhandene Datei mit dem Namen oder man behilft sich mit einem Trick im guten alten Dos-Fenster (echo ““ > .rels). Dieser Befehlt erstellt eine leere Datei mit dem benötigten Namen. Auch wenn das Gesamtkonstrukt Office Dokument eigentlich nur aus Beziehungen zwischen Dateien besteht und es keine vorgeschriebene Verzeichnisstruktur gibt, so ist das Vorhandensein dieser Datei obligatorisch. Sie spezifiziert den Startpunkt für das fertige Worddokument. In diesem Fall hat sie folgenden Inhalt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships
xmlns="http://schemas.openxmlformats.org/
package/2006/relationships">
<Relationship Id="rId1"
Type="http://schemas.openxmlformats.org/
officeDocument/2006/relations
hips/officeDocument"
Target="document.xml"/>
</Relationships>

Damit das Bild in das Dokument eingebunden werden kann, muss noch eine weitere Beziehung zwischen dokument.xml und dem Bild hergestellt werden. Dies passiert in der Datei document.xml.rels. Auch sie gehört in das Unterverzeichnis _rels und hat folgenden Inhalt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships
xmlns="http://schemas.openxmlformats.org/
package/2006/relationships">
<Relationship Id="rId4"
Type="http://schemas.openxmlformats.org/
officeDocument/2006/relations
hips/image"
Target="ix_logo.gif"/>
</Relationships>

Nun sind alle Beziehungen geknüpft und wir können uns dem eigentlichen Inhalt widmen. Dazu
muss der folgende Inhalt in die Datei document.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:wordDocument
xmlns:r="http://schemas.openxmlformats.org/
officeDocument/2006/relationship
s"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:w="http://schemas.openxmlformats.org/
wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Hello Word! from iX</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:pict>
<v:shape
id="_x0000_i1025"
type="#_x0000_t75"
style="width:137; height:85">
<v:imagedata r:id="rId4"/>
</v:shape>
</w:pict>
</w:r>
</w:p>
</w:body>
</w:wordDocument>

Jetzt sollte alles an seinem Platz sein. Ein Verzeichnis mit drei Dateien, einem Unterverzeichnis und darin nochmal zwei weitere Dateien. Zeit, alles zu einem Word Dokument zusammen zu bauen. Alles was man nun noch benötigt ist ein ZIP Programm. Dabei ist lediglich darauf zu achten, dass in der ZIP Datei kein weiteres Unterverzeichnis entsteht. Sonst kann Word die Datei nicht öffnen. Das klappt dann recht einfach. Die ZIP Datei wird in .docx umbenannt und geht es auch schon los. Ein Doppelklick öffnet Word und dieses zeigt das „Hallo Word“ an. Wer kein aktuelles Office 2007 zur Hand hat, der kann auch einen Konverter für 2000 bzw 2003 installieren. Damit lassen sich die neuen Formate zumindest noch in Office Versionen 2000 und 2003 öffnen. Ältere Versionen werden leider nicht mehr Unterstützt.
Probleme kann es bei der manuellen Erstellung im Übrigen genug geben. Neben ungültigen Zeichen in den XML Dateien ist das Format sehr sensibel bzgl. Tippfehlern. Word ist als Endnutzerwerkzeug leider auch nicht dafür ausgelegt, entsprechend vielsagende Fehlermeldungen zu erzeugen. Ein guter Ansatz ist also immer, die XML Dateien auf ihre Gültigkeit zu prüfen. Syntaktisch richtige Dokumente sind allerdings für Office noch immer kein Garant zur korrekten Anzeige bzw. erfolgreichen Interpretation. Hier bleibt oft nur Versuch und Fehler. Nur die Microsoft Entwicklungsumgebung Visual Studio ist hier ein wenig komfortabler ausgestattet. Hat man allerdings dann ein fertiges Dokument welches man sich etwas genauer anschauen mag, dann kann der Package Explorer sehr hilfreich sein. Das kleine Werkzeug hilft bei der Navigation durch das Dateichaos in den komprimierten Zips. Das hier vorgestellte Beispiel deckt natürlich nur einen sehr kleinen Teil der Spezifikation ab. Neben der kompletten Formatierung kann man auch beliebige Daten in ein Word Dokument packen. Liegen diese bereits im XML Format vor, muss diese einfach als Quelldatei mit in dem Verzeichnis landen und via Beziehung referenziert werden.

Dynamischer Ansatz

Hat man einmal das Grundgerüst von XML und den Beziehungen verstanden, dann ist klar, dass dieses neue Dokumentenformat grundsätzlich einfach zu generieren ist. Dank dem offenen XML Format kann das heutzutage auch mit fast jeder Programmiersprache erfolgen. Ebenfalls schön ist, dass sich XML doch sehr weit Verbreitet hat und von den Entwicklern angenommen wird. Aber auch hier ist es kein Wunder, dass Microsoft nicht nur die Referenzimplementierung mit Office liefert, sondern auch als einziger Anbieter schon eine verwendbare API für seine Entwickler auf Basis von .NET bereithält. Sie kapselt das lästige Arbeiten mit Dateien, XML-Schema und ähnlich nervigem und ermöglicht einen Zugriff auf Office Dokumente und ihre Teile auf Objektebene. Man muss sich also nicht über Gebühr mit XML rumschlagen. Für den Rest der Programmiersprachen sieht es noch nicht so gut aus. Weder bei bekannten OpenSource Lieferanten noch im Produktumfeld findet man halbwegs stabile Lösungen. Aber das ändert sich sicherlich schnell. Erste Projekte sind initiiert und auf dem Weg zu erstem Produktiven Quellcode. Will man dennoch aktuell schon mit Java aktuell loslegen, dann kann man das mit überschaubarem Aufwand tun. Einzig mit XML Verarbeitung sollte man sich schon ein wenig auskennen. Die kompletten Schemata der verwendeten XML Namespaces stellt Microsoft auch zur Verfügung. Und eine Zipdatei kann Java auch schon länger generieren (java.util.zip.* Package). Für die ersten Schritte ist das sicherlich nicht der Traum eines Entwicklers, sich mit FileOutputStream und ZipFileEntry herumzuschlagen aber es geht. Und es ist auf alle Fälle stabiler und einfacher zu implementieren, als wenn man auf Apache POI oder ähnliches zurückgreifen muss. Neben der einfachen Erzeugung bieten sich auch noch weitere Dinge an. So kann beispielsweise ein Datenimport zukünftig per Excel Datei als Quelle ausgeführt werden. Oder Webcontentmanagementsysteme werden mit Word Dateien gefüttert. Ebenfalls denkbar ist eine Komplette Publishing Strecke auf deren Weg ein vom Autor erstelltes Word Dokument direkt in HTML und weiter in PDF verwandelt wird. Dabei könnte mit dem Office Open XML Format das Wordformat immer die führende Datenquelle bleiben. Wem das noch immer zu wenig Dynamik bei Word, Excel und Co ist, der kann sich auch aus anderem Blickwinkel dem neuen Dateiformat nähern. Neben der einfachen Erstellung der eigentlichen Dokumente per XML, können mit der neuen Spezifikation auch XML-Daten in die Dokumente eingebettet werden. Dabei können diese Daten in nahezu beliebigem XML Format vorliegen. Per Ressource Verknüpfung können diese, auch Custom XML Parts genannten Teile der Spezifikation, in Word, Excel oder Powerpoint Dateien enthalten sein. Angezeigt oder Eingebunden werden die enthaltenen Daten dann per SDT (StructuredDocumentTag). Ein SDT ist die XML Repräsentation eines Content Controls. Dieser muss dann per Custom XML Mapping an einen Custom XML Part gebunden sein. Auf einzelne Felder eines XML Dokuments wird dabei per XPath Ausdruck zugegriffen. Für die Anzeige eines Titels aus folgenden XML:

<magazine>
<artikel>
<titel>Word ML</title>
[...]
</article>
</magazin>

könnte dies dann im Word Dokument ungefähr folgendermaßen aussehen:

<w:sdt>
<w:sdtPr>
<w:dataBinding w:xpath="/magazine/artikel/titel" />
</w:sdtPr>
[...]
</w:sdt>

Dabei können mithilfe eines SDT verschiedene Typen von Eingabefeldern abgebildet werden. Neben einem Rich-Text Feld gibt es noch, Datums- und Bilder-Felder, Drop-Down- und Kombo- Boxen. Wem die manuellen Aufbereitung solch doch komplexerer Dokumente zu viel ist, der kann sich auch des Content Control Toolkits (siehe Kasten Links) bedienen. Es unterstützt das Mapping von Custom XML Parts an die Content Controls. Wer all dies ohne Hilfe von Open Source Software versucht per Hand in XML abzubilden wird schnell scheitern. Die von Word, Excel und Co. generierten Fehlermeldungen bei unvollständigem oder fehlerhaftem XML sind einfach zu wenig aussagekräftig, als das sie den ambitionierten Entwickler bei der Fehlersuche deutlich unterstützen würden. Bis auf die Angebe von Ort, Zeile und Zeichen gibt der Klick auf „Details“ bei einer entsprechenden Fehlermeldung nicht viel her. Daher führt bei der manuellen Generierung zurzeit noch kein Weg an Package Explorer und Content Control Toolkit vorbei.

Gegenwind

Auch wenn alles so einfach ist, bleibt ein Wehrmutstropfen. Die Mitbewerber sind nach wie vor nicht Glücklich mit dem neuen Industriestandard. Neben der Tatsache, dass Microsoft alle Office Versionen vor 2000 damit komplett abhängt sorgt vor allem die Komplexität der Spezifikation für Unmut. Statt auf bereits vorhandene Spezifikationen (MathML, SVG) zu setzten, hat Microsoft sich entschlossen alles neu zu machen. Nur mit viel Mühe und Zeit wird ein Dritthersteller wohl in der Lage sein, den kompletten Umfang in den eigenen Produkten abzubilden. Schaut man sich weiter um unter den Argumenten der Kritiker, dann bleibt vor allem ein dickes Fragezeichen zurück. Dieses Fragezeichen heißt OpenDocument. Dieses, unter der ISO/IEC norm 26300:2006 spezifizierte Dokumentenformat von OASIS gibt es bereits seit Mai 2005. Basis hierfür ist das als Opensource erhältliche Office Paket OpenOffice. Das grundlegende Konzept ist dabei erstaunlich gleich. Auch bei OpenDocument werden Zipdateien verwendet um XML Fragmente zu einem Dokument zusammenzufassen. Lediglich Spezifikation und Dateiendungen unterscheiden sich. Die Liste der OpenDocument Unterstützer ist auf alle Fälle aktuell viel länger als die Liste derer, die sich für Office Open XML ausgesprochen haben. Auch wenn sich die Argumente für ein offenes Dokumentenformat komplett gleichen: Neben der Notwendigkeit zur Erfüllung von gesetzlichen Anforderungen an die Revisionssicherheit sind das vor allem die Sorgen um eine Abhängigkeit von einem speziellen Hersteller. Darüber hinaus wird der Wunsch nach einem einfach
auszutauschenden Format vorgebracht, was möglichst viele Anwendungen lesen können. Pluspunkt auf der Seite von Microsoft bleibt die Tatsache, dass die Office Suite und daraus vor allem Word, Excel und Powerpoint mit Abstand verbreiteter sind als alle OpenSource Office Pakete zusammen. Eine Entscheidung für die eine oder die andere Richtung für die Dokumentenerstellung in der Zukunft ist noch lange nicht gefallen.

Links und Literatur