使用 XML 文件中的数据生成 Word 文档 (docx) / 根据模板将 XML 转换为 Word 文档
Generate a Word document (docx) using data from an XML file / Convert XML to a Word document based on a template
我有一个 XML 文件,其中包含我需要在 Word 文档中填充的数据。
我需要找到一种方法来定义一个模板,该模板可用作从 XML 文件填充数据并创建输出文档的基线。
我相信有两种方法可以做到这一点。
- 创建一个将成为 "template" 的 XSLT 文件,并使用它与 XML 文件结合使用来生成 Word 文档。
- 使用 Word 中的内容控件创建模板文档并以某种方式映射到 XML 文件。
我只是不知道如何实施这两种方式的细节。或者不确定是否有另一种更简单的方法来完成此任务。
有人可以举例说明如何实现这一点。一个简单的例子就足够了。
我更喜欢使用 C# 进行任何编码。我正在使用 Word 2016,但希望它兼容 Word 2007 到 Word 2016 以及介于两者之间的所有版本(如果可能的话),因为用户将使用这些版本。谢谢!
好的,在此处找到了使用 XSLT 作为模板生成 Word 文档的详细指南:Using XSLT and Open XML to Create a Word 2007 Document。
看起来即使这篇文章是针对 Word 2007 的,它在 Word 2016 中也能完美运行。
此方法的唯一问题是,如果以后需要更改模板,更新 xslt 文件需要花费大量精力,而且这样做对用户不友好,因为它不能在 Word 本身和需要对文档的实际 XML 进行操作。
从好的方面来说,文档生成非常灵活,通过 XSL 可以使用所有功能(foreach、变量、if 条件等)
了解如何使用内容控件生成文档以及如何将数据从 XML 填充到内容控件中。我将其分为两部分:
- 第 1 部分:创建用于文档生成的模板文档
- 第 2 部分:使用 C# 中的代码基于模板生成文档
第 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 模板。 XML 以后从模板生成 Word 文档时,可以应用具有相同格式的真实数据的文件。
注意 2:xmlns
属性可以包含任何您想要的字面意思,它不必是 URL 以 http 开头。
将您的示例 XML 文件保存到任何位置,以便可以将其导入到您要创建的模板中。
确保 Developer
选项卡在您的 Word 副本上启用 [File
-> Options
-> Customize Ribbon
-> 在 Customize the Ribbon
,确保 Developer
是 selected -> OK
]。详情:How to: Show the Developer Tab on the Ribbon
创建一个新的 Word 文档(或使用现有的 Word 文档)作为文档生成的模板。
在 Developer
选项卡上,单击 XML Mapping Pane
。这将打开文档右侧的XML Mapping Pane
。
在 XML 映射窗格中,select Custom XML Part
下拉列表 -> Select (Add new part)
.
Select 您在步骤 1 中保存的 XML 文件 -> Open
.
在 XML 映射窗格中,select Custom XML Part
下拉列表 -> Select 包含 xmlns
自定义 XML 文件的属性。如果您使用上面的示例文件,它将是 http://CustomDemoXML.htm
.
向 Word 文档添加一些静态文本并在其旁边添加一个 Plain Text Content Control
(在 Developer
选项卡 -> Controls
部分。重复您需要添加的所有字段。
对于上面的示例 XML,我有以下 Word 文档:
- 单击第一个
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 功能,没有任何第三方工具!
- 保存模板文档。
第 2 部分:使用 C# 中的代码基于模板生成文档
这使用 Microsoft 推荐的 OpenXML SDK 使用包含真实数据的 XML 文件生成文档。
构建您的 XML file/open 现有 XML 文件,用于从上面创建的模板生成文档。这需要与用于创建模板的示例 XML 文件的格式相同。
使用 OpenXML SDK 从文档中删除任何 CustomXMLPart
元素。这假设文档中没有使用其他自定义 XML 部分,在本例中就是这种情况。对于复杂的场景,您可以根据需要删除特定的 XML 部分。
使用 OpenXML SDK 添加新的 CustomXMLPart
基于上面第 1 步中的 XML 文件。
这是示例代码,我必须 "refresh"/"reload" 模板中的示例数据以及来自包含真实数据的 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);
}
}
}
}
}
就是这样!
我们创建了一种将 XML 文件数据填充到 Word 或 PowerPoint 文档中的自动化方法。我们利用一个插件,该插件使用内容控件 link Excel 内容(范围、表格、图表、形状等)到 Word 或 PowerPoint。 link 是便携且坚固的。如果您需要对文档进行任何更改,它也很容易更新。您可以通过 Excel 应用程序找到加载项 - 只需通过“插入”选项卡上的“获取加载项”搜索加载项“Excel-to-Word Document Automation”。您还可以找到更多相关信息 here.
我有一个 XML 文件,其中包含我需要在 Word 文档中填充的数据。
我需要找到一种方法来定义一个模板,该模板可用作从 XML 文件填充数据并创建输出文档的基线。
我相信有两种方法可以做到这一点。
- 创建一个将成为 "template" 的 XSLT 文件,并使用它与 XML 文件结合使用来生成 Word 文档。
- 使用 Word 中的内容控件创建模板文档并以某种方式映射到 XML 文件。
我只是不知道如何实施这两种方式的细节。或者不确定是否有另一种更简单的方法来完成此任务。
有人可以举例说明如何实现这一点。一个简单的例子就足够了。
我更喜欢使用 C# 进行任何编码。我正在使用 Word 2016,但希望它兼容 Word 2007 到 Word 2016 以及介于两者之间的所有版本(如果可能的话),因为用户将使用这些版本。谢谢!
好的,在此处找到了使用 XSLT 作为模板生成 Word 文档的详细指南:Using XSLT and Open XML to Create a Word 2007 Document。
看起来即使这篇文章是针对 Word 2007 的,它在 Word 2016 中也能完美运行。
此方法的唯一问题是,如果以后需要更改模板,更新 xslt 文件需要花费大量精力,而且这样做对用户不友好,因为它不能在 Word 本身和需要对文档的实际 XML 进行操作。
从好的方面来说,文档生成非常灵活,通过 XSL 可以使用所有功能(foreach、变量、if 条件等)
了解如何使用内容控件生成文档以及如何将数据从 XML 填充到内容控件中。我将其分为两部分:
- 第 1 部分:创建用于文档生成的模板文档
- 第 2 部分:使用 C# 中的代码基于模板生成文档
第 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 模板。 XML 以后从模板生成 Word 文档时,可以应用具有相同格式的真实数据的文件。
注意 2:xmlns
属性可以包含任何您想要的字面意思,它不必是 URL 以 http 开头。
将您的示例 XML 文件保存到任何位置,以便可以将其导入到您要创建的模板中。
确保
Developer
选项卡在您的 Word 副本上启用 [File
->Options
->Customize Ribbon
-> 在Customize the Ribbon
,确保Developer
是 selected ->OK
]。详情:How to: Show the Developer Tab on the Ribbon创建一个新的 Word 文档(或使用现有的 Word 文档)作为文档生成的模板。
在
Developer
选项卡上,单击XML Mapping Pane
。这将打开文档右侧的XML Mapping Pane
。在 XML 映射窗格中,select
Custom XML Part
下拉列表 -> Select(Add new part)
.Select 您在步骤 1 中保存的 XML 文件 ->
Open
.在 XML 映射窗格中,select
Custom XML Part
下拉列表 -> Select 包含xmlns
自定义 XML 文件的属性。如果您使用上面的示例文件,它将是http://CustomDemoXML.htm
.向 Word 文档添加一些静态文本并在其旁边添加一个
Plain Text Content Control
(在Developer
选项卡 ->Controls
部分。重复您需要添加的所有字段。
对于上面的示例 XML,我有以下 Word 文档:
- 单击第一个
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 功能,没有任何第三方工具!
- 保存模板文档。
第 2 部分:使用 C# 中的代码基于模板生成文档
这使用 Microsoft 推荐的 OpenXML SDK 使用包含真实数据的 XML 文件生成文档。
构建您的 XML file/open 现有 XML 文件,用于从上面创建的模板生成文档。这需要与用于创建模板的示例 XML 文件的格式相同。
使用 OpenXML SDK 从文档中删除任何
CustomXMLPart
元素。这假设文档中没有使用其他自定义 XML 部分,在本例中就是这种情况。对于复杂的场景,您可以根据需要删除特定的 XML 部分。使用 OpenXML SDK 添加新的
CustomXMLPart
基于上面第 1 步中的 XML 文件。
这是示例代码,我必须 "refresh"/"reload" 模板中的示例数据以及来自包含真实数据的 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);
}
}
}
}
}
就是这样!
我们创建了一种将 XML 文件数据填充到 Word 或 PowerPoint 文档中的自动化方法。我们利用一个插件,该插件使用内容控件 link Excel 内容(范围、表格、图表、形状等)到 Word 或 PowerPoint。 link 是便携且坚固的。如果您需要对文档进行任何更改,它也很容易更新。您可以通过 Excel 应用程序找到加载项 - 只需通过“插入”选项卡上的“获取加载项”搜索加载项“Excel-to-Word Document Automation”。您还可以找到更多相关信息 here.