Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Peter Monadjemi | ActiveTraining Office-Dokumente mit dem OpenXML SDK erstellen.

Ähnliche Präsentationen


Präsentation zum Thema: "Peter Monadjemi | ActiveTraining Office-Dokumente mit dem OpenXML SDK erstellen."—  Präsentation transkript:

1 Peter Monadjemi | ActiveTraining Office-Dokumente mit dem OpenXML SDK erstellen

2 Die Themen Wie war das noch einmal mit OpenXML? Notwendigkeit für eine moderne Office- Automatisierung Das Open XML SDK 2.0 im Überblick Beispiel für den Umgang mit Word- Dokumenten Kurzer Ausflug zum Thema PDF

3 Wie war das noch einmal mit OpenXML? OpenXML – Von Microsoft initiierter XML-Standard für Office-Dokumente –ECMA 376 –ISO-Standard –Wird auch von OpenOffice/LibreOffice unterstützt –Alles weitere unter ML ML

4 Die Rolle des Containers OpenXML beschreibt nur die Struktur des Dokumentinhalts Der Aufbau der Datei (Container) wird durch die Open Packaging Convention (OPC) beschrieben Docx-, Xlsx-, Potx-Dateien usw. sind Zip- Archive, deren Aufbau durch die OPC beschrieben wird

5 Ein Röntgenblick in eine Docx- Datei Dokumentinhaltsordner Dokumenteigenschaften OpenXML-Dateien

6 Es gibt verschiedene OpenXML- Format WordprocessingML –Relativ geradlinig, Dokumente mit einer einfachen Struktur lassen sich auch einfach erstellen SpreadsheetML –Teilweise relativ komplex (vor allem, wenn es um Diagramme geht) PresentationML –Viele Feinheiten, die man nur über den Document- Reflector entschlüsseln kann

7 Notwendigkeit für eine moderne Office-Automatisierung Office kann in Server-Umgebungen offziell nicht installiert werden Ein Webanwendung kann damit Word- Dokumente nicht über OLE-Automatisierung erstellen OLE-Automatisierung ist generell langsam Moderne Office-Automatisierung bedeutet, Office-Dokumente ohne die Office- Anwendung erstellen und bearbeiten zu können

8 Das Open XML SDK 2.0 Eine umfangreiche Assembly (DocumentFormat.OpenXml.dll), deren Klassen die Struktur eines OpenXML-Dokuments abbilden 3680 Klassen (!) Erlaubt einen komfortablen und performanten Zugriff (z.B. per LINQ) auf die Struktur und den Inhalt eines OpenXML-Dokuments Separater Download unter Gut dokumentiert, viele Beispiele, Einarbeitung im Allgemeinen keine allzu große Herausforderung

9 Das Open XML SDK auf anderen Plattformen Läuft nicht unter Silverlight (die Dokumente müssen direkt angesprochen werden Es gibt keine Portierung auf Mono, aber es gibt eine einfache Java-API - die auch Compound Documents verarbeiten kann (Binärformat)

10 Die wichtigsten Namespaces DocumentFormat.OpenXml DocumentFormat.OpenXml.Packaging DocumentFormat.OpenXml.Wordprocessing DocumentFormat.OpenXml.Spreadsheet DocumentFormat.OpenXml.Presentation

11 Was geht/was geht nicht? Dokumente erstellen, auslesen und aktualisieren Kein Dokumentrendering" möglich –Man benötigt eine kommerzielle Komponente kaum möglich oder Office- Viewer Keine PDF-Unterstützung –iTextSharp oder kommerzielle Komponente

12 Reverse Engineering von Microsoft Office-Dokumenten OpenXmlSdkTool.exe ist "genial" Reflektiert die Struktur eines OpenXML- Dokuments in OpenXML und C# –C#-Code kann 1:1 übernommen werden Unentbehrlich, wenn man die Struktur eines OpenXML-Dokuments verstehen will, um neue Dokumente zu erstellen

13 System.IO.Package im Vergleich Package pack = Package.Open(DocName, FileMode.Create, FileAccess.ReadWrite); Uri PackageUri = new UriKind.Relative); string contentType PackagePart part = pack.CreatePart(PackageUri, contentType); StreamWriter streamPart = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.Write)); string WL Hallo, Basta! - es ist jetzt " + DateTime.Now.ToShortTimeString() "; streamPart.Write(WL); // ist nicht zwingend erforderlich streamPart.Flush(); streamPart.Close(); string relType pack.CreateRelationship(PackageUri, TargetMode.Internal, relType, "rId1"); // ist nicht zwingend erforderlich pack.Flush(); pack.Close();

