2016-12-22 3 views
2

Je travaille sur une application qui utilise des fichiers Microsoft Word comme modèle pour générer des documents. J'utilise les champs Fusionner pour obtenir des données dans mes documents.Définir le résultat dans FieldChar en utilisant Open XML SDK

Un SimpleField peut avoir son jeu de résultats assez facile:

SimpleField f = doc.MainDocumentPart.Document.Body.Descendants<SimpleField>().First(); 
f.RemoveAllChildren(); 
f.Append(new Run(new Text("somevalue"))); 

mais, lorsqu'un champ est de style dans Word, il est comme sauver FieldChar, ce qui est un peu plus complexe. La méthode ci-dessus ne fonctionne pas ici, parce que le résultat n'est pas un enfant, mais un frère. Donc, fondamentalement, la question est: comment puis-je définir le résultat d'un champ (n'importe quel type) en utilisant Open XML SDK?

Répondre

1

La méthode la plus simple consiste à remplacer la chaîne. Puisque vous avez le contrôle sur le modèle, mettez une chaîne unique dans le champ de fusion. Peu importe si le champ Fusionner est formaté ou non, le texte que vous devez remplacer sera dans un élément Text.

Ensuite, recherchez tous les descendants de texte du Body du WordprocessingDocument et remplacez une chaîne.

Voici un petit extrait du modèle de document de fusion de télécopies. J'ai changé le champ de fusion de téléphone d'affaires à «XXXXBusiness PhoneXXXX» et formaté différemment:

enter image description here

j'ai écrit une méthode d'extension pour la classe Body pour faire remplacer comme ceci:

using System.Linq; 
using DocumentFormat.OpenXml.Wordprocessing; 
namespace OxmlApp 
{ 

    static class WordprocessingExtensions 
    { 
     public static void ReplaceTextInTextDescendants(this Body body, string oldText, string newText) 
     { 
      foreach (var textItem in body.Descendants<Text>().Where(textItem => textItem.Text.Contains(oldText))) 
      { 
       textItem.Text = textItem.Text.Replace(oldText, newText); 
      } 
     } 
    } 
} 

Une fois que cela est en place, votre code est un interligne après l'ouverture du document:

using (var doc = WordprocessingDocument.Open(openFileDialog.FileName, true)) 
{ 
    doc.MainDocumentPart.Document.Body.ReplaceTextInTextDescendants("«XXXXBusiness PhoneXXXX»","212-867-5309"); 
} 

Le résultat est s een ici:

enter image description here

fait!