Copier le contenu d’un composant de package Open XML vers un composant de document dans un autre package
Cette rubrique montre comment utiliser les classes dans le Kit de développement logiciel (SDK) Open XML pour Office afin de copier le contenu d’un composant de document Open XML Wordprocessing vers un composant document dans un autre document de traitement de texte par programmation.
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
Pour ouvrir un document existant, instanciez la classe WordprocessingDocument comme indiqué dans les deux instructions using suivantes. Dans la même instruction, vous ouvrez le fichier de traitement de texte avec le nom de fichier spécifié à l’aide de la méthode Open , avec le paramètre Boolean. Pour le fichier source, définissez le paramètre à false pour l’ouvrir en accès en lecture seule. Pour le fichier cible, définissez le paramètre à true pour permettre la modification du document.
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
{
// Insert other code here.
}
L'instruction using fournit une alternative recommandée à la séquence .Create, .Save, .Close habituelle. 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. É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.
Structure d’un document WordProcessingML
La structure de base d’un document WordProcessingML se compose des éléments document et body , suivis d’un ou plusieurs éléments de niveau bloc tels que p, qui représente un paragraphe. Un paragraphe contient un ou plusieurs éléments r. Le r signifie « run » (exécution), qui est une zone de texte avec un ensemble de propriétés courant, comme par exemple la mise en forme. Une exécution contient un ou plusieurs éléments t. L'élément t contient une plage de texte. L’exemple de code suivant montre le balisage WordprocessingML pour un document qui contient le texte « Exemple de texte ».
<w:document xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
À l’aide du Kit de développement logiciel (SDK) Open XML, vous pouvez créer une structure de document et du contenu à l’aide de classes fortement typées qui correspondent à des éléments WordprocessingML . Vous trouverez ces classes dans l'espace de noms DocumentFormat.OpenXml.Wordprocessing . Le tableau suivant répertorie les noms des classes qui correspondent aux éléments document, body, p, r et t.
Élément WordprocessingML | Classe du Kit de développement logiciel (SDK) Open XML | Description |
---|---|---|
document | Document | Élément racine de la partie principale du document. |
body | Body | Conteneur des structures de niveau bloc, telles que paragraphs, tables, annotations et autres structures décrites dans la spécification ISO/IEC 29500. |
p | Paragraph | Paragraphe. |
r | Run | Exécution. |
t | Text | Plage de texte. |
Pour plus d’informations sur la structure globale des parties et éléments d’un document WordprocessingML, consultez Structure d’un document WordprocessingML.
Le composant de thème
Le composant de thème contient des informations sur la couleur, la police et le format d’un document. Il est défini dans la spécification ISO/IEC 29500 comme suit.
Une instance de ce type de composant contient des informations sur le thème d’un document, qui est une combinaison de jeu de couleurs, de jeu de polices et de jeu de formats (ce dernier étant également appelé « effets »). Pour un document WordprocessingML, le choix d’un thème affecte notamment la couleur et le style des titres. Pour un document SpreadsheetML, le choix d’un thème affecte notamment la couleur et le style du contenu des cellules et des graphiques. Pour un document PresentationML, le choix d’un thème affecte notamment la mise en forme des diapositives, des masques de document et des notes via le document maître associé.
Un package WordprocessingML ou SpreadsheetML contiendra zéro ou un composant de thème, qui sera la cible d’une relation implicite dans un composant Document principal (§11.3.10) ou Classeur (§12.3.23). Un package PresentationML contiendra zéro ou un composant de thème par composant Masque du document (§13.3.3), Masque des pages de notes (§13.3.4), Masque de diapositive (§13.3.10) ou Présentation (§13.3.6) via une relation implicite.
Exemple : l’élément de relation de composant de document principal WordprocessingML suivant contient une relation avec le composant Thème, qui est stocké dans le thème/theme1.xml d’élément ZIP :
<Relationships xmlns="…">
<Relationship Id="rId4"
Type="https://…/theme" Target="theme/theme1.xml"/>
</Relationships>
© ISO/IEC29500: 2008.
Fonctionnement de l’exemple de code
Pour copier le contenu d’un composant de document dans un package Open XML vers un composant de document dans un autre package, le chemin d’accès complet de chaque document de traitement de texte est passé en tant que paramètre d’entrée à la méthode CopyThemeContent. Le code ouvre ensuite les deux documents en tant qu’objets WordprocessingDocument et crée les variables qui référencent les composants ThemePart dans chacun des packages.
public static void CopyThemeContent(string fromDocument1, string toDocument2)
{
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
{
ThemePart themePart1 = wordDoc1.MainDocumentPart.ThemePart;
ThemePart themePart2 = wordDoc2.MainDocumentPart.ThemePart;
Le code lit ensuite le contenu du composant ThemePart source à l’aide d’un objet StreamReader et écrit dans le composant ThemePart cible à l’aide d’un objet StreamWriter.
using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create)))
{
streamWriter.Write( streamReader.ReadToEnd());
}
Exemple de code
L’exemple de code suivant copie le contenu d’un composant de document dans un package Open XML vers un composant de document dans un autre package. Pour appeler la méthode CopyThemeContent , vous pouvez utiliser l’exemple suivant, qui copie le composant thème de « MyPkg4.docx » vers « MyPkg3.docx ».
string fromDocument1 = @"C:\Users\Public\Documents\MyPkg4.docx";
string toDocument2 = @"C:\Users\Public\Documents\MyPkg3.docx";
CopyThemeContent(fromDocument1, toDocument2);
Importante
Avant d’exécuter le programme, vérifiez que le composant de thème est défini pour le document source (MyPkg4.docx) ; si ce n’est pas le cas, une exception se produira. Pour ajouter un thème à un document, ouvrez-le dans Microsoft Word 2013, cliquez sur l’onglet Mise en page, cliquez sur Thèmes, puis sélectionnez l’un des thèmes disponibles.
Après avoir exécuté le programme, vous pouvez inspecter le fichier « MyPkg3.docx » pour voir le thème copié à partir du fichier « MyPkg4.docx ».
Voici un exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System.IO;
CopyThemeContent(args[0], args[1]);
// To copy contents of one package part.
static void CopyThemeContent(string fromDocument1, string toDocument2)
{
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, true))
{
ThemePart? themePart1 = wordDoc1?.MainDocumentPart?.ThemePart;
ThemePart? themePart2 = wordDoc2?.MainDocumentPart?.ThemePart;
// If the theme parts are null, then there is nothing to copy.
if (themePart1 is null || themePart2 is null)
{
return;
}
using (StreamReader streamReader = new StreamReader(themePart1.GetStream()))
using (StreamWriter streamWriter = new StreamWriter(themePart2.GetStream(FileMode.Create)))
{
streamWriter.Write(streamReader.ReadToEnd());
}
}
}