Freigeben über


Ersetzen der Formate-Parts in einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um die Formatvorlagen in einem Textverarbeitungsdokument programmgesteuert durch die Formatvorlagen aus einem anderen Textverarbeitungsdokument zu ersetzen. Es enthält eine Beispielmethode ReplaceStyles zur Veranschaulichung dieser Aufgabe sowie die ReplaceStylesPart unterstützenden Methoden und ExtractStylesPart .


Informationen zu Formatvorlagenspeicher

Ein Textverarbeitungsdokumentpaket, z. B. eine Datei mit einer .docx Erweiterung, ist tatsächlich eine .zip Datei, die aus mehreren Teilen besteht. Sie können sich jeden Teil ähnlich wie eine externe Datei vorstellen. Ein Teil hat einen bestimmten Inhaltstyp und kann je nach Typ Inhalte enthalten, die dem Inhalt einer externen XML-Datei, Binärdatei, Bilddatei usw. entsprechen. Der Standard, der definiert, wie Open XML-Dokumente in ZIP-Dateien gespeichert werden, wird als Open Packaging Convention bezeichnet. Weitere Informationen über die Open Packaging Conventions finden Sie unter ISO/IEC 29500-2.

Formatvorlagen werden in dedizierten Teilen in einem Textverarbeitungsdokumentpaket gespeichert. Ein Microsoft Word 2010 Dokument enthält einen einzelnen Formatvorlagenteil. In höheren Versionen von Microsoft Word einen zweiten StylesWithEffects-Teil hinzugefügt. Die folgende Abbildung aus dem Document Explorer im Open XML SDK Productivity Tool für Microsoft Office zeigt die Dokumentteile in einem Beispiel Word Dokument ab 2013, das Formatvorlagen enthält.

Abbildung 1: Formatvorlagenteile in einem Textverarbeitungsdokument

Formate-Parts in einem Textverarbeitungsdokument.

Um ein Dokument vom Word 2013+ bis Word 2010 und zurück bereitzustellen, behält Word 2013+ sowohl den ursprünglichen Stilteil als auch den neuen Formatvorlagenteil bei. (Die Office Open XML-Dateiformatspezifikation erfordert, dass Microsoft Word alle Teile ignorieren, die es nicht erkennt; Word 2010 bemerkt nicht den Teil stylesWithEffects, der Word 2013+ dem Dokument hinzufügt.)

Das in diesem Thema bereitgestellte Codebeispiel kann verwendet werden, um diese Stilteile zu ersetzen.


ReplaceStyles-Methode

Sie können die ReplaceStyles Beispielmethode verwenden, um die Formatvorlagen in einem Textverarbeitungsdokument durch die Formatvorlagen in einem anderen Textverarbeitungsdokument zu ersetzen. Die ReplaceStyles -Methode akzeptiert zwei Parameter: Der erste Parameter enthält eine Zeichenfolge, die den Pfad der Datei angibt, die die zu extrahierenden Formatvorlagen enthält. Der zweite Parameter enthält eine Zeichenfolge, die den Pfad der Datei angibt, in die die Formatvorlagen kopiert werden sollen, wodurch die Formatvorlagen vollständig ersetzt werden.

static void ReplaceStyles(string fromDoc, string toDoc)

Die vollständige Codeauflistung für die ReplaceStyles Methode und ihre unterstützenden Methoden finden Sie im Abschnitt Beispielcode .


Aufrufen der Beispielmethode

Um die Beispielmethode aufzurufen, übergeben Sie eine Zeichenfolge für den ersten Parameter, der den Pfad der Datei mit den zu extrahierenden Formatvorlagen angibt, und eine Zeichenfolge für den zweiten Parameter, der den Pfad zu der Datei darstellt, in der die Formatvorlagen ersetzt werden sollen. Der folgende Code zeigt ein Beispiel. Wenn die Ausführung des Codes abgeschlossen ist, werden die Formatvorlagen im Zieldokument ersetzt, und folglich spiegelt die Darstellung des Texts im Dokument die neuen Formatvorlagen wider.

string fromDoc = args[0];
string toDoc = args[1];

ReplaceStyles(fromDoc, toDoc);

Funktionsweise des Codes

