Remplacer le composant de thème dans 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 remplacer par programmation un composant de document dans un document de traitement de texte.
Packages et parties de documents
Un document Open XML est stocké en tant que package, dont le format est défini par la norme ISO/IEC 29500-2. Le package peut contenir plusieurs parties avec des relations entre elles. La relation entre les parties détermine la catégorie du document. Un document peut être défini comme un document de traitement de texte si son élément de relation de package contient une relation avec une partie principale de document. Si son élément de relation de package contient une relation avec une partie de présentation, il peut être défini comme un document de présentation. Si son élément de relation de package contient une relation avec une partie de classeur, il est défini en tant que feuille de calcul. Dans cette rubrique, vous utiliserez un package de documents de traitement de texte.
Obtention d’un objet WordprocessingDocument
Dans l'exemple de code, commencez par ouvrir le fichier de traitement de texte en instanciant la classe WordprocessingDocument comme indiqué dans l'instruction using suivante. Dans la même instruction, vous ouvrez le document de traitement de texte à l’aide de la méthode Open, avec le paramètre booléen défini sur true pour activer la modification du document.
using (WordprocessingDocument wordDoc =
WordprocessingDocument.Open(document, true))
{
// Insert other code here.
}
L'instruction using offre une alternative recommandée pour la séquence .Open, .Save, .Close standard. Elle garantit que la méthode Dispose (méthode interne utilisée par le kit de développement Open XML pour nettoyer les ressources) est automatiquement appelée lorsque l'accolade de fermeture est atteinte. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using, dans le cas présent wordDoc. Étant donné que la classe WordprocessingDocument du kit de développement logiciel Open XML enregistre et ferme automatiquement l'objet dans le cadre de l'implémentation de System.IDisposable, et que la méthode Dispose est appelée automatiquement lorsque vous quittez le bloc, vous n'avez pas besoin d'appeler explicitement Save et Close si vous utilisez using.
Comment changer de thème dans un package Word
Pour changer le thème d’un document Word, cliquez dans le Ruban sur Mise en page, puis cliquez sur Thèmes. Le menu déroulant Thèmes s’ouvre. Pour choisir l’un des thèmes prédéfinis et l’appliquer au document Word, cliquez sur l’icône du thème correspondant. Vous pouvez également utiliser l’option Rechercher les thèmes... pour localiser et appliquer un thème sur votre ordinateur.
Structure de l’élément theme
L’élément theme comprend les jeux de couleurs, les jeux de polices et les jeux de mises en forme. Dans cette rubrique de procédures, vous allez découvrir comment modifier le thème par programme. Par conséquent, il convient de vous familiariser avec l’élément theme. Les informations suivantes de la spécification ISO/IEC 29500 peuvent être utiles lors de l’utilisation de cet élément.
Cet élément définit le type complexe de niveau racine associé à une feuille de style partagée (ou thème). Cet élément contient toutes les différentes options de mise en forme disponibles pour un document basé sur un thème ; en outre, il définit l’apparence globale du document lorsque des objets à thème sont utilisés dans ce dernier.
[Exemple : l’image suivante illustre l’application de différents thèmes à une présentation. Dans cet exemple, vous pouvez constater qu’un thème peut affecter la police, les couleurs, les arrière-plans, les remplissages et les effets des différents objets d’une présentation. Fin de l’exemple]
Dans cet exemple, nous voyons comment un thème peut affecter la police, les couleurs, les arrière-plans, les remplissages et les effets pour différents objets d’une présentation. Fin de l’exemple]
© ISO/IEC29500: 2008.
Le tableau suivant répertorie les types enfants possibles de la classe Theme.
Élément PresentationML | Classe du Kit de développement logiciel (SDK) Open XML | Description |
---|---|---|
custClrLst | CustomColorList | Liste de couleurs personnalisées |
extLst | Extensionlist | Liste d’extensions |
extraClrSchemeLst | ExtraColorSchemeList | Liste de jeux de couleurs supplémentaires |
Objectdefaults | Objectdefaults | Valeurs par défaut des objets |
Themeelements | Themeelements | Éléments de thème |
Le fragment de schéma XML suivant définit les quatre composants de l’élément theme. L’élément themeElements contient la mise en forme principale définie dans le thème. Les autres composants fournissent les remplacements, valeurs par défaut et ajouts des informations contenues dans themeElements. Le type complexe définissant un thème , CT_OfficeStyleSheet, est défini de la manière suivante :
<complexType name="CT_OfficeStyleSheet">
<sequence>
<element name="themeElements" type="CT_BaseStyles" minOccurs="1" maxOccurs="1"/>
<element name="objectDefaults" type="CT_ObjectStyleDefaults" minOccurs="0" maxOccurs="1"/>
<element name="extraClrSchemeLst" type="CT_ColorSchemeList" minOccurs="0" maxOccurs="1"/>
<element name="custClrLst" type="CT_CustomColorList" minOccurs="0" maxOccurs="1"/>
<element name="extLst" type="CT_OfficeArtExtensionList" minOccurs="0" maxOccurs="1"/>
</sequence>
<attribute name="name" type="xsd:string" use="optional" default=""/>
</complexType>
Ce type complexe contient également CT_OfficeArtExtensionList, qui est utilisé à des fins ultérieures d’extensibilité du type complexe.
Fonctionnement de l’exemple de code
Une fois le fichier ouvert, vous pouvez instancier MainDocumentPart dans l’objet wordDoc et supprimer l’ancien composant Thème.
public static void ReplaceTheme(string document, string themeFile)
{
using (WordprocessingDocument wordDoc =
WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
// Delete the old document part.
mainPart.DeletePart(mainPart.ThemePart);
Vous pouvez ensuite créer ajouter un objet ThemePart et l’ajouter à l’objet MainDocumentPart . Ajoutez ensuite du contenu à l’aide des objets StreamReader et StreamWriter pour copier le thème de l’objet themeFile à l’objet ThemePart.
// Add a new document part and then add content.
ThemePart themePart = mainPart.AddNewPart<ThemePart>();
using (StreamReader streamReader = new StreamReader(themeFile))
using (StreamWriter streamWriter =
new StreamWriter(themePart.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
Exemple de code
L’exemple de code suivant montre comment remplacer le composant Thème d’un document de traitement de texte par le composant Thème issu d’un autre package. Le fichier de thème passé comme deuxième argument doit être un composant de thème valide au format XML (par exemple, Theme1.xml). Vous pouvez extraire ce composant à partir d’un document ou d’un fichier de thème (.THMX) existant renommé en fichier .Zip. Pour appeler la méthode ReplaceTheme , vous pouvez utiliser l’exemple d’appel suivant pour copier le thème du fichier « Theme1.xml » vers le fichier « MyPkg7.docx ».
string document = @"C:\Users\Public\Documents\\MyPkg7.docx";
string themeFile = @"C:\Users\Public\Documents\Theme1.xml";
ReplaceTheme(document, themeFile);
Après avoir exécuté le programme, ouvrez le fichier Word pour constater le changement de police.
Voici l’exemple de code complet en C# et en Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
ReplaceTheme(args[0], args[1]);
// This method can be used to replace the theme part in a package.
static void ReplaceTheme(string document, string themeFile)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
if (wordDoc.MainDocumentPart is null || wordDoc.MainDocumentPart.Document.Body is null || wordDoc.MainDocumentPart.ThemePart is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body and/or ThemePart is null.");
}
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
// Delete the old document part.
mainPart.DeletePart(mainPart.ThemePart);
// Add a new document part and then add content.
ThemePart themePart = mainPart.AddNewPart<ThemePart>();
using (StreamReader streamReader = new StreamReader(themeFile))
using (StreamWriter streamWriter = new StreamWriter(themePart.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
}
}