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 die Formatvorlagen oder stylesWithEffects-Komponente für ein Microsoft Word 2010- oder Microsoft Word 2013 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 vom Word 2013 bis Word 2010 und zurück für das "Roundtripping" 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 StylesWithEffects-Teil, 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 und jedes Teil abrufen). Die Prozedur gibt eine XDocument-instance zurück, die 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).
public static XDocument ExtractStylesPart(
string fileName,
bool 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 das XDocument-instance können Sie damit tun, was Sie möchten. Im folgenden Beispielcode wird der Inhalt des XDocument-instance in der Konsole angezeigt.
string filename = @"C:\Users\Public\Documents\StylesFrom.docx";
// Retrieve the StylesWithEffects part. You could pass false in the
// second parameter to retrieve the Styles part instead.
var styles = ExtractStylesPart(filename, true);
// If the part was retrieved, send the contents to the console.
if (styles != null)
Console.WriteLine(styles.ToString());
Funktionsweise des Codes
Der Code erstellt zunächst eine Variable mit dem Namen Styles , die die Methode vor dem Beenden zurückgibt.
// Declare a variable to hold the XDocument.
XDocument styles = null;
// Code removed here...
// Return the XDocument instance.
return styles;
Der Code wird fortgesetzt, indem das Dokument mit der Open-Methode geöffnet wird und angibt, dass das Dokument für schreibgeschützten Zugriff geöffnet sein soll (der endgültige 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, um einen Verweis auf den Formatvorlagenteil zu enthalten.
// 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;
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart stylesPart = null;
// Code removed here...
}
Suchen des richtigen Formatvorlagenteils
Als Nächstes ruft der Code mithilfe des booleschen Parameters getStylesWithEffectsPart einen Verweis auf den angeforderten Stilteil ab. Basierend auf diesem Wert ruft der Code eine bestimmte Eigenschaft der DocPart-Variable ab und speichert sie in der StylesPart-Variablen .
if (getStylesWithEffectsPart)
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 einen Stream zurückgibt. Der Code übergibt die Stream-instance an die XmlNodeReader.Create-Methode und ruft dann die XDocument.Load-Methode auf, wobei xmlNodeReader als Parameter übergeben wird.
// If the part exists, read it into the XDocument.
if (stylesPart != 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;
if (args is [{ } fileName, { } getStyleWithEffectsPart])
{
ExtractStylesPart(fileName, getStyleWithEffectsPart);
}
else if (args is [{ } fileName2])
{
ExtractStylesPart(fileName2);
}
// 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;
using var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read));
// Create the XDocument.
styles = XDocument.Load(reader);
}
// Return the XDocument instance.
return styles;
}