1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| /// <summary>
/// Remplace le contenu texte de tous les champs fusion d'un document Word
/// </summary>
/// <param name="document">Object 'WordprocessingDocument' représentant le document</param>
/// <param name="replaceOperations">Un dictionnaire clés/valeurs (clés : nom du champ fusion à remplacer, valeur : valeur par laquelle remplacer)</param>
public static void ReplaceAllQuickPartText(WordprocessingDocument document,
Dictionary<string, string> replaceOperations)
{
Document currentDocument = document.MainDocumentPart.Document;
Body currentBody = currentDocument.Body;
IEnumerable<SimpleField> simpleFields = currentBody.Descendants<SimpleField>();
if (simpleFields.Count() > 0)
{
// w:fldSimple (MergeField par défaut, au premier enregistrement du template)
foreach (SimpleField field in simpleFields)
{
string[] instruction = GetCurrentInstruction(field);
ReplaceMergeField(instruction, field.Descendants<Text>(), replaceOperations);
}
}
else
{
IEnumerable<FieldCode> fieldCodes = currentBody.Descendants<FieldCode>();
// w:instrText (MergeField après une modification du template)
foreach (FieldCode field in fieldCodes)
{
string[] instruction = GetCurrentInstruction(field);
ReplaceMergeField(instruction, field.Parent.Parent.Descendants<Text>(), replaceOperations);
}
}
currentDocument.Save();
}
/// <summary>
/// Remplace le texte des champs fusion d'un document
/// </summary>
/// <param name="instruction">tableau contenant les instructions du champ MergeField</param>
/// <param name="descendants">Les éléments OpenXml enfants suivant si le remplacement est fait dans un champ w:fldSimple ou w:instrText</param>
/// <param name="replaceOperations">Un dictionnaire clés/valeurs (clés : nom du champ fusion à remplacer, valeur : valeur par laquelle remplacer)</param>
private static void ReplaceMergeField(string[] instruction,
IEnumerable<Text> descendants,
Dictionary<string, string> replaceOperations)
{
// Vérifie si c'est un champ de type de MergeField (champ fusion).
if (instruction[0].ToLower().Equals("mergefield"))
{
string fieldname = instruction[1];
// Récupère le texte à l'intérieur du champ fusion
foreach (Text fieldText in descendants)
{
string value = replaceOperations.ContainsKey(fieldname) ? replaceOperations[fieldname] : null;
// Est-ce un champ à remplacer ?
if (value != null)
{
fieldText.Text = value;
}
// Il ne devrait y avoir qu'un seul champ texte...
break;
}
}
} |