Ersetzen des Designteils in einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um einen Dokumentteil in einem Textverarbeitungsdokument programmgesteuert zu ersetzen.

Pakete und Dokumentteile

Ein Open XML-Dokument wird als Paket gespeichert, dessen Format durch die Spezifikation ISO/IEC 29500-2 definiert ist. Das Paket kann mehrere Teile enthalten, die untereinander in Beziehung stehen. Durch die Beziehung zwischen den Teilen wird die Kategorie des Dokuments gesteuert. Ein Dokument kann als Textverarbeitungsdokument definiert sein, falls sein Paketbeziehungselement eine Beziehung zu einem Hauptdokumentteil besitzt. Falls das Paketbeziehungselement eine Beziehung zu einem Präsentationsteil hat, kann es als Präsentationsdokument definiert sein. Falls das Paketbeziehungselement eine Beziehung zu einem Arbeitsmappenteil hat, ist es als Tabellenkalkulationsdokument definiert. In diesem Thema vom Typ "Gewusst wie" wird ein Textverarbeitungsdokument-Paket verwendet.

Abrufen eines WordprocessingDocument-Objekts

Im Beispielcode öffnen Sie zunächst die Textverarbeitungsdatei, indem Sie die WordprocessingDocument -Klasse wie in der folgenden using-Anweisung gezeigt instanziieren. Sie öffnen in der gleichen Anweisung die Textverarbeitungsdatei document mithilfe der Open-Methode, wobei der boolesche Parameter auf true festgelegt ist, um die Bearbeitung des Dokuments zu aktivieren.

    using (WordprocessingDocument wordDoc = 
            WordprocessingDocument.Open(document, true))
    {
        // Insert other code here.
    }

Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Mit dieser wird sichergestellt, dass die Dispose-Methode (interne vom Open XML SDK zum Bereinigen von Ressourcen verwendete Methode) automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, legt einen Bereich für das Objekt fest, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall wordDoc. Da die WordprocessingDocument-Klasse des Open XML SDK automatisch das Objekt als Teil der System.IDisposable-Implementierung speichert und schließt, und da Dispose automatisch beim Beenden des Blocks aufruft, müssen Sie nicht explizit Speichern und Schließen aufrufen, solange Sie using verwenden.

So ändern Sie das Design in einem Word-Paket

Wenn Sie das Design in einem Word-Dokument ändern möchten, klicken Sie auf das Menüband Seitenlayout und dann auf Designs. Das Pulldownmenü Designs wird geöffnet. Wenn Sie eins der integrierten Designs auswählen und auf das Word-Dokument anwenden möchten, klicken Sie auf das Designsymbol. Sie können auch die Option Nach Designs suchen verwenden, um eine Designdatei auf Ihrem Computer zu suchen und anzuwenden.

Die Struktur des Designelements

Das Designelement besteht aus Schemata für Farbe, Schriftart und Format. In diesem Thema vom Typ "Gewusst wie" erfahren Sie, wie Sie das Design programmgesteuert ändern können. Daher sollten Sie das Designelement kennenlernen. Die folgenden Informationen aus der SPEZIFIKATION ISO/IEC 29500 können bei der Arbeit mit diesem Element nützlich sein.

Dieses Element definiert den komplexen Typ auf Stammebene, der einem freigegebenen Stylesheet (oder Design) zugeordnet ist. Es enthält alle verschiedenen Formatierungsoptionen, die für ein Dokument über ein Design verfügbar sind, und es definiert das gesamte Aussehen und Verhalten des Dokuments, wenn Objekte mit Designs innerhalb des Dokuments verwendet werden.

[Beispiel: Betrachten Sie die folgende Abbildung als Beispiel für verschiedene Designs, die auf eine Präsentation angewendet werden. In diesem Beispiel können Sie sehen, wie sich ein Design auf Schriftart, Farben, Hintergründe, Füllungen und Effekte für verschiedene Objekte in einer Präsentation auswirken kann. Ende des Beispiels]

Designbeispiel In diesem Beispiel wird gezeigt, wie sich ein Design auf Schriftart, Farben, Hintergründe, Füllungen und Effekte für verschiedene Objekte in einer Präsentation auswirken kann. Ende des Beispiels]

© ISO/IEC29500: 2008.

In der folgenden Tabelle sind die möglichen untergeordneten Typen der Theme-Klasse aufgeführt.

