Compartir a través de


Extraer estilos de un documento de procesamiento de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para extraer mediante programación la parte styles o stylesWithEffects de un documento de procesamiento de texto a una instancia de XDocument . Contiene un ejemplo del método ExtractStylesPart para ilustrar esta tarea.


Método ExtractStylesPart

Puede usar el método de ejemplo ExtractStylesPart para recuperar una instancia XDocument que contenga la parte styles o stylesWithEffects para un documento de Microsoft Word 2010 o Microsoft Word 2013. Tenga en cuenta que en un documento creado en Word 2010, solo habrá una sola parte styles; Word 2013 agrega una segunda parte stylesWithEffects. Para proporcionar un documento de "recorrido de ida y vuelta" de Word 2013 a Word 2010 y al revés, Word 2013 conserva la parte styles original y la parte styles nueva. (La especificación de formatos de archivo Office Open XML requiere que Microsoft Word ignore cualquier elemento que no reconozca; Word 2010 no detecta la parte stylesWithEffects que Word 2013 agrega al documento.) El usuario (y su aplicación) debe interpretar los resultados de la recuperación de la parte styles o stylesWithEffects.

El procedimiento ExtractStylesPart acepta dos parámetros: el primer parámetro contiene una cadena que indica la ruta de acceso al archivo desde el que desea extraer estilos y el segundo indica si desea recuperar la parte styles o la parte stylesWithEffects más reciente (básicamente, debe llamar este procedimiento dos veces para documentos de Word 2013, con lo que cada uno recupera la parte). El procedimiento devuelve una instancia de XDocument que contiene la parte styles o stylesWithEffects completa que ha solicitado, con toda la información de estilo para el documento (o una referencia nula, si el elemento que ha solicitado no existe).

    public static XDocument ExtractStylesPart(
      string fileName,
      bool getStylesWithEffectsPart = true)

Encontrará el listado completo de códigos para el método en la sección Código de ejemplo.


Llamar al método de ejemplo

Para llamar al método de ejemplo, pase una cadena para el primer parámetro que contiene el nombre del archivo del documento del que se van a extraer los estilos y un booleano para el segundo parámetro que especifica si el tipo de elemento que va a recuperar es la parte styleWithEffects (true) o la parte styles (false). El código de ejemplo siguiente muestra un ejemplo. Cuando tenga la instancia de XDocument podrá hacer lo que quiera con ella; en el código de ejemplo siguiente el contenido de la instancia de XDocument aparece en la consola.

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

Funcionamiento del código

El código empieza creando una variable llamada styles que devolverá el método antes de que exista.

    // Declare a variable to hold the XDocument.
    XDocument styles = null;
    // Code removed here...
    // Return the XDocument instance.
    return styles;

El código continúa abriendo el documento mediante el método Open e indicando que el documento debe abrirse para acceso de solo lectura (el parámetro falso final. Dado el documento abierto, el código usa la propiedad MainDocumentPart para navegar a la parte principal del documento y, a continuación, prepara una variable denominada stylesPart para contener una referencia a la parte styles.

    // 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...
    }

Buscar el elemento Estilos correcto

El código, a continuación, recupera una referencia a la parte styles solicitada mediante el parámetro booleano getStylesWithEffectsPart. Basándose en este valor, el código recupera una propiedad específica de la variable docPart y la almacena en la variable stylesPart.

    if (getStylesWithEffectsPart)
        stylesPart = docPart.StylesWithEffectsPart;
    else
        stylesPart = docPart.StyleDefinitionsPart;

Recuperar el contenido del elemento

Si la parte styles solicitada existe, el código debe devolver el contenido de la parte en una instancia de XDocument. Cada elemento proporciona un método GetStream , que devuelve un objeto Stream. El código pasa la instancia de Stream al método XmlNodeReader.Create y, a continuación, llama al método XDocument.Load , pasando XmlNodeReader como 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 ejemplo

A continuación, se incluye el código de ejemplo completo ExtractStylesPart en C# y 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;
}

Vea también