Remplacer les composants de styles 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 programme les styles d’un document de traitement de texte par les styles d’un autre document de traitement de texte. Il contient un exemple ReplaceStyles
de méthode pour illustrer cette tâche, ainsi que les ReplaceStylesPart
méthodes et ExtractStylesPart
de prise en charge.
À propos du stockage des styles
Un package de document de traitement de texte, tel qu’un fichier qui a une extension .docx, est en fait un fichier .zip qui se compose de plusieurs parties. Vous pouvez considérer que chaque partie est similaire à un fichier externe. Un composant a un type de contenu particulier et peut contenir du contenu égal au contenu d’un fichier XML externe, d’un fichier binaire, d’un fichier image, etc., selon le type. La norme qui définit la façon dont les documents Open XML sont stockés dans .zip fichiers est appelée Open Packaging Conventions. Pour plus d’informations sur les conventions open packaging, consultez ISO/IEC 29500-2.
Les styles sont stockés dans des parties dédiées dans un package de document de traitement de texte. Un document Microsoft Word 2010 contient une seule partie de styles. les versions ultérieures de Microsoft Word ajouter un deuxième composant stylesWithEffects. L’image suivante de document Explorer dans l’outil de productivité du Kit de développement logiciel (SDK) Open XML pour Microsoft Office montre les parties de document dans un exemple de document Word 2013+ qui contient des styles.
Figure 1. Styles des parties dans un document de traitement de texte
Afin de fournir un « aller-retour » pour un document de Word 2013+ à Word 2010 et 2010, Word 2013+ conserve à la fois la partie des styles d’origine et la partie des nouveaux styles. (La spécification des formats de fichiers Open XML Office exige que Microsoft Word ignorer les parties qu’il ne reconnaît pas ; Word 2010 ne remarque pas la partie stylesWithEffects que Word 2013+ ajoute au document.)
L’exemple de code fourni dans cette rubrique peut être utilisé pour remplacer ces parties de styles.
ReplaceStyles, méthode
Vous pouvez utiliser l’exemple ReplaceStyles
de méthode pour remplacer les styles d’un document de traitement de texte par les styles d’un autre document de traitement de texte. La ReplaceStyles
méthode accepte deux paramètres : le premier paramètre contient une chaîne qui indique le chemin du fichier qui contient les styles à extraire. Le deuxième paramètre contient une chaîne qui indique le chemin d’accès du fichier vers lequel copier les styles, remplaçant ainsi complètement les styles.
static void ReplaceStyles(string fromDoc, string toDoc)
La liste de code complète de la ReplaceStyles
méthode et de ses méthodes de prise en charge se trouve dans la section Exemple de code .
Appel de la méthode de l’exemple
Pour appeler l’exemple de méthode, vous passez une chaîne pour le premier paramètre qui indique le chemin du fichier avec les styles à extraire, et une chaîne pour le deuxième paramètre qui représente le chemin d’accès au fichier dans lequel remplacer les styles. Le code suivant est fourni à titre d'exemple. Une fois l’exécution du code terminée, les styles du document cible ont été remplacés et, par conséquent, l’apparence du texte dans le document reflète les nouveaux styles.
string fromDoc = args[0];
string toDoc = args[1];
ReplaceStyles(fromDoc, toDoc);
Fonctionnement du code
Le code extrait et remplace d’abord la partie styles, puis la deuxième partie stylesWithEffects, et s’appuie sur deux méthodes de prise en charge pour effectuer la majeure partie du travail. La ExtractStylesPart
méthode a pour tâche d’extraire le contenu de la partie styles ou stylesWithEffects et de le placer dans un XDocument objet . La ReplaceStylesPart
méthode prend l’objet créé par ExtractStylesPart
et utilise son contenu pour remplacer la partie styles ou stylesWithEffects dans le document cible.
// Extract and replace the styles part.
XDocument? node = ExtractStylesPart(fromDoc, false);
if (node is not null)
{
ReplaceStylesPart(toDoc, node, false);
}
Le dernier paramètre dans la signature de la ExtractStylesPart
méthode ou ReplaceStylesPart
détermine si la partie styles ou la partie stylesWithEffects est utilisée. La valeur false indique que vous souhaitez extraire et remplacer la partie styles. L’absence d’une valeur (le paramètre est facultatif) ou d’une valeur true (valeur par défaut) signifie que vous souhaitez extraire et remplacer la partie stylesWithEffects.
// Extract and replace the stylesWithEffects part. To fully support
// round-tripping from Word 2010 to Word 2007, you should
// replace this part, as well.
node = ExtractStylesPart(fromDoc);
if (node is not null)
{
ReplaceStylesPart(toDoc, node);
}
return;
Pour plus d’informations sur la ExtractStylesPart
méthode, consultez l’exemple associé. La section suivante explique la ReplaceStylesPart
méthode .
ReplaceStylesPart, méthode
La ReplaceStylesPart
méthode peut être utilisée pour remplacer le composant styles ou styleWithEffects dans un document, en fonction d’un XDocument
instance qui contient le même composant pour un document Word 2010 ou Word 2013+ (comme indiqué dans l’exemple de code plus haut dans cette rubrique, la ExtractStylesPart
méthode peut être utilisée pour obtenir ce instance). La ReplaceStylesPart
méthode accepte trois paramètres : le premier paramètre contient une chaîne qui indique le chemin d’accès au fichier que vous souhaitez modifier. Le deuxième paramètre contient un XDocument
objet qui contient la partie styles ou stylesWithEffect d’un autre document de traitement de texte, et le troisième indique si vous souhaitez remplacer le composant styles ou le composant stylesWithEffects (comme indiqué dans l’exemple de code plus haut dans cette rubrique, vous devrez appeler cette procédure deux fois pour les documents Word 2013+, en remplaçant chaque partie par la partie correspondante d’un document source).
static void ReplaceStylesPart(string fileName, XDocument newStyles, bool setStylesWithEffectsPart = true)
Fonctionnement du code ReplaceStylesPart
La ReplaceStylesPart
méthode examine le document que vous spécifiez, en recherchant la partie styles ou stylesWithEffects.
Si la partie demandée existe, la méthode enregistre le fourni XDocument
dans la partie sélectionnée.
Le code commence par ouvrir le document à l’aide de la Open méthode et en indiquant que le document doit être ouvert pour l’accès en lecture/écriture (paramètre final true
). Étant donné le document ouvert, le code utilise la MainDocumentPart propriété pour accéder au composant de document main, puis prépare une variable nommée stylesPart
pour contenir une référence au composant styles.
// Open the document for write access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || (document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null))
{
throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
}
// Get a reference to the main document part.
var docPart = document.MainDocumentPart;
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart? stylesPart = null;
Rechercher la partie styles correcte
Le code récupère ensuite une référence à la partie de styles demandée, à l’aide du setStylesWithEffectsPart
paramètre Boolean. En fonction de cette valeur, le code récupère une référence à la partie de styles demandée et la stocke dans la stylesPart
variable.
if (setStylesWithEffectsPart)
{
stylesPart = docPart.StylesWithEffectsPart;
}
else
{
stylesPart = docPart.StyleDefinitionsPart;
}
Enregistrer le contenu du composant
En supposant que la partie demandée existe, le code doit enregistrer tout le contenu du XDocument
passé à la méthode dans le composant. Chaque partie fournit une GetStream() méthode, qui retourne un Stream.
Le code passe le Stream instance au constructeur de la StreamWriter(Stream) classe, en créant un enregistreur de flux autour du flux de la partie. Enfin, le code appelle la Save(Stream) méthode du XDocument, en enregistrant son contenu dans la partie styles.
// If the part exists, populate it with the new styles.
if (stylesPart is not null)
{
newStyles.Save(new StreamWriter(stylesPart.GetStream(FileMode.Create, FileAccess.Write)));
}
Exemple de code
Voici les méthodes complètes ReplaceStyles
, ReplaceStylesPart
et ExtractStylesPart
en C# et Visual Basic.
// Replace the styles in the "to" document with the styles in
// the "from" document.
static void ReplaceStyles(string fromDoc, string toDoc)
{
// Extract and replace the styles part.
XDocument? node = ExtractStylesPart(fromDoc, false);
if (node is not null)
{
ReplaceStylesPart(toDoc, node, false);
}
// Extract and replace the stylesWithEffects part. To fully support
// round-tripping from Word 2010 to Word 2007, you should
// replace this part, as well.
node = ExtractStylesPart(fromDoc);
if (node is not null)
{
ReplaceStylesPart(toDoc, node);
}
return;
}
// Given a file and an XDocument instance that contains the content of
// a styles or stylesWithEffects part, replace the styles in the file
// with the styles in the XDocument.
static void ReplaceStylesPart(string fileName, XDocument newStyles, bool setStylesWithEffectsPart = true)
{
// Open the document for write access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || (document.MainDocumentPart.StyleDefinitionsPart is null && document.MainDocumentPart.StylesWithEffectsPart is null))
{
throw new ArgumentNullException("MainDocumentPart and/or one or both of the Styles parts is null.");
}
// Get a reference to the main document part.
var docPart = document.MainDocumentPart;
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart? stylesPart = null;
if (setStylesWithEffectsPart)
{
stylesPart = docPart.StylesWithEffectsPart;
}
else
{
stylesPart = docPart.StyleDefinitionsPart;
}
// If the part exists, populate it with the new styles.
if (stylesPart is not null)
{
newStyles.Save(new StreamWriter(stylesPart.GetStream(FileMode.Create, FileAccess.Write)));
}
}
}
// Extract the styles or stylesWithEffects part from a
// word processing document as an XDocument instance.
static XDocument ExtractStylesPart(string fileName, bool getStylesWithEffectsPart = true)
{
// Declare a variable to hold the XDocument.
XDocument? styles = null;
// Open the document for read access and get a reference.
using (var document = WordprocessingDocument.Open(fileName, false))
{
// Get a reference to the main document part.
var docPart = document.MainDocumentPart;
if (docPart is null)
{
throw new ArgumentNullException("MainDocumentPart is null.");
}
// Assign a reference to the appropriate part to the
// stylesPart variable.
StylesPart stylesPart;
if (getStylesWithEffectsPart && docPart.StylesWithEffectsPart is not null)
{
stylesPart = docPart.StylesWithEffectsPart;
}
else if (docPart.StyleDefinitionsPart is not null)
{
stylesPart = docPart.StyleDefinitionsPart;
}
else
{
throw new ArgumentNullException("StyleWithEffectsPart and StyleDefinitionsPart are undefined");
}
using (var reader = XmlNodeReader.Create(stylesPart.GetStream(FileMode.Open, FileAccess.Read)))
{
// Create the XDocument.
styles = XDocument.Load(reader);
}
}
// Return the XDocument instance.
return styles;
}