2

我正在开发一个使用 Microsoft Word 文件作为模板来生成文档的应用程序。我使用合并字段将数据放入我的文档中。

ASimpleField的结果集相当容易:

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

但是,当一个字段在 Word 中设置样式时,它会另存为FieldChar,这有点复杂。上面的方法在那里不起作用,因为结果不是孩子,而是兄弟姐妹。

所以,基本上问题是:如何使用 Open XML SDK 设置字段(任何类型)的结果?

4

1 回答 1

1

最简单的方法是使用字符串替换。由于您可以控制模板,因此在合并字段中放置一个唯一的字符串。无论 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");
}

结果如下所示:

在此处输入图像描述

完毕!

于 2017-01-27T17:44:18.793 回答