PresentationML-Element Open XML SDK-Klasse Beschreibung
custClrLst CustomColorList Benutzerdefinierte Farbliste
extLst ExtensionList Erweiterungsliste
extraClrSchemeLst ExtraColorSchemeList Liste zusätzlicher Farbschemata
objectDefaults ObjectDefaults Objektstandardwerte
themeElements ThemeElements Designelemente

Das folgende XML-Schemafragment definiert vier Teile des Designelements. Das themeElements-Element enthält die wichtigste Formatierung, die innerhalb des Designs definiert ist. Die anderen Teile stellen Überschreibungen, Standardwerte und Ergänzungen zu den Informationen in themeElements bereit. Der komplexe Typ, der ein Design definiert, CT_OfficeStyleSheet, wird wie folgt definiert:

    <complexType name="CT_OfficeStyleSheet">
       <sequence>
           <element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/>
           <element name="objectDefaults" type="CT_ObjectStyleDefaults" minOccurs="0" maxOccurs="1"/>
           <element name="extraClrSchemeLst" type="CT_ColorSchemeList" minOccurs="0" maxOccurs="1"/>
           <element name="custClrLst" type="CT_CustomColorList" minOccurs="0" maxOccurs="1"/>
           <element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
       </sequence>
       <attribute name="name" type="xsd:string" use="optional" default=""/>
    </complexType>

Dieser komplexe Typ umfasst auch ein CT_OfficeArtExtensionList-Element, das für die zukünftige Erweiterbarkeit dieses komplexen Typs verwendet wird.

Funktionsweise des Beispielcodes

Nach dem Öffnen der Datei können Sie mainDocumentPart im wordDoc-Objekt instanziieren und den alten Designteil löschen.

    public static void ReplaceTheme(string document, string themeFile)
    {
        using (WordprocessingDocument wordDoc =
            WordprocessingDocument.Open(document, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;

            // Delete the old document part.
            mainPart.DeletePart(mainPart.ThemePart);

Anschließend können Sie ein neues ThemePart-Objekt erstellen und es dem MainDocumentPart-Objekt hinzufügen. Dann fügen Sie Inhalt mithilfe eines StreamReader- und StreamWriter-Objekts hinzu, um das Design aus themeFile in das ThemePart-Objekt zu kopieren.

    // Add a new document part and then add content.
    ThemePart themePart = mainPart.AddNewPart<ThemePart>();

    using (StreamReader streamReader = new StreamReader(themeFile))
    using (StreamWriter streamWriter =
        new StreamWriter(themePart.GetStream(FileMode.Create)))
    {
        streamWriter.Write(streamReader.ReadToEnd());
    }

Beispielcode

Im folgenden Codebeispiel wird gezeigt, wie Sie den Designdokumentteil in einem Textverarbeitungsdokument durch den Designteil aus einem anderen Paket ersetzen. Die als zweites Argument übergebene Designdatei muss ein gültiger Designteil im XML-Format sein (z. B. Theme1.xml). Sie können diesen Teil aus einem vorhandenen Dokument oder einer vorhandenen Designdatei (. THMX), das in eine .Zip Datei umbenannt wurde. Um die ReplaceTheme-Methode aufzurufen, können Sie das folgende Aufrufbeispiel verwenden, um das Design aus der Datei "Theme1.xml" in die Datei "MyPkg7.docx" zu kopieren.

    string document = @"C:\Users\Public\Documents\\MyPkg7.docx";
    string themeFile = @"C:\Users\Public\Documents\Theme1.xml";
    ReplaceTheme(document, themeFile);

Nach Ausführung des Programms können Sie die Word-Datei öffnen und die geänderte Schriftart anzeigen.

Es folgt der vollständige Beispielcode in C# und Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;

ReplaceTheme(args[0], args[1]);

// This method can be used to replace the theme part in a package.
static void ReplaceTheme(string document, string themeFile)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        if (wordDoc.MainDocumentPart is null || wordDoc.MainDocumentPart.Document.Body is null || wordDoc.MainDocumentPart.ThemePart is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
        }

        MainDocumentPart mainPart = wordDoc.MainDocumentPart;

        // Delete the old document part.
        mainPart.DeletePart(mainPart.ThemePart);

        // Add a new document part and then add content.
        ThemePart themePart = mainPart.AddNewPart<ThemePart>();

        using (StreamReader streamReader = new StreamReader(themeFile))
        using (StreamWriter streamWriter = new StreamWriter(themePart.GetStream(FileMode.Create)))
        {
            streamWriter.Write(streamReader.ReadToEnd());
        }
    }
}