Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Peter Monadjemi | ActiveTraining

Ähnliche Präsentationen


Präsentation zum Thema: "Peter Monadjemi | ActiveTraining"—  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 29500 Wird auch von OpenOffice/LibreOffice unterstützt Alles weitere unter

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 OpenXML-Dateien Dokumenteigenschaften

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 version='1.0' encoding='UTF-8'?> <w:document xmlns:w=' <w:body> <w:p> <w:r> <w:rPr> <w:b /> <w:color w:val='FF0000'/> </w:rPr> <w:t>Hallo, Basta! - es ist jetzt " + DateTime.Now.ToShortTimeString() </w:r> </w:p> </w:body> </w:document>"; 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<Paragraph>(); 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<Paragraph> Paras = from p in body.Elements<Paragraph>() select p; foreach (Paragraph p in Paras) { ParaListBox.Items.Add(p.InnerText); } } Abfrage über LINQ Typisierter Zugriff

17 Zugriff auf eine Docx-Datei – Text auslesen
// Alle Absätze holen IEnumerable<Paragraph> AlleParas = wdDoc.MainDocumentPart.Document.Body.Elements<Paragraph>(); foreach (Paragraph p in AlleParas) { IEnumerable<Text> AlleTextElemente = p.Descendants<Text>(); 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<ParagraphStyleId>().Count() > && p.Descendants<ParagraphStyleId>(). 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<BookmarkStart>() where bm.Name == "RechnungNr" select bm).First().NextSibling<Run>(); // Rechnungs-Nr in Textmarke eintragen BookmarkRun.Elements<Text>().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 http://openxmldeveloper.org
(neu) 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

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


Herunterladen ppt "Peter Monadjemi | ActiveTraining"

Ähnliche Präsentationen


Google-Anzeigen