Share via


Crear un estilo de párrafo y agregarlo a un documento de procesamiento de texto

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para crear y agregar mediante programación un estilo de párrafo a un documento de procesamiento de texto. Contiene un método CreateAndAddParagraphStyle de ejemplo para ilustrar esta tarea, además de un método de ejemplo adicional para agregar la parte styles cuando sea necesario.


Método CreateAndAddParagraphStyle

El método de ejemplo CreateAndAddParagraphStyle se puede usar para agregar estilo a un documento de procesamiento de texto. Primero debe obtener una referencia al elemento de definiciones de estilo en el documento al que desea agregar el estilo. Para obtener más información y consultar un ejemplo de cómo hacerlo, consulte la sección Llamar al método de ejemplo.

El método acepta cuatro parámetros que indican: una referencia al elemento de definiciones de estilo, el identificador de estilo (un identificador interno), el nombre del estilo (para uso externo en la interfaz de usuario) y, opcionalmente, cualquier alias de estilo (nombres alternos para uso en la interfaz de usuario).

    public static void CreateAndAddParagraphStyle(StyleDefinitionsPart styleDefinitionsPart,
        string styleid, string stylename, string aliases="")

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


Acerca de los identificadores de estilo, nombres de estilo y alias

El documento utiliza el identificador de estilo para referirse al estilo y se puede concebir como su identificador principal. Generalmente se usa el identificador de estilo para identificar un estilo en código. Un estilo también puede tener un nombre de visualización independiente en la interfaz de usuario. A menudo, por lo tanto, el nombre de estilo aparece en mayúsculas o minúsculas, según corresponda, con espacio (por ejemplo, Encabezado 1), mientras que el identificador de estilo es más sucinto (por ejemplo, encabezado1) y pensado para uso interno. Los alias especifican nombres de estilo alternativos que puede usar la interfaz de usuario de una aplicación.

Por ejemplo, considere el siguiente ejemplo de código XML tomado de una definición de estilo.

    <w:style w:type="paragraph" w:styleId="OverdueAmountPara" . . .
      <w:aliases w:val="Late Due, Late Amount" />
      <w:name w:val="Overdue Amount Para" />
    . . .
    </w:style>

El atributo styleId del elemento style mantiene el identificador interno principal del estilo, el identificador de estilo (OverdueAmountPara). El elemento alias especifica dos nombres de estilo alternativos, Late Due y Late Amount, separados por comas. Cada nombre debe estar separado por una o más comas. Por último, el elemento nombre especifica el nombre de estilo principal, que es el que se muestra en la interfaz de usuario de una aplicación.


Llamar al método de ejemplo

Use el método de ejemplo CreateAndAddParagraphStyle para crear y agregar un estilo con nombre a un documento de procesamiento de texto mediante el SDK de Open XML. El siguiente ejemplo de código muestra cómo abrir y obtener una referencia a un documento de procesamiento de texto, recuperar una referencia al elemento de definiciones de estilo del documento y, a continuación, llamar al método CreateAndAddParagraphStyle.

Para llamar al método, pase una referencia al elemento de definiciones de estilo como el primer parámetro, el identificador de estilo del estilo como segundo parámetro, el nombre del estilo como tercer parámetro y, opcionalmente, cualquier alias de estilo como cuarto parámetro. Por ejemplo, el siguiente código crea el estilo de párrafo "Overdue Amount Para" en un archivo de ejemplo que se llama CreateAndAddParagraphStyle.docx. También agrega un párrafo de texto y aplica el estilo al párrafo.

    string strDoc = @"C:\Users\Public\Documents\CreateAndAddParagraphStyle.docx";

    using (WordprocessingDocument doc = 
        WordprocessingDocument.Open(strDoc, true))
    {
        // Get the Styles part for this document.
        StyleDefinitionsPart part =
            doc.MainDocumentPart.StyleDefinitionsPart;

        // If the Styles part does not exist, add it and then add the style.
        if (part == null)
        {
            part = AddStylesPartToPackage(doc);
        }

        // Set up a variable to hold the style ID.
        string parastyleid = "OverdueAmountPara";

        // Create and add a paragraph style to the specified styles part 
        // with the specified style ID, style name and aliases.
        CreateAndAddParagraphStyle(part,
            parastyleid,
            "Overdue Amount Para",
            "Late Due, Late Amount");
        
        // Add a paragraph with a run and some text.
        Paragraph p = 
            new Paragraph(
                new Run(
                    new Text("This is some text in a run in a paragraph.")));
        
        // Add the paragraph as a child element of the w:body element.
        doc.MainDocumentPart.Document.Body.AppendChild(p);

        // If the paragraph has no ParagraphProperties object, create one.
        if (p.Elements<ParagraphProperties>().Count() == 0)
        {
            p.PrependChild<ParagraphProperties>(new ParagraphProperties());
        }

        // Get a reference to the ParagraphProperties object.
        ParagraphProperties pPr = p.ParagraphProperties;
        
        // If a ParagraphStyleId object doesn't exist, create one.
        if (pPr.ParagraphStyleId == null)
            pPr.ParagraphStyleId = new ParagraphStyleId();

        // Set the style of the paragraph.
        pPr.ParagraphStyleId.Val = parastyleid;
    }

