Freigeben über


Extrahieren von Formatvorlagen aus einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um die Formatvorlagen oder stylesWithEffects-Teile programmgesteuert aus einem Textverarbeitungsdokument in ein XDocument instance zu extrahieren. Sie enthält eine Beispielmethode ExtractStylesPart zur Veranschaulichung dieser Aufgabe.


ExtractStylesPart-Methode

Sie können die ExtractStylesPart Beispielmethode verwenden, um eine XDocument instance abzurufen, die den Styles- oder stylesWithEffects-Teil für ein Microsoft Word-Dokument enthält. Beachten Sie, dass in einem Dokument, das in Word 2010 erstellt wurde, nur ein einzelner Formatvorlagenteil vorhanden ist. Word 2013+ fügt eine zweite StylesWithEffects-Komponente hinzu. Um ein Dokument von Word 2013+ bis Word 2010 und zurück bereitzustellen, behält Word 2013+ sowohl den ursprünglichen 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.) Sie (und Ihre Anwendung) müssen die Ergebnisse des Abrufens der Styles oder stylesWithEffects-Komponente interpretieren.

Die ExtractStylesPart Prozedur akzeptiert zwei Parameter: Der erste Parameter enthält eine Zeichenfolge, die den Pfad der Datei angibt, aus der Sie Formatvorlagen extrahieren möchten, und der zweite gibt an, ob Sie den Formatvorlagenteil abrufen möchten, oder den neueren StylesWithEffects-Teil (im Grunde müssen Sie diese Prozedur zweimal für Word 2013+ Dokumente aufrufen, wobei jedes Teil abgerufen wird). Die Prozedur gibt einen XDocument instance zurück, der die vollständigen formatvorlagen oder stylesWithEffects-Teile enthält, die Sie angefordert haben, mit allen Formatvorlageninformationen für das Dokument (oder einem NULL-Verweis, wenn der angeforderte Teil nicht vorhanden ist).

static XDocument? ExtractStylesPart(string fileName, string getStylesWithEffectsPart = "true")

Den vollständigen Codeeintrag für die Methode finden Sie im Abschnitt Beispielcode.


Aufrufen der Beispielmethode

Um die Beispielmethode aufzurufen, übergeben Sie eine Zeichenfolge für den ersten Parameter, der den Dateinamen des Dokuments enthält, aus dem die Formatvorlagen extrahiert werden sollen, und einen Booleschen Wert für den zweiten Parameter, der angibt, ob der Typ des abzurufenden Teils der styleWithEffects-Teil (true) oder der Formatvorlagenteil (false) ist. Der folgende Code zeigt ein Beispiel. Wenn Sie über die XDocument instance können Sie damit tun, was Sie möchten. Im folgenden Beispielcode wird der Inhalt der XDocument instance in der Konsole angezeigt.

if (args is [{ } fileName, { } getStyleWithEffectsPart])
{
    var styles = ExtractStylesPart(fileName, getStyleWithEffectsPart);

    if (styles is not null)
    {
        Console.WriteLine(styles.ToString());
    }
}
else if (args is [{ } fileName2])
{
    var styles = ExtractStylesPart(fileName2);

    if (styles is not null)
    {
        Console.WriteLine(styles.ToString());
    }
}

Funktionsweise des Codes

Der Code erstellt zunächst eine Variable mit dem Namen styles , die den Rückgabewert für die -Methode enthält. Der Code fährt fort, indem das Dokument mit der Open -Methode geöffnet wird und angibt, dass das Dokument für den schreibgeschützten Zugriff geöffnet sein soll (der letzte false-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.

// 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))
{
    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 -Parameters einen Verweis auf den getStylesWithEffectsPartBoolean angeforderten Formatvorlagenteil ab. Basierend auf diesem Wert ruft der Code eine bestimmte Eigenschaft der docPart Variablen ab und speichert sie in der stylesPart Variablen.

if (getStylesWithEffectsPart.ToLower() == "true")
{
    stylesPart = docPart.StylesWithEffectsPart;
}
else
{
    stylesPart = docPart.StyleDefinitionsPart;
}

Abrufen des Teileinhalts

Wenn der angeforderte Formatvorlagenteil vorhanden ist, muss der Code den Inhalt des Teils in einem XDocument instance zurückgeben. Jeder Teil stellt eine GetStream() -Methode bereit, die eine Stream zurückgibt. Der Code übergibt die Stream instance an die Create -Methode und ruft dann die Load -Methode auf, wobei der XmlNodeReader als Parameter übergeben wird.

if (stylesPart is not null)
{
    using var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read));

    // Create the XDocument.
    styles = XDocument.Load(reader);
}

Beispielcode

Im Folgenden finden Sie das vollständige ExtractStylesPart-Codebeispiel in C# und Visual Basic.

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


// Extract the styles or stylesWithEffects part from a 
// word processing document as an XDocument instance.
static XDocument? ExtractStylesPart(string fileName, string 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))
    {
        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 (getStylesWithEffectsPart.ToLower() == "true")
        {
            stylesPart = docPart.StylesWithEffectsPart;
        }
        else
        {
            stylesPart = docPart.StyleDefinitionsPart;
        }

        if (stylesPart is not null)
        {
            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