0

我有一个用于数据的 word 文件模板和 xml 文件。我想在 word 中查找内容内容控件并从 xml 获取数据,然后替换 word 模板中的文本。我正在使用以下代码,但它没有更新 word 文件。

using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))       
{
           MainDocumentPart mainPart = document.MainDocumentPart;
            IEnumerable<SdtBlock> block = mainPart.Document.Body.Descendants<SdtBlock>().Where
                (r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");
            Text t = block.Descendants<Text>().Single();
             t.Text = "13,450,542";
            mainPart.Document.Save();
}
4

3 回答 3

2

对于仍在为此苦苦挣扎的任何人-您可以查看此库https://github.com/antonmihaylov/OpenXmlTemplates

使用它,您可以基于 JSON 对象(或基本 C# 字典)替换文档的所有内容控件中的文本,而无需编写特定代码,而是在内容控件的标记中指定变量名称。

(注意 - 我是该库的制造商,但它是开源的,并在 LGPLv3 下获得许可)

于 2019-12-18T15:35:37.420 回答
1

我认为您应该将更改写入临时文件。请参阅将修改后的 WordprocessingDocument 保存到新文件或我的工作项目中的代码:

    MemoryStream yourDocStream = new MemoryStream();
    ... // populate yourDocStream with .docx bytes
    using (Package package = Package.Open(yourDocStream, FileMode.Open, FileAccess.ReadWrite))
    {
        //  Load the document XML in the part into an XDocument instance.  
        PackagePart packagePart = LoadXmlPackagePart(package);
        XDocument xDocument = XDocument.Load(XmlReader.Create(packagePart.GetStream()));

        // making changes

        //  Save the XML into the package  
        using (XmlWriter xw = XmlWriter.Create(packagePart.GetStream(FileMode.Create, FileAccess.Write)))
        {
            xDocument.Save(xw);
        }

        var resultDocumentBytes = yourDocStream.ToArray();
    }
于 2019-01-20T13:09:17.253 回答
0

您使用的基本方法工作正常,但我很惊讶您没有收到任何编译时错误,因为

IEnumerable<SdtBlock> block = mainPart.Document
                                      .Body
                                      .Descendants<SdtBlock>()
                                      .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");

不兼容

Text t = block.Descendants<Text>().Single();

block,因为IEnumerable没有Descendants财产。您要么需要遍历所有项目IEnumerable并在每个项目上执行此操作,要么需要定义和实例化单个项目,如下所示:

using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))
{
    MainDocumentPart mainPart = pkgDoc.MainDocumentPart;

    SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where
            (r => r.SdtProperties.GetFirstChild<Tag>().Val == "test1").FirstOrDefault();

    Text t = block.Descendants<Text>().Single();
    t.Text = "13,450,542";

    mainPart.Document.Save();
}
于 2019-01-21T10:18:42.723 回答