Word 文档的自动生成被企业广泛用于创建大量报告。在某些情况下,文档是从头开始创建的。另一方面,预定义模板用于通过填充占位符来生成 Word 文档。在本文中,我将演示如何在 C# 中以动态和编程方式从模板生成 Word 文档。您将了解如何从不同类型的数据源填充 Word 模板。
本文将介绍以下场景以及代码示例:
C# 文字自动化 API
我们将使用 Aspose.Words for .NET - 一个 Word 自动化 API,允许您从头开始或通过填充预定义的 Word 模板来生成 Word 文档。您可以 下载 API 的二进制文件或使用以下方法之一安装它。
使用 NuGet 包管理器
使用包管理器控制台
PM> Install-Package Aspose.Words
使用 C# 对象从模板生成 Word 文档
首先,让我们看看如何使用 C# 对象填充 Word 模板。为此,我们将创建一个 Word 文档 (DOC/DOCX),其中包含以下占位符作为文档内容:
<<[sender.Name]>> says: "<<[sender.Message]>>."
在这里,发送者是我们将用于填充模板的以下类的对象。
public class Sender
{
public string Name { get; set; }
public string Message { get; set; }
public Sender (string _name, string _message)
{
Name = _name;
Message = _message;
}
}
现在,我们将使用 Aspose.Words 的报告引擎,按照以下步骤从模板和 Sender 类的对象生成 Word 文档。
- 创建 Document 类的对象并使用 Word 模板的路径对其进行初始化。
- 创建并初始化 Sender 类的对象。
- 实例化 ReportingEngine 类。
- 使用将 Document 的对象、数据源和数据源名称作为参数的 ReportingEngine.BuildReport() 填充模板。
- 使用 Document.Save() 方法保存生成的 Word 文档。
以下代码示例展示了如何在 C# 中从模板生成 Word 文档。
Document doc = new Document("template.docx");
Sender sender = new Sender("LINQ Reporting Engine", "Hello World");
ReportingEngine engine = new ReportingEngine();
engine.BuildReport(doc, sender, "sender");
doc.Save("word.docx");
输出
在 C# 中从 XML 数据源生成 Word 文档
为了从 XML 数据源生成 Word 文档,我们将使用更复杂的 Word 模板,其中包含以下占位符:
<<foreach [in persons]>>Name: <<[Name]>>, Age: <<[Age]>>, Date of Birth: <<[Birth]:"dd.MM.yyyy">>
<</foreach>>
Average age: <<[persons.Average(p => p.Age)]>>
下面给出了我在本示例中使用的 XML 数据源。
<Persons>
<Person>
<Name>John Doe</Name>
<Age>30</Age>
<Birth>1989-04-01 4:00:00 pm</Birth>
</Person>
<Person>
<Name>Jane Doe</Name>
<Age>27</Age>
<Birth>1992-01-31 07:00:00 am</Birth>
</Person>
<Person>
<Name>John Smith</Name>
<Age>51</Age>
<Birth>1968-03-08 1:00:00 pm</Birth>
</Person>
</Persons>
以下是从 XML 数据源生成 Word 文档的步骤:
- 创建 Document 类的实例并使用 Word 模板的路径对其进行初始化。
- 创建 XmlDataSource 类的实例并使用 XML 文件的路径对其进行初始化。
- 实例化 ReportingEngine 类。
- 使用 ReportingEngine.BuildReport() 方法,就像我们之前用来填充 Word 模板一样。
- 使用 Document.Save() 方法保存生成的 Word 文档。
以下代码示例展示了如何在 C# 中从 XML 数据源生成 Word 文档。
Document doc = new Document("template.docx");
XmlDataSource dataSource = new XmlDataSource("datasource.xml");
ReportingEngine engine = new ReportingEngine();
engine.BuildReport(doc, dataSource, "persons");
doc.Save("word.docx");
输出
在 C# 中从 JSON 数据源生成 Word 文档
现在让我们看看如何使用 JSON 数据源生成 Word 文档。在此示例中,我们将生成按经理分组的客户列表。在这种情况下,以下是 Word 模板:
<<foreach [in managers]>>Manager: <<[Name]>>
Contracts:
<<foreach [in Contract]>>- <<[Client.Name]>> ($<<[Price]>>)
<</foreach>>
<</foreach>>
以下是我们将用于填充模板的 JSON 数据源:
[
{
Name: "John Smith",
Contract:
[
{
Client:
{
Name: "A Company"
},
Price: 1200000
},
{
Client:
{
Name: "B Ltd."
},
Price: 750000
},
{
Client:
{
Name: "C & D"
},
Price: 350000
}
]
},
{
Name: "Tony Anderson",
Contract:
[
{
Client:
{
Name: "E Corp."
},
Price: 650000
},
{
Client:
{
Name: "F & Partners"
},
Price: 550000
}
]
},
]
为了从 JSON 生成 Word 文档,我们将使用 JsonDataSource 类来加载和使用 JSON 数据源,其余步骤将保持不变。以下代码示例展示了如何使用 C# 中的 JSON 从模板生成 Word 文档。
Document doc = new Document("template.docx");
JsonDataSource dataSource = new JsonDataSource("datasource.json");
ReportingEngine engine = new ReportingEngine();
engine.BuildReport(doc, dataSource, "managers");
doc.Save("word.docx");
输出
在 C# 中从 CSV 数据源生成 Word 文档
为了从 CSV 生成 Word 文档,我们将使用以下 Word 模板:
<<foreach [in persons]>>Name: <<[Column1]>>, Age: <<[Column2]>>, Date of Birth: <<[Column3]:"dd.MM.yyyy">>
<</foreach>>
Average age: <<[persons.Average(p => p.Column2)]>>
该模板将填充以下 CSV 数据:
John Doe,30,1989-04-01 4:00:00 pm
Jane Doe,27,1992-01-31 07:00:00 am
John Smith,51,1968-03-08 1:00:00 pm
现在,让我们来看看 C# 代码。除了我们将使用 CsvDataSource 类来加载 CSV 数据这一变化之外,所有步骤在此处也将保持不变。以下代码示例显示如何从 CSV 数据源生成 Word 文档。
Document doc = new Document("template.docx");
CsvDataSource dataSource = new CsvDataSource("datasource.csv");
ReportingEngine engine = new ReportingEngine();
engine.BuildReport(doc, dataSource, "persons");
doc.Save("word.docx");
输出
免费试用 Aspose.Words for .NET
您可以使用免费的 临时许可证 试用 Aspose.Words for .NET。
结论
在本文中,您学习了如何使用 C# 从模板生成 Word 文档。此外,您还了解了如何使用对象、XML、JSON 和 CSV 数据源来生成 Word 文档。您可以使用 文档 探索有关 C# Word 自动化 API 的更多信息。此外,您可以通过我们的 论坛 与我们联系。