最简单的方法是使用字符串替换。由于您可以控制模板,因此在合并字段中放置一个唯一的字符串。无论 Merge 字段是否已格式化,您需要替换的文本都将位于Text
元素中。
然后搜索 的所有 Text 后代并Body
进行WordprocessingDocument
字符串替换。
这是传真合并文档模板的片段。我已将商务电话合并字段更改为 «XXXXBusiness PhoneXXXX» 并以不同的格式对其进行格式化:

我为该类编写了一个扩展方法Body
来进行替换,如下所示:
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);
}
}
}
}
一旦这到位,您的代码在您打开文档后就是一个单行代码:
using (var doc = WordprocessingDocument.Open(openFileDialog.FileName, true))
{
doc.MainDocumentPart.Document.Body.ReplaceTextInTextDescendants("«XXXXBusiness PhoneXXXX»","212-867-5309");
}
结果如下所示:

完毕!