使用XML文件中的数据/基于模板将XML转换为Word文档生成Word文档(docx)

时间:2018-05-01 13:39:08

标签: c# xml ms-word openxml openxml-sdk

我有一个XML文件,其中包含我需要在Word文档中填充的数据。

我需要找到一种方法,定义一个模板,该模板可以用作从XML文件填充数据并创建输出文档的基线。

我相信有两种方法可以做到这一点。

  1. 创建一个XSLT文件,该文件将成为"模板"并使用它来结合XML文件生成Word文档。
  2. 使用Word中的内容控件创建模板文档,并以某种方式映射到XML文件。
  3. 我只是不知道如何实施这两种方式的细节。或者不确定是否有另一种更简单的方法来完成这项任务。

    有人可以展示如何实施这一点的示例。只需一个简单的例子即可。

    我更喜欢C#进行编码。我正在使用Word 2016,但希望它从Word 2007兼容到Word 2016以及介于两者之间的所有内容,因为用户将使用这些版本。谢谢!

3 个答案:

答案 0 :(得分:7)

了解如何使用内容控件生成文档以及如何将XML中的数据填充到内容控件中。我把它分为两部分:

  • 第1部分:为文档生成创建模板文档
  • 第2部分:使用C#中的代码生成基于模板的文档

第1部分:创建用于文档生成的模板文档

  1. 创建一个示例XML,您可以根据该XML创建用于文档生成的Word模板。最好从较不复杂的版本开始,以便掌握它。
  2. 我使用以下XML进行测试。为了测试我没有重复的部分,图片等。

    <?xml version="1.0" encoding="utf-8"?>
    <mydata xmlns="http://CustomDemoXML.htm">
        <field1>This is the value in field1 from the XML file</field1>
        <field2>This is the value in field2 from the XML file</field2>
        <field3>This is the value in field3 from the XML file</field3>
    </mydata>
    

    注1 :这只是一个示例XML 来创建Word模板。当从模板生成Word文档时,稍后可以应用具有相同格式的实际数据的XML文件。

    注意2 xmlns属性可以包含任何您想要的内容,而且不必是以http开头的网址。

    将示例XML文件保存到任何位置,以便将其导入到您要创建的模板中。

    1. 确保您的Word [Developer - &gt;副本上已启用File标签Options - &gt; Customize Ribbon - &gt;在Customize the Ribbon下,确保选中Developer - &gt; OK]。详情:How to: Show the Developer Tab on the Ribbon

    2. 创建一个新的Word文档(或使用现有的Word文档),它将成为您生成文档的模板。

    3. Developer标签上,点击XML Mapping Pane。这将打开文档右侧的XML Mapping Pane

    4. 在XML Mapping Pane上,选择Custom XML Part下拉菜单 - &gt;选择(Add new part)

    5. 选择您在步骤1中保存的XML文件 - &gt; Open

    6. 在XML Mapping Pane上,选择Custom XML Part下拉菜单 - &gt;选择包含自定义XML文件的xmlns属性上的文本的项目。如果您使用上面的示例文件,那么它将是http://CustomDemoXML.htm

    7. 在Word文档中添加一些静态文本,并在其旁边添加Plain Text Content Control(在Developer标签 - &gt; Controls部分。对所有字段重复需要添加。

    8. 对于上面的示例XML,我有以下Word文档:

      sample word document template

      1. 点击第一个Plain Text Content Control - &gt;在XML Mapping Pane上,右键单击要映射到该内容控件的字段 - &gt;点击Map to Selected Content Control。对要映射的所有字段重复此操作。
      2. 注意:或者,您可以右键单击要在XML映射窗格上映射的字段,而不是在步骤8中从开发人员选项卡添加Plain Text Content Control项目 - &GT;点击Insert Content Control - &gt;点击Plain Text

        同样,您还可以添加其他类型的控件,例如复选框,日期选择器甚至重复部分(它也支持嵌套的重复部分! - 自Word 2013以来),并将数据从XML映射到仅使用本机Word功能的控件任何第三方工具!

        1. 保存模板文档。
        2. 第2部分:使用C#中的代码生成基于模板的文档

          这使用Microsoft推荐的OpenXML SDK来使用包含实际数据的XML文件生成文档。

          1. 构建XML文件/打开现有的XML文件,使用该文件从上面创建的模板生成文档。这需要与用于创建模板的示例XML文件的格式相同。

          2. 使用OpenXML SDK从文档中删除任何CustomXMLPart元素。假设在本示例中没有在文档中使用其他自定义XML部件。对于复杂方案,您可以根据需要删除特定的XML部分。

          3. 使用OpenXML SDK在上面的步骤#1中根据XML文件添加新的CustomXMLPart

          4. 以下示例代码我必须使用包含实际数据的XML文件中的数据“刷新”/“重新加载”模板中的示例数据(假设已经创建并保存了用于生成文档的XML文件) :

            using System.IO;
            using DocumentFormat.OpenXml.Packaging;
            
            namespace SampleNamespace
            {
                public static class SampleClass
                {
                    public static void GenerateDocument()
                    {
                        string rootPath = @"C:\Temp";
                        string xmlDataFile = rootPath + @"\MyNewData.xml";
                        string templateDocument = rootPath + @"\MyTemplate.docx";
                        string outputDocument = rootPath + @"\MyGeneratedDocument.docx";
            
                        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(templateDocument, true))
                        {
                            //get the main part of the document which contains CustomXMLParts
                            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
            
                            //delete all CustomXMLParts in the document. If needed only specific CustomXMLParts can be deleted using the CustomXmlParts IEnumerable
                            mainPart.DeleteParts<CustomXmlPart>(mainPart.CustomXmlParts);
            
                            //add new CustomXMLPart with data from new XML file
                            CustomXmlPart myXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
                            using (FileStream stream = new FileStream(xmlDataFile, FileMode.Open))
                            {
                                myXmlPart.FeedData(stream);
                            }
                        }
            
                    }
                }
            }
            

            就是这样!

答案 1 :(得分:3)

好的,找到了使用XSLT作为模板生成Word文档的详细指南:Using XSLT and Open XML to Create a Word 2007 Document

即使本文适用于Word 2007,它看起来也适用于Word 2016。

此问题的唯一问题是,如果稍后需要对模板进行更改,则需要花费大量精力来更新xslt文件,并且由于无法在Word中更新,因此用户不友好并且需要操纵文档的实际XML。

从好的方面来说,文档生成非常灵活,可以通过XSL获得所有可用功能(foreach,变量,如果条件等)。

答案 2 :(得分:0)

我们创建了一种自动化的方法来将XML文件数据填充到Word或PowerPoint文档中。我们利用一个外接程序,该外接程序使用内容控件将Excel内容(范围,表格,图表,形状等)链接到Word或PowerPoint。这些链接是便携式且健壮的。如果您需要对文档进行任何更改,它也很容易更新。您可以通过Excel应用程序找到加载项-只需通过“插入”选项卡上的“获取加载项”搜索加载项“ Excel-to-Word文档自动化”。您还可以了解有关here的更多信息。