2016-12-22 19 views
2

私は、ドキュメントを生成するためのテンプレートとしてMicrosoft Wordファイルを使用するアプリケーションで作業しています。 Mergeフィールドを使用してドキュメントにデータを取得します。Open XML SDKを使用してFieldCharで結果を設定

SimpleFieldは、その結果は非常に簡単に設定することができ:

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

しかし、フィールドがWordでスタイル設定されたときに、それは少し複雑である、FieldCharとして保存されます。上記の方法は、結果が子供ではなく兄弟であるため、そこでは機能しません。

Open XML SDKを使用してフィールド(任意のタイプ)の結果を設定するにはどうすればよいですか?

答えて

1

これを行う最も簡単な方法は、文字列の置換です。テンプレートを制御できるので、マージフィールドに一意の文字列を配置します。差し込みフィールドがフォーマットされているかどうかにかかわらず、置き換える必要のあるテキストはText要素になります。

Bodyのテキストのすべての子孫をWordprocessingDocumentで検索し、文字列置換を行います。

ここには、[FAX結合ドキュメント]テンプレートのスナップがあります。私は«XXXXBusiness PhoneXXXX»をするビジネス電話マージフィールドを変更し、それを異なってフォーマットされています

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); 
      } 
     } 
    } 
} 

enter image description here

私はそうのように置き換える行うにBodyクラスの拡張メソッドを書きましたこれを実行すると、文書を開いた後にコードが1行で表示されます。

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

結果は次のようになります。ここEEN:

enter image description here

をやりました!

関連する問題