Tipos de estilo

WordprocessingML admite seis tipos de estilo, cuatro de los cuales puede especificar mediante el atributo de tipo en el elemento style. La siguiente información, de la sección 17.7.4.17 de la especificación ISO/IEC 29500, presenta tipos de estilo.

Tipos de estilo se refiere a la propiedad en un estilo que define el tipo de estilo creado con esta definición de estilo. WordprocessingML admite seis tipos de definiciones de estilo mediante los valores para el atributo de tipo de definición de estilo:

  • Estilos de párrafo

  • Estilos de carácter

  • Estilos vinculados (párrafo + carácter) [Nota: se consigue mediante el elemento de vínculo (§17.7.4.6). fin de nota]

  • Estilos de tabla

  • Estilos de numeración

  • Párrafo predeterminado + propiedades de carácter

Ejemplo: considere un estilo denominado Título 1 en un documento como se indica a continuación:

    <w:style w:type="paragraph" w:styleId="Heading1">
      <w:name w:val="heading 1"/>
      <w:basedOn w:val="Normal"/>
      <w:next w:val="Normal"/>
      <w:link w:val="Heading1Char"/>
      <w:uiPriority w:val="1"/>
      <w:qformat/>
      <w:rsid w:val="00F303CE"/>
      …
    </w:style>

El atributo de tipo tiene un valor de párrafo, que indica que la siguiente definición de estilo es un estilo de párrafo.

© ISO/IEC29500: 2008.

Puede establecer los tipos de estilo de párrafo, carácter, tabla y numeración especificando el valor correspondiente en el atributo de tipo del elemento de estilo.


Tipo de estilo de párrafo

Se especifican párrafos como el tipo de estilo estableciendo el valor del atributo de tipo en el elemento de estilo en "párrafo".

La siguiente información de la sección 17.7.8 de la especificación ISO/IEC 29500 trata los estilos de párrafo. Tenga en cuenta que los números de sección precedidos de § indican secciones en la especificación ISO.

17.7.8 Estilos de párrafo

Los estilos de párrafo son estilos que se aplican a los contenidos de un párrafo completo así como la marca de párrafo. Esta definición implica que el estilo puede definir propiedades de caracteres (propiedades que se aplican al texto del documento) así como propiedades de párrafos (propiedades que se aplican al posicionamiento y el aspecto del párrafo). No se pueden hacer referencias a estilos de párrafo mediante segmentos dentro de un documento; se hará referencia a ellos mediante el elemento pStyle (§17.3.1.27) dentro del elemento propiedades de las propiedades de un párrafo.

Un estilo de párrafo tiene tres características específicas del tipo que definen el estilo:

  • El atributo de tipo en el estilo tiene un valor de párrafo, que indica que la siguiente definición de estilo es un estilo de párrafo.

  • El elemento next define un comportamiento de edición que proporciona el estilo de párrafo para que se aplique automáticamente al siguiente párrafo al presionar ENTRAR al final de un párrafo de este estilo.

  • El estilo especifica propiedades de nivel de párrafo y de nivel de carácter mediante los elementos pPr y rPr, respectivamente. En este caso, las propiedades de segmento son las propiedades establecidas aplicadas a cada segmento del párrafo.

El estilo de párrafo se aplica, a continuación, a los párrafos haciendo referencia al valor del atributo styleId para este estilo en el elemento pStyle de las propiedades del párrafo.

© ISO/IEC29500: 2008.


Funcionamiento del código

El método CreateAndAddParagraphStyle empieza recuperando una referencia al elemento styles en la parte styles. El elemento styles es el elemento raíz de la parte y contiene todos los elementos de estilo individuales. Si la referencia es nula, el elemento styles se crea y se guarda en la parte.

    // Access the root element of the styles part.
        Styles styles = styleDefinitionsPart.Styles;
        if (styles == null)
        {
            styleDefinitionsPart.Styles = new Styles();
            styleDefinitionsPart.Styles.Save();
        }

