Extrair estilos de um documento de processamento de texto
Este tópico mostra como usar as classes no SDK Open XML para Office para extrair programaticamente os estilos Ou estilosWithEffects parte de um documento de processamento de palavras para uma instância XDocument . Ele contém um método ExtractStylesPart de exemplo para ilustrar essa tarefa.
Método ExtractStylesPart
Você pode usar o método de exemplo ExtractStylesPart para recuperar uma instância XDocument que contém a parte estilos ou stylesWithEffects para um documento Microsoft Word 2010 ou Microsoft Word 2013. Lembre-se de que em um documento criado no Word 2010, haverá apenas uma única parte de estilos; Word 2013 adiciona uma segunda parte stylesWithEffects. Para fornecer para "tropeços redondos" um documento de Word 2013 a Word 2010 e voltar, Word 2013 mantém a parte de estilos original e a parte de novos estilos. (A especificação formatos de arquivo XML do Office Open exige que a Microsoft Word ignorar todas as partes que não reconhece; Word 2010 não percebe a parte stylesWithEffects que Word 2013 adiciona ao documento.) Você (e seu aplicativo) deve interpretar os resultados da recuperação da parte estilos ou estilosWithEffects.
O procedimento ExtractStylesPart aceita dois parâmetros: o primeiro parâmetro contém uma cadeia de caracteres que indica o caminho do arquivo do qual você deseja extrair estilos, e o segundo indica se você deseja recuperar a parte de estilos ou a parte estilos mais recentesWithEffects (basicamente, você deve chamar esse procedimento duas vezes para Word documentos de 2013, recuperando cada parte). O procedimento retorna uma instância XDocument que contém a parte estilos ou estilos completosWithEffects que você solicitou, com todas as informações de estilo do documento (ou uma referência nula, se a parte solicitada não existir).
public static XDocument ExtractStylesPart(
string fileName,
bool getStylesWithEffectsPart = true)
A listagem de código completa para o método pode ser encontrada na seção Código de Exemplo .
Chamando o método de exemplo
Para chamar o método de exemplo, passe uma cadeia de caracteres para o primeiro parâmetro que contém o nome do arquivo do documento do qual extrair os estilos e um booliano para o segundo parâmetro que especifica se o tipo de parte a ser recuperada é a parte styleWithEffects (true) ou a parte de estilos (false). O código de exemplo a seguir mostra um exemplo. Quando você tiver a instância XDocument , poderá fazer o que quiser com ela; no código de exemplo a seguir, o conteúdo da instância XDocument é exibido no console.
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());
Como o código funciona
O código começa criando uma variável chamada estilos que o método retorna antes de sair.
// Declare a variable to hold the XDocument.
XDocument styles = null;
// Code removed here...
// Return the XDocument instance.
return styles;
O código continua abrindo o documento usando o método Open e indicando que o documento deve estar aberto para acesso somente leitura (o parâmetro falso final). Dado o documento aberto, o código usa a propriedade MainDocumentPart para navegar até a parte do documento main e, em seguida, prepara uma variável chamada stylesPart para manter uma referência à parte de estilos.
// 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...
}
Localizar a Parte de Estilos Corretos
O código em seguida recupera uma referência à parte estilos solicitados usando o parâmetro getStylesWithEffectsPart Boolean. Com base nesse valor, o código recupera uma propriedade específica da variável docPart e a armazena na variável stylesPart .
if (getStylesWithEffectsPart)
stylesPart = docPart.StylesWithEffectsPart;
else
stylesPart = docPart.StyleDefinitionsPart;
Recuperar o Conteúdo da Parte
Se a parte de estilos solicitada existir, o código deverá retornar o conteúdo da parte em uma instância XDocument . Cada parte fornece um método GetStream , que retorna um Stream. O código passa a instância stream para o método XmlNodeReader.Create e, em seguida, chama o método XDocument.Load , passando o XmlNodeReader como um parâmetro.
// 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);
}
}
Código de exemplo
A seguir está 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;
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;
}