Der Code extrahiert und ersetzt zuerst den Formatvorlagenteil und dann den stylesWithEffects-Teil zweiten, und er basiert auf zwei unterstützenden Methoden, um den Großteil der Arbeit zu erledigen. Die ExtractStylesPart -Methode hat die Aufgabe, den Inhalt der Styles oder stylesWithEffects-Komponente zu extrahieren und in einem -Objekt zu XDocument platzieren. Die ReplaceStylesPart -Methode verwendet das von ExtractStylesPart erstellte -Objekt und verwendet seinen Inhalt, um die Styles oder stylesWithEffects-Komponente im Zieldokument zu ersetzen.

// Extract and replace the styles part.
XDocument? node = ExtractStylesPart(fromDoc, false);

if (node is not null)
{
    ReplaceStylesPart(toDoc, node, false);
}

Der letzte Parameter in der Signatur für die ExtractStylesPart -Methode oder die ReplaceStylesPart -Methode bestimmt, ob der Stilteil oder der StylesWithEffects-Teil verwendet wird. Der Wert false gibt an, dass Sie den Formatvorlagenteil extrahieren und ersetzen möchten. Das Fehlen eines Werts (der Parameter ist optional) oder der Wert true (Standard) bedeutet, dass Sie den StylesWithEffects-Teil extrahieren und ersetzen möchten.

// Extract and replace the stylesWithEffects part. To fully support 
// round-tripping from Word 2010 to Word 2007, you should 
// replace this part, as well.
node = ExtractStylesPart(fromDoc);

if (node is not null)
{
    ReplaceStylesPart(toDoc, node);
}

return;

Weitere Informationen zur ExtractStylesPart -Methode finden Sie im zugeordneten Beispiel. Im folgenden Abschnitt wird die ReplaceStylesPart -Methode erläutert.


ReplaceStylesPart-Methode

Die ReplaceStylesPart -Methode kann verwendet werden, um die Formatvorlagen oder styleWithEffects-Teile in einem Dokument zu ersetzen, wenn eine XDocument instance, die denselben Teil für ein dokument Word 2010 oder Word 2013+ enthält (wie im Beispielcode weiter oben in diesem Thema gezeigt, kann die ExtractStylesPart -Methode verwendet werden, um diese instance abzurufen). Die ReplaceStylesPart -Methode akzeptiert drei Parameter: Der erste Parameter enthält eine Zeichenfolge, die den Pfad zu der Datei angibt, die Sie ändern möchten. Der zweite Parameter enthält ein XDocument Objekt, das den Teil styles oder stylesWithEffect aus einem anderen Textverarbeitungsdokument enthält, und der dritte gibt an, ob Sie den Formatvorlagenteil oder den StylesWithEffects-Teil ersetzen möchten (wie im Beispielcode weiter oben in diesem Thema gezeigt, müssen Sie diese Prozedur zweimal für Word Dokumente aus dem Jahr 2013 und höher aufrufen und dabei jeden Teil durch den entsprechenden Teil aus einem Quelldokument ersetzen).

static void ReplaceStylesPart(string fileName, XDocument newStyles, bool setStylesWithEffectsPart = true)

Funktionsweise des ReplaceStylesPart-Codes

Die ReplaceStylesPart -Methode untersucht das von Ihnen angegebene Dokument und sucht nach den Formatvorlagen oder stylesWithEffects-Teil. Wenn das angeforderte Teil vorhanden ist, speichert die Methode das angegebene XDocument im ausgewählten Teil.

Der Code beginnt mit dem Öffnen des Dokuments mithilfe der Open -Methode und gibt an, dass das Dokument für Lese-/Schreibzugriff geöffnet sein soll (der endgültige true Parameter). Angesichts des geöffneten Dokuments verwendet der Code die MainDocumentPart -Eigenschaft, um zum Standard Dokumentteil zu navigieren, und bereitet dann eine Variable namens stylesPart vor, die einen Verweis auf den Formatvorlagenteil enthält.

