Compartilhar via


Criar e adicionar um estilo de parágrafo em um documento de processamento de texto

Este tópico mostra como utilizar as classes no SDK Open XML para o Office para criar e adicionar programaticamente um estilo de parágrafo a um documento de processamento de palavras. Contém um método de exemplo CreateAndAddParagraphStyle para ilustrar esta tarefa, além de um método de exemplo suplementar para adicionar a parte de estilos quando necessário.


CreateAndAddParagraphStyle Method

O CreateAndAddParagraphStyle método de exemplo pode ser utilizado para adicionar um estilo a um documento de processamento de palavras. Primeiro, tem de obter uma referência à parte de definições de estilo no documento ao qual pretende adicionar o estilo. Para obter mais informações e um exemplo de como fazê-lo, veja a secção Chamar o Método de Exemplo .

O método aceita quatro parâmetros que indicam: uma referência à parte das definições de estilo, o ID de estilo do estilo (um identificador interno), o nome do estilo (para utilização externa na interface de utilizador) e, opcionalmente, quaisquer aliases de estilo (nomes alternativos para utilização na interface de utilizador).

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

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


Acerca de IDs de Estilo, Nomes de Estilo e Aliases

O ID de estilo é utilizado pelo documento para fazer referência ao estilo e pode ser considerado como o identificador principal. Normalmente, utiliza o ID de estilo para identificar um estilo no código. Um estilo também pode ter um nome a apresentar separado na interface de utilizador. Muitas vezes, o nome do estilo é apresentado em maiúsculas e minúsculas e com espaçamento (por exemplo, Título 1), enquanto o ID de estilo é mais sucinta (por exemplo, cabeçalho1) e destina-se a utilização interna. Os aliases especificam nomes de estilo alternativos que podem ser utilizados pela interface de utilizador de uma aplicação.

Por exemplo, considere o seguinte exemplo de código XML retirado de uma definição 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>

O atributo styleId do elemento de estilo contém o main identificador interno do estilo, o ID de estilo (OverdueAmountPara). O elemento aliases especifica dois nomes de estilo alternativos, Late Due e Late Amount, que estão separados por vírgulas. Cada nome tem de ser separado por uma ou mais vírgulas. Por fim, o elemento name especifica o nome do estilo primário, que é o normalmente apresentado na interface de utilizador de uma aplicação.


Chamar o Método de Exemplo

Utilize o CreateAndAddParagraphStyle método de exemplo para criar e adicionar um estilo com nome a um documento de processamento de palavras com o SDK Open XML. O seguinte exemplo de código mostra como abrir e obter uma referência a um documento de processamento de palavras, obter uma referência à parte das definições de estilo do documento e, em seguida, chamar o CreateAndAddParagraphStyle método .

Para chamar o método , transmita uma referência à parte das definições de estilo como o primeiro parâmetro, o ID de estilo do estilo como segundo parâmetro, o nome do estilo como o terceiro parâmetro e, opcionalmente, quaisquer aliases de estilo como o quarto parâmetro. Por exemplo, o código seguinte cria o estilo de parágrafo "Valor Em Atraso Para". Também adiciona um parágrafo de texto e aplica o estilo ao parágrafo.

string strDoc = args[0];

using (WordprocessingDocument doc = WordprocessingDocument.Open(strDoc, true))
{
    if (doc is null)
    {
        throw new ArgumentNullException("document could not be opened");
    }

    MainDocumentPart mainDocumentPart = doc.MainDocumentPart ?? doc.AddMainDocumentPart();

    // Get the Styles part for this document.
    StyleDefinitionsPart? part = mainDocumentPart.StyleDefinitionsPart;

    // If the Styles part does not exist, add it and then add the style.
    if (part is 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.
    mainDocumentPart.Document ??= new Document();
    mainDocumentPart.Document.Body ??= new Body();

    mainDocumentPart.Document.Body.AppendChild(p);

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

    // Get a reference to the ParagraphProperties object.
    p.ParagraphProperties ??= new ParagraphProperties();
    ParagraphProperties pPr = p.ParagraphProperties;

    // If a ParagraphStyleId object doesn't exist, create one.
    pPr.ParagraphStyleId ??= new ParagraphStyleId();

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

Tipos de Estilo

O WordprocessingML suporta seis tipos de estilo, quatro dos quais pode especificar com o atributo type no elemento de estilo. As seguintes informações, da secção 17.7.4.17 na especificação ISO/IEC 29500 , introduzem tipos de estilo.

Os tipos de estilo referem-se à propriedade num estilo que define o tipo de estilo criado com esta definição de estilo. O WordprocessingML suporta seis tipos de definições de estilo pelos valores do atributo de tipo da definição de estilo:

  • Estilos de parágrafo

  • Estilos de carateres

  • Estilos ligados (parágrafo + caráter) [Nota: realizado através do elemento de ligação (}17.7.4.6). nota de fim]

  • Table styles

  • Estilos de numeração

  • Propriedades predefinidas de parágrafo + caráter

Exemplo: considere um estilo denominado Cabeçalho 1 num documento da seguinte forma:

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

O atributo type tem um valor de parágrafo, o que indica que a seguinte definição de estilo é um estilo de parágrafo.

© ISO/IEC 29500: 2016

Pode definir os tipos de estilos de parágrafo, caráter, tabela e numeração ao especificar o valor correspondente no atributo de tipo do elemento de estilo.


Tipo de Estilo de Parágrafo

Especifique parágrafo como o tipo de estilo ao definir o valor do atributo de tipo no elemento de estilo como "parágrafo".

As seguintes informações da secção 17.7.8 da especificação ISO/IEC 29500 abordam os estilos de parágrafo. Tenha em atenção que os números de secção precedidos por indicação de secções na especificação ISO.

17.7.8 Estilos de Parágrafo

Os estilos de parágrafo são estilos que se aplicam ao conteúdo de um parágrafo inteiro, bem como à marca de parágrafo. Esta definição implica que o estilo pode definir ambas as propriedades do caráter (propriedades que se aplicam ao texto no documento), bem como as propriedades de parágrafo (propriedades que se aplicam ao posicionamento e aspeto do parágrafo). Os estilos de parágrafo não podem ser referenciados por execuções num documento; Devem ser referenciados pelo elemento pStyle (}17.3.1.27) no elemento de propriedades de parágrafo de um parágrafo.

