Partager via


Créer et ajouter un style de paragraphe à un document de traitement de texte

Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office afin de créer et d’ajouter par programmation un style de paragraphe à un document de traitement de texte. Il contient un exemple de méthode CreateAndAddParagraphStyle pour illustrer cette tâche, ainsi qu’un exemple de méthode supplémentaire pour ajouter la partie styles si nécessaire.


CreateAndAddParagraphStyle, méthode

L’exemple de méthode CreateAndAddParagraphStyle peut être utilisé pour ajouter un style à un document de traitement de texte. Vous devez d’abord obtenir une référence à la partie définitions de style dans le document auquel vous souhaitez ajouter le style. Pour plus d’informations et pour obtenir un exemple de procédure, consultez la section Appel de l’exemple de méthode .

La méthode accepte quatre paramètres qui indiquent : une référence à la partie définitions de style, l’ID de style du style (identificateur interne), le nom du style (pour une utilisation externe dans l’interface utilisateur) et éventuellement, tous les alias de style (autres noms à utiliser dans l’interface utilisateur).

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

La liste de code complète pour la méthode se trouve dans la section Exemple de code.


À propos des ID de style, des noms de style et des alias

L’ID de style est utilisé par le document pour faire référence au style et peut être considéré comme son identificateur principal. En règle générale, vous utilisez l’ID de style pour identifier un style dans le code. Un style peut également avoir un nom d’affichage distinct dans l’interface utilisateur. Souvent, le nom du style apparaît donc dans la casse et avec un espacement (par exemple, Titre 1), tandis que l’ID de style est plus succinct (par exemple, heading1) et destiné à une utilisation interne. Les alias spécifient d’autres noms de style qui peuvent être utilisés par l’interface utilisateur d’une application.

Par exemple, considérez l’exemple de code XML suivant tiré d’une définition de style.

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

L’attribut styleId de l’élément style contient le main identificateur interne du style, l’ID de style (OverdueAmountPara). L’élément aliases spécifie deux autres noms de style, Late Due et Late Amount, qui sont séparés par des virgules. Chaque nom doit être séparé par une ou plusieurs virgules. Enfin, l’élément name spécifie le nom du style principal, qui est généralement affiché dans l’interface utilisateur d’une application.


Appel de la méthode de l’exemple

Utilisez l’exemple de méthode CreateAndAddParagraphStyle pour créer et ajouter un style nommé à un document de traitement de texte à l’aide du Kit de développement logiciel (SDK) Open XML. L’exemple de code suivant montre comment ouvrir et obtenir une référence à un document de traitement de texte, récupérer une référence à la partie des définitions de style du document, puis appeler la méthode CreateAndAddParagraphStyle .

Pour appeler la méthode, transmettez une référence à la partie définitions de style comme premier paramètre, l’ID de style du style en tant que deuxième paramètre, le nom du style comme troisième paramètre et éventuellement, tous les alias de style comme quatrième paramètre. Par exemple, le code suivant crée le style de paragraphe « Overdue Amount Para » dans un exemple de fichier nommé CreateAndAddParagraphStyle.docx. Il ajoute également un paragraphe de texte et applique le style au paragraphe.

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

Style Types

WordprocessingML prend en charge six types de style, dont quatre que vous pouvez spécifier à l’aide de l’attribut type sur l’élément style. Les informations suivantes, issues de la section 17.7.4.17 de la spécification ISO/IEC 29500 , présentent les types de style.

Les types de style font référence à la propriété d’un style qui définit le type de style créé avec cette définition de style. WordprocessingML prend en charge six types de définitions de style par les valeurs de l’attribut de type de la définition de style :

  • Styles de paragraphe

  • Styles de caractères

  • Styles liés (paragraphe + caractère) [Remarque : accompli via l’élément link (§17.7.4.6). Fin de la remarque]

  • Styles de tableau

  • Styles de numérotation

  • Propriétés de paragraphe + caractère par défaut

Exemple : Considérez un style appelé Titre 1 dans un document comme suit :

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