14 Document.OpenXml im Vergleich using (WordprocessingDocument wdDoc = WordprocessingDocument.Create(DocName, DocumentFormat.OpenXml.WordprocessingDocumentType.Document)) { MainDocumentPart mainPart= wdDoc.AddMainDocumentPart(); mainPart.Document = new Document(new Body()); mainPart.Document.Body.Elements (); mainPart.Document.Body.Append(new Paragraph( new Run( new RunProperties { FontSize = new FontSize { Val="20pt"}, Color = new Color { Val="Red"}}, new Text { Text="Hallo, Basta - es ist jetzt " + DateTime.Now.ToShortTimeString() }))); wdDoc.Close(); }

15 Ein Auszug aus dem Word- Dokumentmodell Paragraph ParagraphProperties Run RunProperties Text Text-Attribut

16 Zugriff auf eine Docx-Datei – Dokument öffnen using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(ofd.FileName, false)) { MainDocumentPart mainPart = wdDoc.MainDocumentPart; Body body = mainPart.Document.Body; IEnumerable Paras = from p in body.Elements () select p; foreach (Paragraph p in Paras) { ParaListBox.Items.Add(p.InnerText); } } Typisierter Zugriff Abfrage über LINQ

17 Zugriff auf eine Docx-Datei – Text auslesen // Alle Absätze holen IEnumerable AlleParas = wdDoc.MainDocumentPart.Document.Body.Elements (); foreach (Paragraph p in AlleParas) { IEnumerable AlleTextElemente = p.Descendants (); foreach (Text t in AlleTextElemente) DocText += t.Text; }

18 Die Klassenstruktur eines Absatzes Paragraph p = new Paragraph( new Run( new RunProperties { FontSize = new FontSize { Val="20pt"}, Color = new Color { Val="Red"}}, new Text { Text="Hallo, Basta" }))); Eigenschaften eines Run-Elements Immer ein String-Typ

19 LINQ-Abfragen gegen OpenXML Mit LINQ wird das Lokalisieren bestimmter Dokumentelemente sehr einfach und vor allem natürlich ' Auflisten aller U3-Überschriften var U3Pars = from p in paras where p.Descendants ().Count() > 0 && p.Descendants (). ElementAtOrDefault(0).Val == "berschrift3" select p;

