Rechercher et remplacer du texte dans une partie de document
Cette rubrique montre comment utiliser les classes du Kit de développement logiciel (SDK) Open XML pour Office pour rechercher et remplacer par programmation une valeur de texte 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.
Obtenir 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.
Exemple de code
L'exemple suivant montre comment effectuer rapidement et simplement des recherches et des remplacements. Il est possible que cette méthode ne soit pas fiable, car elle récupère le document XML sous forme de chaîne. Selon l’expression régulière utilisée, il se peut que vous remplaciez accidentellement les balises XML et que vous endommagiez le document. Pour rechercher uniquement un document, sans remplacer son contenu, utilisez l’expression MainDocumentPart.Document.InnerText.
Cet exemple montre également comment utiliser une expression régulière pour rechercher et remplacer la valeur de texte« Hello world ! » stockée dans un fichier de traitement de texte nommé « MyPkg8.docx », par la valeur « Bonjour tout le monde ! ». Pour appeler la méthode SearchAndReplace, vous pouvez utiliser l’exemple suivant.
SearchAndReplace(@"C:\Users\Public\Documents\MyPkg8.docx");
Une fois le programme exécuté, vous pouvez consulter le fichier pour voir les modifications apportées au texte, « Hello world! ».
Voici un exemple de code complet en C# et Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
using System.Text.RegularExpressions;
SearchAndReplace(args[0]);
// To search and replace content in a document part.
static void SearchAndReplace(string document)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
string? docText = null;
if (wordDoc.MainDocumentPart is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
docText = sr.ReadToEnd();
}
Regex regexText = new Regex("Hello world!");
docText = regexText.Replace(docText, "Hi Everyone!");
using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
sw.Write(docText);
}
}
}