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 getStylesWithEffectsPart
Boolean 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;
}