Um estilo de parágrafo tem três caraterísticas específicas do tipo de estilo:

  • O atributo type no estilo tem um valor de parágrafo, o que indica que a seguinte definição de estilo é um estilo de parágrafo.

  • O elemento seguinte define um comportamento de edição que fornece o estilo de parágrafo a aplicar automaticamente ao parágrafo seguinte quando ENTER é premido no final de um parágrafo deste estilo.

  • O estilo especifica as propriedades ao nível do parágrafo e ao nível do caráter com os elementos pPr e rPr , respetivamente. Neste caso, as propriedades de execução são o conjunto de propriedades aplicadas a cada execução no parágrafo.

Em seguida, o estilo de parágrafo é aplicado aos parágrafos ao referenciar o valor do atributo styleId para este estilo no elemento pStyle das propriedades do parágrafo.

© ISO/IEC 29500: 2016


Como Funciona o Código

O CreateAndAddParagraphStyle método começa por obter uma referência ao elemento de estilos na parte estilos. O elemento styles é o elemento raiz da parte e contém todos os elementos de estilo individuais. Se a referência for nula, o elemento estilos é criado.

// Access the root element of the styles part.
Styles? styles = styleDefinitionsPart.Styles;

if (styles is null)
{
    styleDefinitionsPart.Styles = new Styles();
    styles = styleDefinitionsPart.Styles;
}

Criar o Estilo

Para criar o estilo, o código instancia a Style classe e define determinadas propriedades, como o Type estilo (parágrafo), o StyleId, se o estilo é um CustomStylee se o estilo é o estilo para o Default seu 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
};

O código resulta no seguinte XML.

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

Em seguida, o código cria os elementos subordinados do estilo, que definem as propriedades do estilo. Para criar um elemento, instancia a classe correspondente e, em seguida, chama o Append método para adicionar o elemento subordinado ao estilo. Para obter mais informações sobre estas propriedades, consulte a secção 17.7 da especificação 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 (string.IsNullOrWhiteSpace(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);

Em seguida, o código instancia um StyleRunProperties objeto para criar um rPr elemento (Propriedades de Execução). Especifique as propriedades de carateres que se aplicam ao estilo, como o tipo de letra e a cor, neste elemento. Em seguida, as propriedades são acrescentadas como subordinados do rPr elemento .

Quando as propriedades de execução são criadas, o código acrescenta o rPr elemento ao estilo e o elemento de estilo ao elemento raiz estilos na parte estilos.

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

Aplicar o Estilo de Parágrafo

Quando tiver criado o estilo, pode aplicá-lo a um parágrafo ao referenciar o valor do atributo styleId para este estilo no elemento pStyle das propriedades do parágrafo. O seguinte exemplo de código mostra como aplicar um estilo a um parágrafo referenciado pela variável p. O ID de estilo do estilo a aplicar é armazenado na variável parastyleid e a propriedade ParagraphStyleId representa o elemento das propriedades de pStyle parágrafo.

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

// Get a reference to the ParagraphProperties object.
p.ParagraphProperties ??= new ParagraphProperties();
ParagraphProperties pPr = p.ParagraphProperties;

// If a ParagraphStyleId object doesn't exist, create one.
pPr.ParagraphStyleId ??= new ParagraphStyleId();

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

Código de exemplo

Segue-se o exemplo de código completo CreateAndAddParagraphStyle em C# e Visual Basic.

// 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(StyleDefinitionsPart styleDefinitionsPart, string styleid, string stylename, string aliases = "")
{
    // Access the root element of the styles part.
    Styles? styles = styleDefinitionsPart.Styles;

    if (styles is null)
    {
        styleDefinitionsPart.Styles = new Styles();
        styles = styleDefinitionsPart.Styles;
    }

    // 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 (string.IsNullOrWhiteSpace(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>();
    part.Styles = new Styles();

    return part;
}

string strDoc = args[0];

using (WordprocessingDocument doc = WordprocessingDocument.Open(strDoc, true))
{
    if (doc is null)
    {
        throw new ArgumentNullException("document could not be opened");
    }

    MainDocumentPart mainDocumentPart = doc.MainDocumentPart ?? doc.AddMainDocumentPart();

    // Get the Styles part for this document.
    StyleDefinitionsPart? part = mainDocumentPart.StyleDefinitionsPart;

    // If the Styles part does not exist, add it and then add the style.
    if (part is 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.
    mainDocumentPart.Document ??= new Document();
    mainDocumentPart.Document.Body ??= new Body();

    mainDocumentPart.Document.Body.AppendChild(p);

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

    // Get a reference to the ParagraphProperties object.
    p.ParagraphProperties ??= new ParagraphProperties();
    ParagraphProperties pPr = p.ParagraphProperties;

    // If a ParagraphStyleId object doesn't exist, create one.
    pPr.ParagraphStyleId ??= new ParagraphStyleId();

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

Confira também