Поделиться через


Извлечение стилей из документа обработки текста

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного извлечения элементов styles или stylesWithEffects из текстового документа в XDocument экземпляр. Он содержит пример ExtractStylesPart метода для иллюстрации этой задачи.


Метод ExtractStylesPart

Пример метода можно использовать ExtractStylesPart для получения экземпляраXDocument, содержащего часть styles или stylesWithEffects для документа Microsoft Word. Имейте в виду, что в документе, созданном в Word 2010 году, будет только одна часть стилей; Word 2013+ добавляет вторую часть stylesWithEffects. Для обеспечения кругового пути документа с Word 2013 по Word 2010 и обратно, Word 2013+ поддерживает как часть исходных стилей, так и новые стили. (Спецификация форматов файлов Open XML в Office требует, чтобы корпорация Майкрософт Word игнорировать все части, которые она не распознает. Word 2010 не замечает часть stylesWithEffects, добавленную в документ Word 2013 и более поздних версий.) Вам (и вашему приложению) необходимо интерпретировать результаты получения элементов styles или stylesWithEffects.

Процедура ExtractStylesPart принимает два параметра: первый параметр содержит строку, указывающую путь к файлу, из которого требуется извлечь стили, а второй указывает, хотите ли вы получить часть стилей или более новую часть stylesWithEffects (в основном эту процедуру необходимо вызвать два раза для документов Word 2013 и более поздних версий, извлекая каждую часть). Процедура возвращает XDocument экземпляр, содержащий полную часть стилей или стилейWithEffects, запрошенную вами, со всеми сведениями о стиле для документа (или пустой ссылкой, если запрошенная часть не существует).

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

Полный листинг кода метода можно найти в разделе Пример кода.


Вызов примера метода

Чтобы вызвать метод примера, передайте строку для первого параметра, содержащего имя файла документа, из которого извлекаются стили, и логическое значение для второго параметра, указывающего, является ли извлекаемая частью styleWithEffects (true) или частью стилей (false). Следующий код показывает пример использования: При наличии экземпляра XDocument с ним можно выполнять все необходимое. В следующем примере кода содержимое XDocument экземпляра отображается в консоли.

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

Принципы работы кода

Код начинается с создания переменной с именем styles , содержащей возвращаемое значение для метода . Код продолжается, открывая документ с помощью Open метода и указывая, что документ должен быть открыт для доступа только для чтения (последний параметр false). При открытии документа код использует MainDocumentPart свойство для перехода к части документа main, а затем подготавливает переменную с именем stylesPart для хранения ссылки на часть стилей.

// 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;

Поиск части "Правильные стили"

Затем код получает ссылку на часть запрошенных стилей с помощью getStylesWithEffectsPartBoolean параметра . На основе этого значения код получает определенное свойство переменной docPart и сохраняет его в переменной stylesPart .

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

Получение содержимого части

Если запрошенная часть стилей существует, код должен возвращать содержимое части в экземпляре XDocument . Каждая часть предоставляет GetStream() метод , который возвращает Stream. Код передает экземпляр Stream методуCreate, а затем вызывает Load метод , передавая в XmlNodeReader качестве параметра .

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

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

Пример кода

Ниже приведен полный пример кода ExtractStylesPart на C# и 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;
}

См. также