Dynamische Office-Dokumente in SharePoint erzeugen

Office-Dokumente speichern kann in SharePoint jeder. Eine Herausforderung ist es jedoch, sie anzulegen, dynamisch mit Daten zu füllen und dann bereitzustellen. Mit XML geht das relativ einfach. So lassen sich Word-Dokumente direkt aus SharePoint heraus erzeugen und mit Daten füllen.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen
Lesezeit: 12 Min.
Von
  • Jörg Krause
  • Julius Eder
Inhaltsverzeichnis

Office-Dokumente speichern kann in SharePoint jeder. Eine Herausforderung ist es jedoch, sie anzulegen, dynamisch mit Daten zu füllen und dann bereitzustellen. Mit XML geht das relativ einfach. So lassen sich Word-Dokumente direkt aus SharePoint heraus erzeugen und mit Daten füllen.

Im Büroalltag spielen Office-Dokumente eine gewichtige Rolle: Texte lassen sich schnell erstellen und Tabellen einfach anlegen. Sie jedoch nach eigenen Wünschen zu gestalten und dynamisch mit Daten zu füllen ist deutlich schwieriger, da die API recht komplex ist. Einen einfacheren Ansatz bieten die auf Office Open XML beruhenden Formate DOCX, XSLX oder PPTX. Das zeigt sich bei einem Blick auf die grobe Struktur, beispielsweise einer Tabelle (Abb. 1).

Mehr Infos

Tipps & Tricks der SharePoint-Entwicklung

In dieser Artikelreihe der SharePoint-Experten von Computacenter bisher erschienen:

Office Open XML basiert auf dem Packaging-Standard. Das eigentliche Dokument ist hier in XML im Zip-Format zusammengefasst, darin enthalten auch sämtliche Ressourcen wie Bilder und andere Dokumententeile. Um zum Beispiel ein DOCX-Dokument direkt aus SharePoint zu erzeugen, muss man zuerst das document.xml im Verzeichnis /Word öffnen. Abbildung 1 zeigt einen Ausschnitt davon, hier die erste Zelle einer Tabelle mit einem Platzhalter. Hier werden später die Daten eingefügt (über Feldinformationen und auf direktem Weg ins XML). So muss sich der Entwickler nicht mit der API und deren komplexen Aufrufen auseinandersetzen. Es genügt, das Paket zu öffnen, das XML einzulesen, die Tabellenzeile mit den Feldern zu wiederholen und alles wieder zu verpacken.

Die innere Struktur eines Word-Dokuments (Abb. 1)

Den Packvorgang unterstützt der Namensraum System.IO.Packaging. Er befindet sich in der Bibliothek WindowsBase.dll, die auch Teil der Windows Presentation Foundation (WPF) ist. (Die hier vorgestellte Entwicklung ist damit in der Lage, ein als Vorlage bereitstehendes XPS zu erzeugen. Um die Vorlage direkt bearbeiten zu können, verwendet das Beispiel jedoch das Word-Format.) Das Auspacken erledigt der Entwickler über folgende Codezeilen:

Package package = Package.Open(
documentStream,
FileMode.Open,
FileAccess.ReadWrite);

Als Basis dient ein Objekt vom Typ Stream, das sich aus einer Dokumentenbibliothek beschaffen lässt. Dazu muss ein als Vorlage geeignetes Dokument vorhanden sein. Wichtig sind auch die Namen für die Felder der Liste, die ausgegeben werden soll. Um einen sich wiederholenden Abschnitt zu erhalten, bietet sich eine Tabelle an. Dazu erstellt man als Entwickler eine Zeile mit Platzhaltern, die man mit Daten gefüllt wiederholt in die Tabelle einsetzt (vgl. Abb. 1).

Anwender müssen diese Platzhalter auch als solche erkennen, um ungewollte Formatierungen der Tabelle auszuschließen. Man führt sie daher am besten über Steuerelemente als einfache Textfelder ein. In Word aktiviert man dazu die Entwickler-Toolbar (Abb. 2). Über den Eigenschaften-Dialog des jeweiligen Felds lässt sich der Name festlegen, der mit dem Feldnamen der Liste in SharePoint übereinstimmen muss.

Entwickleransicht (Abb. 2)

In Abbildung 3 ist zu sehen, wie sich ein eingefügtes Textfeld mit der Option Eigenschaften anpassen lässt. Der Tag-Name wird hier auf den Namen des Listenfelds gesetzt ("Personalnummer"). Alles Weitere geschieht außerhalb der Entwickleransicht und beschränkt sich auf das Formatieren der Seite.

Anpassung des eingefügten Textfelds mit der Option "Eigenschaften" (Abb. 3)

Im nächsten Schritt ist die Vorlage aus der Dokumentenbibliothek WordTemplates auszulesen. Dazu benötigt der Entwickler ein Objekt vom Typ SPDocumentLibrary:

SPDocumentLibrary templateLib = 
web.Lists.Cast<SPList>().FirstOrDefault(
list => list.RootFolder.Name == "WordTemplates")
as SPDocumentLibrary;

Alle weiteren Zugriffe erfolgen auf ähnliche Weise. Die Ergebnisse legt man in WordReports ab. Nun soll der Code für alle derartigen Fälle zum Einsatz kommen. Dazu bestimmt der Entwickler die Namen der Bibliotheken (bei Bedarf lässt sich das auch über Parameter regeln). Der Name der Vorlage ist hier mit ReportTemplate.docx festgelegt, während das Ergebnis den Zeitstempel als Teil des Dateinamens erhält.