【问题标题】:Generate a Word document (docx) using data from an XML file / Convert XML to a Word document based on a template使用 XML 文件中的数据生成 Word 文档 (docx) / 基于模板将 XML 转换为 Word 文档
【发布时间】:2018-10-11 13:16:56
【问题描述】:

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

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

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

  1. 创建一个将作为“模板”的 XSLT 文件,并使用它与 XML 文件结合使用来生成 Word 文档。
  2. 使用 Word 中的内容控件创建模板文档并以某种方式映射到 XML 文件。

我只是不知道如何实现这两种方式的详细信息。或者不确定是否有其他更简单的方法来完成这项任务。

有人可以举例说明如何实现这一点。一个简单的例子就足够了。

我更喜欢 C# 进行任何编码。我正在使用 Word 2016,但希望它与 Word 2007 和 Word 2016 以及两者之间的所有内容(如果可能)兼容,因为用户将使用这些版本。谢谢!

【问题讨论】:

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


【解决方案1】:

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

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

第 1 部分:为文档生成创建模板文档

  1. 创建一个示例 XML,您可以在此基础上创建用于文档生成的 Word 模板。最好从不太复杂的版本开始,以便掌握它。

我使用以下 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 文件。

注意 2xmlns 属性可以包含您想要的任何内容,它不必是一个以 http 开头的 URL。

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

  1. 确保在您的 Word 副本上启用了 Developer 选项卡 [File -> Options -> Customize Ribbon -> 在 Customize the Ribbon 下,确保选中 Developer -> OK]。详情:How to: Show the Developer Tab on the Ribbon

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

  3. Developer 选项卡上,单击XML Mapping Pane。这将打开文档右侧的XML Mapping Pane

  4. 在 XML 映射窗格中,选择 Custom XML Part 下拉菜单 -> 选择 (Add new part)

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

  6. 在 XML 映射窗格中,选择 Custom XML Part 下拉菜单 -> 选择带有自定义 XML 文件的 xmlns 属性上的文本的项目。如果您使用上面的示例文件,它将是http://CustomDemoXML.htm

  7. 在 Word 文档中添加一些静态文本并在其旁边添加 Plain Text Content Control(在 Developer 选项卡上 -> Controls 部分。对您需要添加的所有字段重复此操作。

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

  1. 单击第一个Plain Text Content Control -> 在XML 映射窗格上,右键单击要映射到该内容控件的字段-> 单击Map to Selected Content Control。对要映射的所有字段重复此操作。

注意: 或者,您可以在第 8 步的开发人员选项卡中添加 Plain Text Content Control 项目,而不是在 XML 映射窗格中右键单击要映射的字段 -> 单击Insert Content Control -> 点击Plain Text

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

  1. 保存您的模板文档。

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

这使用了微软推荐的OpenXML SDK,使用包含真实数据的 XML 文件生成文档。

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

  2. 使用 OpenXML SDK 从文档中删除任何 CustomXMLPart 元素。这假定文档中没有使用其他自定义 XML 部分,本示例就是这种情况。对于复杂的场景,您可以根据需要删除特定的 XML 部分。

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

这里是示例代码,我必须使用包含真实数据的 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);
                }
            }

        }
    }
}

就是这样!

【讨论】:

  • 那么,“outputDocument”在哪里使用?看起来您只修改了第 2 部分中的源“templateDocument”。
  • 只是一个快速更新。除了使用 opendoc sdk,您还可以在应用中添加 DocumentFormat.OpenXml nuget 包来运行代码。
【解决方案2】:

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

看起来即使这篇文章适用于 Word 2007,它在 Word 2016 中也能完美运行。

此方法的唯一问题是,如果以后需要对模板进行更改,更新 xslt 文件需要花费大量精力,而且这样做对用户不友好,因为它无法在 Word 本身和实际 XML 中更新需要对文档进行操作。

从好的方面来说,文档生成非常灵活,可通过 XSL 提供所有功能(foreach、变量、if 条件等)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 2015-06-03
      • 2014-07-11
      • 2011-03-14
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2016-03-24
      • 2010-09-10
      相关资源
      最近更新 更多