20 Eine Docx neu anlegen (1) using(WordprocessingDocument wdDoc = WordprocessingDocument.Create(docPfad, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = wdDoc.AddMainDocumentPart(); mainPart.Document = new Document( new Body()); mainPart.Document.Body.Append(new Paragraph ( new Run (new Text { Text="Hallo, Word!" }))); }

21 Eine Docx neu anlegen (2) using (WordprocessingDocument wdDoc = WordprocessingDocument.Create(docPfad, WordprocessingDocumentType.Document)) { MainDocumentPart mainPart = wdDoc.AddMainDocumentPart(); mainPart.Document = new Document( new Body()); // Text soll in 20pt Schrift rot und fett angezeigt werden mainPart.Document.Body.Append(new Paragraph( new Run(new RunProperties { Color = new Color { Val = "Red" }, Bold = new Bold { Val = new OnOffValue { Value =true } }, // FontSize per Default 1/72 inch FontSize = new FontSize { Val = "20pt" }, }, new Text { Text = "Hallo, Word!" }))); } Für jedes Detail gibt es eine Klasse

22 Dokumentbearbeitung in der Praxis (1) Zugriff auf die Textmarken eines Word- Dokuments Eine große Anzahl vorhandener Dokumente soll geändert werden Musterdokument enthält Textmarken Ein Inhalt (z.B. aus Datenbank) wird in die Textmarken des Dokuments eingetragen

23 Dokumentbearbeitung in der Praxis (2) Dank LINQ wird das Ändern von Textmarken sehr einfach Beispiel: Die Textmarke mit dem Namen RechnungNr erhält neuen Wert Run BookmarkRun = (from bm in mainPart.Document.Body.Descendants () where bm.Name == "RechnungNr" select bm).First().NextSibling (); // Rechnungs-Nr in Textmarke eintragen BookmarkRun.Elements ().ElementAt(0).Text = i.ToString();

24 PDF-Dokumente erstellen Mit dem OpenXML SDK nicht möglich iTextSharp ist eine gute Alternative –Open Source –Portierung von iText, 100% C# –Download unter –Das Buch iText in Action von Bruno Lowagie (Manning) bietet sehr guten Einstieg

25 Ein Hallo, Welt mit iTextSharp PDFText.Document pdfDoc = new PDFText.Document(); using (IO.FileStream Fs = new IO.FileStream(PDFPfad, IO.FileMode.Create)) { PDF.PdfWriter pdfWriter = PDF.PdfWriter.GetInstance(pdfDoc, Fs); // Versionsnummer ist natürlich optional pdfWriter.SetPdfVersion(PDF.PdfWriter.PDF_VERSION_1_5); pdfDoc.Open(); pdfDoc.AddAuthor("Pemo"); // erste Zeile mit größerer Schrift PDFText.Font fontPara = new PDFText.Font(PDFText.Font.FontFamily.HELVETICA, (float)20, 0, PDFText.BaseColor.RED); pdfDoc.Add(new PDFText.Paragraph(PDFTextTextBox.GetLineText(0), fontPara)); for (int Zeile = 1; Zeile < PDFTextTextBox.LineCount; Zeile++) pdfDoc.Add(new PDFText.Paragraph(PDFTextTextBox.GetLineText(Zeile))); pdfDoc.Close();

26 Volltextsuche mit Lucene.NET Portierung aus der Java-Welt Sehr gute Performance Leichte Programmierung Dokumente müssen im Text-Format vorliegen –Bzw. es wird generell nur Text indiziert Für PDF-Dateien wird ein "Helfer" benötigt (z.B. Aspose PDF.Kit) Buchtipp: Lucene in Action (Manning)

27 Zusammenfassung OpenXML SDK 2.0 ist der Schlüssel zur Office-Dokumentautomatisierung Sehr gute Performance, sehr gutes Objektmodell, optimal für Server- Anwendungen Reverse engineering" vorhandener Dokumente mit OpenXmlSdkTool.exe Für das Rendering werden im Allgemeinen kommerzielle Komponenten (z.B. Tx Text Control) benötigt)

28 Ressourcen (neu)http://blogs.msdn.com/b/officedevdocs/ Code-Snippets für VS 2010 Hilfedatei aus dem Open XML SDK Open XML Hands on Lab (noch auf Version 1.0 bezogen) Die Beispiele zu diesem Vortrag Verschiedene Webcasts von Jens Häupel –http://blogs.msdn.com/b/jensha/

29 Vielen Dank! Noch Fragen? Bitte den Bewertungsbogen ausfüllen


Herunterladen ppt "Peter Monadjemi | ActiveTraining Office-Dokumente mit dem OpenXML SDK erstellen."

Ähnliche Präsentationen


Google-Anzeigen