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 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
Pour ouvrir un document existant, instanciez la WordprocessingDocument classe comme indiqué dans les deux using
instructions 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 Open méthode , avec le paramètre Boolean.
Pour le fichier source qui définit le paramètre sur false
pour l’ouvrir pour un accès en lecture seule. Pour le fichier cible, définissez le paramètre sur true
afin d’activer la modification du document.
using (WordprocessingDocument wordDoc1 = WordprocessingDocument.Open(fromDocument1, false))
using (WordprocessingDocument wordDoc2 = WordprocessingDocument.Open(toDocument2, 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.
Structure d’un document WordProcessingML
La structure de base d’un WordProcessingML
document se compose des document
éléments 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 r
éléments. l’acronyme r
de run, qui est une région de texte avec un ensemble commun de propriétés, telles que la mise en forme. Une exécution contient un ou plusieurs t
éléments. L’élément t
contient une plage de texte. L’exemple de code suivant montre le WordprocessingML
balisage d’un document qui contient le texte « Exemple de texte ».
<w:document xmlns:w="http://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 à WordprocessingML
des éléments. Vous trouverez ces classes dans l’espace de noms . Le tableau suivant répertorie les noms de classes des classes qui correspondent aux document
éléments , 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/IEC 29500 : 2016
Fonctionnement de l’exemple de code
Pour copier le contenu d’un composant de document d’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 transmis en tant que paramètre à la CopyThemeContent
méthode . Le code ouvre ensuite les deux documents en tant qu’objets WordprocessingDocument et crée des variables qui référencent les ThemePart parties de chacun des packages.
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 de la partie source ThemePart à l’aide d’un StreamReader
objet et écrit dans la partie cible ThemePart à l’aide d’un 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 CopyThemeContent
méthode , vous pouvez utiliser l’exemple suivant, qui copie la partie de thème des packages situés à args[0]
l’emplacement vers celui situé à l’emplacement args[1]
.
string fromDocument1 = args[0];
string toDocument2 = args[1];
CopyThemeContent(fromDocument1, toDocument2);
Importante
Avant d’exécuter le programme, assurez-vous que le composant de thème est défini dans le document source. Pour ajouter un thème à un document, ouvrez-le dans Microsoft Word, cliquez sur l’onglet Création, puis sur Thèmes, puis sélectionnez l’un des thèmes disponibles.
Après avoir exécuté le programme, vous pouvez inspecter le fichier pour voir le thème modifié.
Voici un exemple de code complet en C# et Visual Basic.
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());
}
}
}