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 composants Document
Un document Open XML est stocké sous forme de package, dont le format est défini par la norme ISO/IEC 29500. 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, vous commencez par ouvrir le fichier de traitement de texte en instanciant la WordprocessingDocument classe, comme indiqué dans l’instruction suivante using
. Dans la même instruction, vous ouvrez le document de fichier de traitement de texte à l’aide de la Open méthode , avec le paramètre booléen défini sur true
pour permettre la modification du document.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
Avec v3.0.0+ la Close() méthode a été supprimée au profit de l’instruction using.
Il garantit que la Dispose() méthode est automatiquement appelée lorsque l’accolade fermante est atteinte. Le bloc qui suit l’instruction using établit une étendue pour l’objet créé ou nommé dans l’instruction using. Étant donné que la WordprocessingDocument classe du Kit de développement logiciel (SDK) Open XML enregistre et ferme automatiquement l’objet dans le cadre de son IDisposable implémentation, et que Dispose() est appelée automatiquement lorsque vous quittez le bloc, vous n’avez pas à appeler Save() explicitement ou Dispose() tant que vous utilisez une using
instruction.
Comment changer de thème dans un package Word
Si vous souhaitez modifier le thème dans un document Word, cliquez sur le ruban Création, puis sur Thèmes. Le menu déroulant Thèmes s’ouvre. Pour choisir l’un des thèmes intégrés et l’appliquer au document Word, cliquez sur l’icône de thème. 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 de thème est constitué de jeux de couleurs, de polices et de formats. 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 constatons 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]
© ISO/IEC 29500 : 2016
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
est la pièce qui contient la mise en forme main définie dans le thème. Les autres parties fournissent des remplacements, des valeurs par défaut et des ajouts aux 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 un CT_OfficeArtExtensionList
, qui est utilisé pour l’extensibilité future de ce type complexe.
Fonctionnement de l’exemple de code
Après avoir ouvert le fichier, vous pouvez instancier dans MainDocumentPart
l’objet wordDoc
et supprimer l’ancien composant de thème.
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
if (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);
Vous pouvez ensuite créer ajouter un objet ThemePart et l’ajouter à l’objet MainDocumentPart
. Ensuite, vous ajoutez du contenu à l’aide d’objets StreamReader
et StreamWriter pour copier le thème du themeFile
vers 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 à partir du fichier depuis arg[1]
et vers le fichier situé à l’emplacement arg[0]
string document = args[0];
string themeFile = args[1];
ReplaceTheme(document, themeFile);
Après avoir exécuté le programme, ouvrez le fichier Word et remarquez les modifications apportées au nouveau thème.
Voici un exemple de code complet en C# et Visual Basic.
// 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?.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());
}
}
}