Compartilhar via


Extrair estilos de um documento de processamento de texto

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para extrair programaticamente os estilos ou estilosComeça a parte De um documento de processamento de palavras para uma XDocument instância. Contém um método de exemplo ExtractStylesPart para ilustrar esta tarefa.


Método ExtractStylesPart

Pode utilizar o ExtractStylesPart método de exemplo para obter uma XDocument instância que contém a parte estilos ou estilosWithEffects de um documento do Microsoft Word. Tenha em atenção que, num documento criado no Word 2010, haverá apenas uma única parte de estilos; Word 2013+ adiciona uma segunda parte stylesWithEffects. Para fornecer um documento de "round-tripping" de Word 2013+ a Word 2010 e posterior, Word 2013+ mantém a parte dos estilos originais e a parte dos novos estilos. (A especificação Formatos de Ficheiro Open XML do Office requer que o Microsoft Word ignorar quaisquer partes que não reconheça; Word 2010 não repara na parte stylesWithEffects que Word 2013+ adiciona ao documento.) O utilizador (e a sua aplicação) têm de interpretar os resultados da obtenção da parte estilos ou estilosWithEffects.

O ExtractStylesPart procedimento aceita dois parâmetros: o primeiro parâmetro contém uma cadeia que indica o caminho do ficheiro a partir do qual pretende extrair estilos e o segundo indica se pretende obter a parte de estilos ou a parte estilos mais recentesWithEffects (basicamente, tem de chamar este procedimento duas vezes para documentos do Word 2013 ou superior, obtendo cada parte). O procedimento devolve uma XDocument instância que contém a parte completa de estilos ou estilosWithEffects que pediu, com todas as informações de estilo do documento (ou uma referência nula, se a parte pedida não existir).

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

A listagem de código completa para o método pode ser encontrada na secção Código de Exemplo .


Chamar o Método de Exemplo

Para chamar o método de exemplo, transmita uma cadeia para o primeiro parâmetro que contém o nome de ficheiro do documento a partir do qual extrair os estilos e um Booleano para o segundo parâmetro que especifica se o tipo de peça a obter é a parte styleWithEffects (true) ou a parte de estilos (false). O código de exemplo seguinte mostra um exemplo. Quando tiver a XDocument instância, pode fazer o que quiser com a mesma; no seguinte código de exemplo, o conteúdo da XDocument instância é apresentado na consola do .

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

Como Funciona o Código

O código começa por criar uma variável com o nome styles para conter o valor devolvido do método . O código continua ao abrir o documento utilizando o Open método e indicando que o documento deve estar aberto para acesso só de leitura (o parâmetro falso final). Dado o documento aberto, o código utiliza a MainDocumentPart propriedade para navegar para a parte main documento e, em seguida, prepara uma variável com o nome stylesPart para conter uma referência à parte estilos.

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

Localizar a Peça Estilos Corretos

Em seguida, o código obtém uma referência à parte dos estilos pedidos com o getStylesWithEffectsPartBoolean parâmetro . Com base neste valor, o código obtém uma propriedade específica da docPart variável e armazena-a na stylesPart variável .

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

Obter o Conteúdo da Peça

Se a parte de estilos pedidos existir, o código tem de devolver o conteúdo da peça numa XDocument instância. Cada parte fornece um GetStream() método, que devolve um Stream. O código transmite a instância Stream para o Create método e, em seguida, chama o Load método , transmitindo o XmlNodeReader como um parâmetro.

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

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

Código de exemplo

Segue-se o exemplo completo de código ExtractStylesPart em C# e 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;
}

Confira também