SDK for Open XML Formats

Microsoft hat anlässlich der TechEd in Orlando ein SDK für OpenXML released!

Das SDK ist derzeit eine Technology Preview und besteht aus einer Bibliothek mit dazugehörender Dokumentation.

Bei einem OpenXML Dokument handelt es sich ja nicht um eine einfache XML Textdatei, sondern um ein ganzes Set von XML Dokumenten (Parts), die in einem ZIP-Container (Package) zusammengefasst sind.

Schon bisher gab es Klassen im System.IO.Packaging Namespace des 3.0 Frameworks, die das Handling der Parts ermöglichten.

Mit dem SDK wurde eine objektorientierte API geschaffen, die den Zugriff auf System.IO.Packaging nochmals abstrahiert.

Mir gefällt in diesem Zusammenhang der Begriff der „strongly typed parts“ – dieser Ausdruck beschreibt treffend, was das SDK leistet.

Nun stehen dem Entwickler Objekte wie zum Beispiel WordprocessingDocument, MainDocumentPart, ImagePart, CommentsPart, etc. zur Verfügung.

Wer allerdings vom SDK auch einen objektorientierten Zugriff auf WordprocessingML, SpreadsheetML und PresentationML erwartet, wird derzeit leider (noch?) enttäuscht. Um den Inhalt eines Office Dokuments zu generieren, ist es nach wie vor nötig, das entsprechende XML selbst aufzubauen.

Ein Beispiel aus der Doku erläutert das ganz gut:

         // How to: Create a new package as a Word document.
        public static void CreateNewWordDocument(string document)
        {
            using (WordprocessingDocument wordDoc = 
              WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
            {
                // Set the content of the document so that Word can open it.
                MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
                SetMainDocumentContent(mainPart);
            }
        }

        // Set content of MainDocumentPart.
        public static void SetMainDocumentContent(MainDocumentPart part)
        {
            const string docXml =
            @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?> " +
            @"<w:document xmlns:w=""https://schemas.openxmlformats.org/wordprocessingml/2006/main"">" +
            @"<w:body><w:p><w:r><w:t>Hello world!</w:t></w:r></w:p></w:body></w:document>";

            using (Stream stream = part.GetStream())
            {
                byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
                stream.Write(buf, 0, buf.Length);
            }
        }

Man sieht, das der Inhalt des Worddokuments in der Methode SetMainDocumentContent mit einem XML string aufgebaut wird. An einer manuellen Erstellung von WordprocessingML-strings führt derzeit noch kein Weg vorbei.

Aber das Coding rund um die Parts gestaltet sich mit dieser API nun doch sehr viel einfacher und intuitiver, wie man an der CreateNewWordDocument-Methode erkennen kann. Ohne diese API müsste man sich mit diversen XML-Namespaces und Spezifikationen der OpenPackageConvention herumschlagen…

Das SDK findet sich unter: https://www.microsoft.com/downloads/details.aspx?FamilyId=AD0B72FB-4A1D-4C52-BDB5-7DD7E816D046&displaylang=en
Die Dokumentation dazu ist auch bereits online verfügbar: https://msdn2.microsoft.com/en-us/library/bb448854.aspx

[tom]