C# 使用OpenXMLSDK填充word模板数据

C# 使用OpenXMLSDK填充word模板数据,c#,ms-word,openxml-sdk,word-contentcontrol,C#,Ms Word,Openxml Sdk,Word Contentcontrol,我有一个word文件模板和用于数据的xml文件。我想在word中找到内容控件,从xml中获取数据,然后替换word模板中的文本。我正在使用以下代码,但它没有更新word文件 using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text)) { MainDocumentPart mainPart = document.Main

我有一个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();
}
使用(WordprocessingDocument=WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))
{
MainDocumentPart mainPart=document.MainDocumentPart;
IEnumerable block=mainPart.Document.Body.subjects()。其中
(r=>r.SdtProperties.GetFirstChild().Val==“TotalClose”);
Text t=block.subjects().Single();
t、 Text=“13450542”;
mainPart.Document.Save();
}

我认为您应该将更改写入临时文件。 请参阅或我的工作项目代码:

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

我认为您应该将更改写入临时文件。 请参阅或我的工作项目代码:

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

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

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

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

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

对于仍在努力解决此问题的任何人,您可以查看此库

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


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

对于仍在努力解决此问题的任何人,您可以查看此库

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

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