Freigeben über


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 ISO/IEC 29500 definiert wird. 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 instanziieren, wie in der folgenden using Anweisung gezeigt. In derselben Anweisung öffnen Sie das Textverarbeitungsdateidokument mithilfe der Open -Methode, wobei der boolesche Parameter auf true festgelegt ist, um die Bearbeitung des Dokuments zu ermöglichen.

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))

Mit v3.0.0 und höher wurde die Close() -Methode entfernt, um sich auf die using-Anweisung zu verlassen. Dadurch wird sichergestellt, dass die Dispose() -Methode automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird. Da die WordprocessingDocument -Klasse im Open XML SDK das Objekt als Teil der IDisposable Implementierung automatisch speichert und schließt und da Dispose() automatisch aufgerufen wird, wenn Sie den Block beenden, müssen Sie oder Dispose() nicht explizit aufrufenSave(), solange Sie eine using -Anweisung 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 Entwurf und dann auf Designs. Das Pulldownmenü Designs wird geöffnet. Klicken Sie auf das Designsymbol, um eines der integrierten Designs auszuwählen und es auf das Word Dokument anzuwenden. 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 Farb-, Schriftart- und Formatschemas. 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 ein Design die Schriftart, Farben, Hintergründe, Füllungen und Effekte für verschiedene Objekte in einer Präsentation beeinflussen kann. Ende des Beispiels]

© ISO/IEC 29500: 2016

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 ist das Element, das die im Design definierte Standard Formatierung enthält. Die anderen Teile stellen Außerkraftsetzungen, Standardwerte und Ergänzungen der in themeElementsenthaltenen Informationen bereit. Der komplexe Typ, der ein Design definiert, CT_OfficeStyleSheetwird 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 enthält auch einen CT_OfficeArtExtensionList, der für die zukünftige Erweiterbarkeit dieses komplexen Typs verwendet wird.

Funktionsweise des Beispielcodes

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

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
    if (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);

Anschließend können Sie ein neues ThemePart -Objekt hinzufügen und es dem MainDocumentPart -Objekt hinzufügen. Anschließend fügen Sie Inhalt hinzu, indem Sie ein StreamReader - und StreamWriter -Objekt verwenden, um das Design aus dem 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 -Methode ReplaceTheme aufzurufen, können Sie das folgende Aufrufbeispiel verwenden, um das Design aus der Datei und arg[1] in die Datei zu kopieren, die sich unter befindet. arg[0]

string document = args[0];
string themeFile = args[1];

ReplaceTheme(document, themeFile);

Nachdem Sie das Programm ausgeführt haben, öffnen Sie die Word Datei, und beachten Sie die neuen Designänderungen.

Nachstehend ist der vollständige Beispielcode in C# und Visual Basic aufgeführt.

// 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?.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());
        }
    }
}

Siehe auch