Crear el estilo

Para crear el estilo, el código crea una instancia de la clase Style y establece ciertas propiedades, como Type of style (paragraph), StyleId, si el estilo es customStyle y si el estilo es el estilo Predeterminado para su tipo.

    // Create a new paragraph style element and specify some of the attributes.
    Style style = new Style() { Type = StyleValues.Paragraph,
        StyleId = styleid,
        CustomStyle = true,
        Default = false
    };

El código genera el siguiente XML.

    <w:styles xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
      <w:style w:type="paragraph" w:styleId="OverdueAmountPara" w:default="false" w:customStyle="true">
      </w:style>
    </w:styles>

A continuación, el código crea los elementos secundarios del estilo, que definen las propiedades del estilo. Para crear un elemento, cree una instancia de su clase correspondiente y, a continuación, llame al método Append([]) para agregar el elemento secundario al estilo. Para obtener más información sobre estas propiedades, consulte la sección 17.7 de la especificación ISO/IEC 29500 .

    // Create and add the child elements (properties of the style).
    Aliases aliases1 = new Aliases() { Val = aliases };
    AutoRedefine autoredefine1 = new AutoRedefine() { Val = OnOffOnlyValues.Off };
    BasedOn basedon1 = new BasedOn() { Val = "Normal" };
    LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountChar" };
    Locked locked1 = new Locked() { Val = OnOffOnlyValues.Off };
    PrimaryStyle primarystyle1 = new PrimaryStyle() { Val = OnOffOnlyValues.On };
    StyleHidden stylehidden1 = new StyleHidden() { Val = OnOffOnlyValues.Off };
    SemiHidden semihidden1 = new SemiHidden() { Val = OnOffOnlyValues.Off };
    StyleName styleName1 = new StyleName() { Val = stylename };
    NextParagraphStyle nextParagraphStyle1 = new NextParagraphStyle() { Val = "Normal" };
    UIPriority uipriority1 = new UIPriority() { Val = 1 };
    UnhideWhenUsed unhidewhenused1 = new UnhideWhenUsed() { Val = OnOffOnlyValues.On };
    if (aliases != "")
        style.Append(aliases1);
    style.Append(autoredefine1);
    style.Append(basedon1);
    style.Append(linkedStyle1);
    style.Append(locked1);
    style.Append(primarystyle1);
    style.Append(stylehidden1);
    style.Append(semihidden1);
    style.Append(styleName1);
    style.Append(nextParagraphStyle1);
    style.Append(uipriority1);
    style.Append(unhidewhenused1);

A continuación, el código crea una instancia de un objeto StyleRunProperties para crear un elemento rPr (Propiedades de ejecución). Debe especificar las propiedades del carácter que se aplican al estilo, como la fuente y el color, en este elemento. A continuación, las propiedades se anexan como elementos secundarios del elemento rPr.

Cuando se crean las propiedades de segmento, el código anexa el elemento rPr al estilo y el elemento de estilo al elemento raíz styles en la parte styles.

    // Create the StyleRunProperties object and specify some of the run properties.
    StyleRunProperties styleRunProperties1 = new StyleRunProperties();
    Bold bold1 = new Bold();
    Color color1 = new Color() { ThemeColor = ThemeColorValues.Accent2 };
    RunFonts font1 = new RunFonts() { Ascii = "Lucida Console" };
    Italic italic1 = new Italic();
    // Specify a 12 point size.
    FontSize fontSize1 = new FontSize() { Val = "24" };
    styleRunProperties1.Append(bold1);
    styleRunProperties1.Append(color1);
    styleRunProperties1.Append(font1);
    styleRunProperties1.Append(fontSize1);
    styleRunProperties1.Append(italic1);

    // Add the run properties to the style.
    style.Append(styleRunProperties1);

    // Add the style to the styles part.
    styles.Append(style);

Aplicación del estilo de párrafo