L’attribut type a une valeur de paragraphe, ce qui indique que la définition de style suivante est un style de paragraphe.

© ISO/IEC29500: 2008.

Vous pouvez définir les types de styles paragraphe, caractère, tableau et numérotation en spécifiant la valeur correspondante dans l’attribut type de l’élément de style.


Type de style de paragraphe

Vous spécifiez paragraphe comme type de style en définissant la valeur de l’attribut type sur l’élément de style sur « paragraph ».

Les informations suivantes de la section 17.7.8 de la spécification ISO/IEC 29500 traitent des styles de paragraphe. Notez que les numéros de section précédés de § indiquent les sections de la spécification ISO.

17.7.8 Styles de paragraphe

Les styles de paragraphe sont des styles qui s’appliquent au contenu d’un paragraphe entier ainsi qu’à la marque de paragraphe. Cette définition implique que le style peut définir à la fois les propriétés de caractère (propriétés qui s’appliquent au texte dans le document) ainsi que les propriétés de paragraphe (propriétés qui s’appliquent au positionnement et à l’apparence du paragraphe). Les styles de paragraphe ne peuvent pas être référencés par des exécutions dans un document ; ils doivent être référencés par l’élément pStyle (§17.3.1.27) dans l’élément de propriétés de paragraphe d’un paragraphe.

Un style de paragraphe a trois caractéristiques propres au type de style :

  • L’attribut type sur le style a une valeur de paragraphe, ce qui indique que la définition de style suivante est un style de paragraphe.

  • L’élément suivant définit un comportement d’édition qui fournit le style de paragraphe à appliquer automatiquement au paragraphe suivant lorsque la touche Entrée est enfoncée à la fin d’un paragraphe de ce style.

  • Le style spécifie à la fois les propriétés au niveau du paragraphe et au niveau du caractère à l’aide des éléments pPr et rPr , respectivement. Dans ce cas, les propriétés d’exécution sont l’ensemble des propriétés appliquées à chaque exécution du paragraphe.

Le style de paragraphe est ensuite appliqué aux paragraphes en référençant la valeur d’attribut styleId de ce style dans l’élément pStyle des propriétés de paragraphe.

© ISO/IEC29500: 2008.


Fonctionnement du code

La méthode CreateAndAddParagraphStyle commence par récupérer une référence à l’élément styles dans la partie styles. L’élément styles est l’élément racine de la partie et contient tous les éléments de style individuels. Si la référence est null, l’élément styles est créé et enregistré dans le composant.

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

Création du style

Pour créer le style, le code instancie la classe Style et définit certaines propriétés, telles que le Type de style (paragraphe), le StyleId, si le style est un CustomStyle et si le style est le style Par défaut pour son type.

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

Le code génère le code XML suivant.

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

Le code crée ensuite les éléments enfants du style, qui définissent les propriétés du style. Pour créer un élément, vous instanciez sa classe correspondante, puis appelez la méthode Append([]) pour ajouter l’élément enfant au style. Pour plus d’informations sur ces propriétés, consultez la section 17.7 de la spécification 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);

Ensuite, le code instancie un objet StyleRunProperties pour créer un élément rPr (Run Properties). Vous spécifiez les propriétés de caractère qui s’appliquent au style, telles que la police et la couleur, dans cet élément. Les propriétés sont ensuite ajoutées en tant qu’enfants de l’élément rPr .

Lorsque les propriétés d’exécution sont créées, le code ajoute l’élément rPr au style et l’élément style à l’élément racine styles dans la partie 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);

Application du style de paragraphe

Une fois le style créé, vous pouvez l’appliquer à un paragraphe en référençant la valeur d’attribut styleId de ce style dans l’élément pStyle des propriétés de paragraphe. L’exemple de code suivant montre comment appliquer un style à un paragraphe référencé par la variable p. L’ID de style du style à appliquer est stocké dans la variable parastyleid, et la propriété ParagraphStyleId représente l’élément pStyle des propriétés de paragraphe.

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

Exemple de code

Voici l’exemple de code CreateAndAddParagraphStyle complet en C# et 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;
}

Voir aussi