Bekanntlich speichern die Office 2007 Applikationen die Dokumente standardmässig als .docx, .xlsx respektive .pptx ab. Ich habe festgestellt, dass die neuen Möglichkeiten, welche das neue offene Format bietet, weitgehend unbekannt sind.

So sagte mir gestern ein ISV, dass er wisse, dass die Dokumente neu im XML Format abgespeichert werden. Er habe jedoch kürzlich ein solches Dokument versucht zu öffnen und es erschien binär und somit unlesbar.

Mit Word 2003 ist WordML (Word Markup Language) eingeführt worden. Dies war in der Tat nichts anders als ein grosser XML-Stream und demnach etwas unhandlich für den Entwickler.

Open XML besteht nun aus mehreren sogenannten Document Parts, welche sofern sinnvoll als XML abgelegt werden (Layout, Fonttypen, usw). Binäre Dateien wie Bilder werden im binären Format gelassen. Sämtliche Document Parts werden in einem ZIP Container zusammengefasst - und sind daher mit einem normalen Editor nicht mehr lesbar. Der Vorteil der Verwendung eines ZIP Containers ist einerseits die Zusammenfassung mehrerer einzelner Dateien (Document Parts) andererseits natürlich eine automatische Kompression.

Ein Dokument besteht neu also vereinfacht gesagt aus ein paar XML Dateien. Da die Spezifikation bereits zum ECMA Standard geworden ist, kann sie natürlich von jedem eingesehen werden: Standard ECMA-376. Da XML Dateien mit jeder Programmiersprache erstellt werden können, ermöglicht dies beispielsweise die Erstellung eines Office Dokuments auf dem Server auch mit nicht .NET Sprachen. Hier finden Sie ein Beispiel, wie man dies z.B. mit PHP tun kann: OpenXMLDeveloper.org.

Um diese Dokumente mit .NET zu erstellen, empfiehlt sich die Verwendung spezieller Klassen, welche ein ZIP Package instanzieren respektive gezielt Document Parts abbilden können. Solche Klassen befinden sich übrigens im .NET FW 3.0.

Die Open XML Spezifikation studieren zu müssen, ist nicht unbedingt der Lieblingsbeschäftigung eines Entwicklers. Und wer möchte schon hingehen und ein komplexes Word Dokument von Grund auf mittels XML aufbauen?

 

Einen Schritt weiter

Für viele Szenarien reicht es aus, dass das komplexe Layout erst einmal mit Word erstellt wird. Um nun das effektive Dokument zur Laufzeit der Applikation zu erstellen (z.B. eine Kursbestätigung), müssen bloss noch ein paar Daten wie Kunde, Kurs, usw. eingefügt werden.

Aber auch dies klingt aufs Erste relativ kompliziert. Man müsste mittels XML DOM die einzelnen Elemente suchen und ersetzen. Aber muss man wirklich XML programieren? In vielen Fällen nicht: Open XML bietet die Möglichkeit, die Daten komplett vom Layout zu trennen! Was moderne Entwicklungstools schon lange anbieten, gibt's jetzt also auch mit Word 2007.

 

Word Content Controls

Die Idee ist also, dass wir eine Dokumentvorlage erstellen. Danach brauchen wir irgendeine Möglichkeit, diejenigen Stellen im Dokument, welche später mit Daten (Name, Kurs, ...) gefüllt werden sollen, zu markieren. In früheren Word Versionen hätte man hierfür Bookmarks verwendet. Neu bieten sich die flexibleren Word Content Controls an. Diese werden also auf dem Dokument platziert:

WordContentControls

Wohin mit den Daten?

Im ZIP Container wird nun ein separates XML-File mit den Daten benötigt. Doch wie können wir dieses erstellen? Auch müssen wir danach definieren, welches Element des XML-Datenfiles in welches Word Content Control gehört. Für beide Schritte gibt es innerhalb von Word 2007 keine Unterstützung. Mit Hilfe des Word 2007 Content Control Toolkits (CCT) können wir jedoch die beschriebenen Schritte jedoch produktiv erledigen:

 

Schritt 1: Öffnen des Word Dokuments mit Hilfe des CCTs und Definieren der Datenstruktur mittels XML:

WordContentControlToolkit1

Schritt 2: Mittels Drag & Drop können die einzelnen XML Elemente den Word Content Controls zugewiesen werden:

WordContentControlToolkit2

Resultat

Wenn wir jetzt das Dokument wieder öffnen und die Word Content Controls mit Text füllen, schreibt Word 2007 den Inhalt dieser Controls in ein separates XML File innerhalb des ZIP Containers:

ZipFile1

Das Item1.xml präsentiert sich wie folgt:

ZipFile3

Das Hauptdokument (document.xml) so:

ZipFile2

Wir sehen, dass der Wert des Feldes Datum einerseits im Dokument selber gespeichert wird, andererseits jedoch auch mittels XPath in dem separatem XML File referenziert wird.

Voilà - ab jetzt können wir also hingehen und ein kleines Programm schreiben, das einfach die Datei item1.xml innerhalb des ZIP Containers ersetzt und aktuelle Geschäftsdaten enthält.

 

Hauptvorteile

  1. Flexibilität: Office muss nicht installiert sein, das Office Object Model wird nicht benötigt! Damit werden Serverszenarien ermöglicht.
  2. Performanz: Da nicht Aufrufe über das Office Object Model nötig sind können diese Daten um Faktoren schneller erstellt werden.

Gerne gehe ich auch auf den C# Code ein der notwendig ist, um ein solches XML Document Part innerhalb ein ZIP Document Containers zu ersetzen. Es sind zwar weniger als 10 Zeilen, dennoch würde dies den Rahmen dies Blogeintrags sprengen...

 

Mehr Informationen und Live Demos

Am 10. Oktober führen wir bei uns in Wallisellen einen MSDN TechTalk zum Thema Office Business Applications durch. Hierbei geht es primär um den Einsatz von Office system im Zusammenhang mit den Informationen, welche in Back-Office Systemen abgelegt und oft schwierig zugänglich sind. Der Benutzer ist oft produktiver, wenn er gewisse Aufgaben direkt innerhalb seiner gewohnten Office system Umgebung erledigen kann.

Ein Thema, welches wir neben VSTO, dem Business Data Catalog. SharePoint Workflows und Dashboards behandeln werden ist natürlich Open XML!

Es würde mich freuen, Sie an gerade an diesem MSDN TechTalk begrüssen zu dürfen!