Cuando tenga creado el estilo, puede aplicarlo a un párrafo haciendo referencia al valor del atributo styleId para este estilo en el elemento pStyle de las propiedades del párrafo. El siguiente ejemplo de código muestra cómo aplicar un estilo a un párrafo al que hace referencia la variable p. El identificador de estilo del estilo que se va a aplicar se almacena en la variable parastyleid y la propiedad ParagraphStyleId representa el elemento pStyle de las propiedades del párrafo.

    // If the paragraph has no ParagraphProperties object, create one.
    if (p.Elements<ParagraphProperties>().Count() == 0)
    {
        p.PrependChild<ParagraphProperties>(new ParagraphProperties());
    }

    // Get a reference to the ParagraphProperties object.
    ParagraphProperties pPr = p.ParagraphProperties;

    // If a ParagraphStyleId object does not exist, create one.
    if (pPr.ParagraphStyleId == null)
        pPr.ParagraphStyleId = new ParagraphStyleId();

    // Set the style of the paragraph.
    pPr.ParagraphStyleId.Val = parastyleid;

Código de ejemplo

El siguiente es el ejemplo de código completo CreateAndAddParagraphStyle en C# y Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

CreateAndAddParagraphStyle(args[0], args[1], args[2], args[3]);

// Create a new paragraph style with the specified style ID, primary style name, and aliases and 
// add it to the specified style definitions part.
static void CreateAndAddParagraphStyle(string filePath, string styleid, string stylename, string aliases = "")
{
    using (WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(filePath, true))
    {
        // Access the root element of the styles part.
        Styles? styles = wordprocessingDocument?.MainDocumentPart?.StyleDefinitionsPart?.Styles ?? AddStylesPartToPackage(wordprocessingDocument).Styles;

        if (styles is not null)
        {

            // Create a new paragraph style element and specify some of the attributes.
            Style style = new Style()
            {
                Type = StyleValues.Paragraph,
                StyleId = styleid,
                CustomStyle = true,
                Default = false
            };

            // Create and add the child elements (properties of the style).
            Aliases aliases1 = new Aliases() { Val = aliases };
            AutoRedefine autoredefine1 = new AutoRedefine() { Val = OnOffOnlyValues.Off };
            BasedOn basedon1 = new BasedOn() { Val = "Normal" };
            LinkedStyle linkedStyle1 = new LinkedStyle() { Val = "OverdueAmountChar" };
            Locked locked1 = new Locked() { Val = OnOffOnlyValues.Off };
            PrimaryStyle primarystyle1 = new PrimaryStyle() { Val = OnOffOnlyValues.On };
            StyleHidden stylehidden1 = new StyleHidden() { Val = OnOffOnlyValues.Off };
            SemiHidden semihidden1 = new SemiHidden() { Val = OnOffOnlyValues.Off };
            StyleName styleName1 = new StyleName() { Val = stylename };
            NextParagraphStyle nextParagraphStyle1 = new NextParagraphStyle() { Val = "Normal" };
            UIPriority uipriority1 = new UIPriority() { Val = 1 };
            UnhideWhenUsed unhidewhenused1 = new UnhideWhenUsed() { Val = OnOffOnlyValues.On };
            if (aliases != "")
                style.Append(aliases1);
            style.Append(autoredefine1);
            style.Append(basedon1);
            style.Append(linkedStyle1);
            style.Append(locked1);
            style.Append(primarystyle1);
            style.Append(stylehidden1);
            style.Append(semihidden1);
            style.Append(styleName1);
            style.Append(nextParagraphStyle1);
            style.Append(uipriority1);
            style.Append(unhidewhenused1);

            // Create the StyleRunProperties object and specify some of the run properties.
            StyleRunProperties styleRunProperties1 = new StyleRunProperties();
            Bold bold1 = new Bold();
            Color color1 = new Color() { ThemeColor = ThemeColorValues.Accent2 };
            RunFonts font1 = new RunFonts() { Ascii = "Lucida Console" };
            Italic italic1 = new Italic();
            // Specify a 12 point size.
            FontSize fontSize1 = new FontSize() { Val = "24" };
            styleRunProperties1.Append(bold1);
            styleRunProperties1.Append(color1);
            styleRunProperties1.Append(font1);
            styleRunProperties1.Append(fontSize1);
            styleRunProperties1.Append(italic1);

            // Add the run properties to the style.
            style.Append(styleRunProperties1);

            // Add the style to the styles part.
            styles.Append(style);
        }
    }
}

// Add a StylesDefinitionsPart to the document.  Returns a reference to it.
static StyleDefinitionsPart AddStylesPartToPackage(WordprocessingDocument? doc)
{
    StyleDefinitionsPart part;

    if (doc?.MainDocumentPart is null)
    {
        throw new ArgumentNullException("MainDocumentPart is null.");
    }

    part = doc.MainDocumentPart.AddNewPart<StyleDefinitionsPart>();
    Styles root = new Styles();
    root.Save(part);
    return part;
}

Vea también