// Open the document for write access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, true))
{
    if (document.MainDocumentPart is null || (document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null))
    {
        throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
    }

    // Get a reference to the main document part.
    var docPart = document.MainDocumentPart;

    // Assign a reference to the appropriate part to the
    // stylesPart variable.

    StylesPart? stylesPart = null;

Suchen des richtigen Formatvorlagenteils

Der Code ruft als Nächstes mithilfe des booleschen Parameters einen Verweis auf den setStylesWithEffectsPart angeforderten Formatvorlagenteil ab. Basierend auf diesem Wert ruft der Code einen Verweis auf den angeforderten Stilteil ab und speichert ihn in der stylesPart Variablen.

if (setStylesWithEffectsPart)
{
    stylesPart = docPart.StylesWithEffectsPart;
}
else
{
    stylesPart = docPart.StyleDefinitionsPart;
}

Speichern des Teileinhalts

Unter der Annahme, dass der angeforderte Teil vorhanden ist, muss der Code den gesamten Inhalt der XDocument an die -Methode übergebenen an den Teil speichern. Jeder Teil stellt eine GetStream() -Methode bereit, die eine Streamzurückgibt. Der Code übergibt die Stream instance an den Konstruktor der StreamWriter(Stream) -Klasse und erstellt einen Streamwriter um den Stream des Teils. Schließlich ruft der Code die Save(Stream) -Methode des XDocument auf und speichert dessen Inhalt im Formatvorlagenteil.

// If the part exists, populate it with the new styles.
if (stylesPart is not null)
{
    newStyles.Save(new StreamWriter(stylesPart.GetStream(FileMode.Create, FileAccess.Write)));
}

Beispielcode

Im Folgenden finden Sie die vollständigen ReplaceStylesMethoden , ReplaceStylesPartund ExtractStylesPart in C# und Visual Basic.

// Replace the styles in the "to" document with the styles in
// the "from" document.
static void ReplaceStyles(string fromDoc, string toDoc)
{

    // Extract and replace the styles part.
    XDocument? node = ExtractStylesPart(fromDoc, false);

    if (node is not null)
    {
        ReplaceStylesPart(toDoc, node, false);
    }

    // Extract and replace the stylesWithEffects part. To fully support 
    // round-tripping from Word 2010 to Word 2007, you should 
    // replace this part, as well.
    node = ExtractStylesPart(fromDoc);

    if (node is not null)
    {
        ReplaceStylesPart(toDoc, node);
    }

    return;
}

// Given a file and an XDocument instance that contains the content of 
// a styles or stylesWithEffects part, replace the styles in the file 
// with the styles in the XDocument.

static void ReplaceStylesPart(string fileName, XDocument newStyles, bool setStylesWithEffectsPart = true)
{

    // Open the document for write access and get a reference.
    using (var document = WordprocessingDocument.Open(fileName, true))
    {
        if (document.MainDocumentPart is null || (document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null))
        {
            throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
        }

        // Get a reference to the main document part.
        var docPart = document.MainDocumentPart;

        // Assign a reference to the appropriate part to the
        // stylesPart variable.

        StylesPart? stylesPart = null;

        if (setStylesWithEffectsPart)
        {
            stylesPart = docPart.StylesWithEffectsPart;
        }
        else
        {
            stylesPart = docPart.StyleDefinitionsPart;
        }

        // If the part exists, populate it with the new styles.
        if (stylesPart is not null)
        {
            newStyles.Save(new StreamWriter(stylesPart.GetStream(FileMode.Create, FileAccess.Write)));
        }
    }
}

// Extract the styles or stylesWithEffects part from a 
// word processing document as an XDocument instance.
static XDocument ExtractStylesPart(string fileName, bool getStylesWithEffectsPart = true)
{
    // Declare a variable to hold the XDocument.
    XDocument? styles = null;

    // Open the document for read access and get a reference.
    using (var document = WordprocessingDocument.Open(fileName, false))
    {
        // Get a reference to the main document part.
        var docPart = document.MainDocumentPart;

        if (docPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        // Assign a reference to the appropriate part to the
        // stylesPart variable.
        StylesPart stylesPart;

        if (getStylesWithEffectsPart && docPart.StylesWithEffectsPart is not null)
        {
            stylesPart = docPart.StylesWithEffectsPart;
        }
        else if (docPart.StyleDefinitionsPart is not null)
        {
            stylesPart = docPart.StyleDefinitionsPart;
        }
        else
        {
            throw new ArgumentNullException("StyleWithEffectsPart and StyleDefinitionsPart are undefined");
        }

        using (var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
        {
            // Create the XDocument.
            styles = XDocument.Load(reader);
        }
    }
    // Return the XDocument instance.
    return styles;
}

Siehe auch