Mail Merge和报告
Mail Merge是一种流行的功能,用于快速轻松地创建信件,标签和信封等文档。 Aspose.Words使您能够从具有Mail Merge字段的模板生成文档。
Mail Merge字段是一个字段,您可以将其插入到mail merge模板中,以在输出文档中包含来自数据源记录的特定值。 例如,您可以在电子邮件模板中插入合并字段,以便问候语将具有收件人的名字,而不是通用的"你好!". Aspose.Words将来自外部源(如数据库或文件)的数据放入这些字段并设置格式。 生成的文档保存在指定的文件夹中。
Aspose.Words采用标准Mail Merge功能,并向前推进许多步骤,将其转变为成熟的报告解决方案,允许您创建更复杂的文档,如报告、目录、库存和发票。 以下是Aspose.Words报告解决方案的一些优点:
- 使用标准Mail Merge字段在Microsoft Word中设计报表
- 定义文档中不断增长的区域,例如详细订单行
- 在mail merge期间插入图像
- 使用Mail Merge事件处理程序执行任何自定义逻辑、控制格式设置或插入复杂内容
- 使用任何类型的数据源中的数据填写文档
Mail Merge {#mechanism-and-main-components-of-a-mail-merge-operation}的机制和主要组成部分
Aspose.Words提供了在各种支持的格式中加载文档的能力,然后允许用户执行Mail Merge操作。
通常,加载的文档允许您存储合并字段,例如DOCX格式的文档。 但是有些格式不存储这些字段,例如TXT。 如果Aspose.Words支持加载此类文件格式,则可以将合并字段直接添加到文档模型中,将文档保存在方便的支持的格式中,然后执行Mail Merge操作。
Mail Merge操作将合并您的mail merge template和您的data source以生成单个merged documents。
什么是Mail Merge模板
使用合并模板应用mail merge操作的目标是简化创建文档的过程。
有几种方法可以创建和设计合并模板。 您可以使用Microsoft Word,并且合并模板不必是Microsoft Word模板,即DOT或DOTX格式的文档,它可以是DOC或DOCX格式的常规文档。 您需要将一些称为合并字段的特殊字段插入到此模板中,以便稍后插入数据源中的数据。 或者您可以使用DocumentBuilder类以编程方式创建合并模板。
合并模板包含主文本,在执行Mail Merge操作后,主文本在所有输出文档中应相同。 如果能够向模板添加合并字段,则可以为模板使用任何格式。 在Mail Merge操作期间,模板中的所有合并字段都将从数据源中填充。
Mail Merge操作 {#data-source-types-for-a-mail-merge-operation}的数据源
Aspose.WordsMail Merge接受各种数据源。 这可以是一个DataTable, DataView, DataSet, IDataReader, ADO.NET支持的值数组,或IMailMergeDataSource实现表示的自定义数据源。
数据源包含在Mail Merge操作期间拉取的所有信息,以便个性化单个电子邮件和文档。 数据源可以手动创建,也可以通过从现有数据库或应用程序报告生成。 如果您有XML格式的数据,则可以加载并将其与DataSet合并。 Mail Merge操作将遍历所有数据源记录,并将它们插入文档中的Mail Merge字段中。 您可以实现一些mail merge接口(如IMailMergeDataSourceRoot)来合并来自任何数据源的数据,包括LINQ查询、XML文件或业务对象。
下面的代码示例演示如何加载数据表作为Mail Merge操作的数据源:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
private static final String dataDir = Utils.getSharedDataDir(ExecuteMailMergeWithRegions.class) + "MailMerge/"; | |
public static void main(String[] args) throws Exception { | |
Document doc = new Document(dataDir + "MailMerge.ExecuteWithRegions.doc"); | |
int orderId = 10444; | |
// Perform several mail merge operations populating only part of the document each time. | |
// Use DataTable as a data source. | |
// The table name property should be set to match the name of the region defined in the document. | |
DataTable orderTable = getTestOrder(orderId); | |
doc.getMailMerge().executeWithRegions(orderTable); | |
DataTable orderDetailsTable = getTestOrderDetails(orderId, "ExtendedPrice DESC"); | |
doc.getMailMerge().executeWithRegions(orderDetailsTable); | |
doc.save(dataDir + "MailMerge.ExecuteWithRegionsDataTable Out.doc"); | |
} | |
private static DataTable getTestOrder(int orderId) throws Exception { | |
java.sql.ResultSet resultSet = executeDataTable(java.text.MessageFormat.format("SELECT * FROM AsposeWordOrders WHERE OrderId = {0}", Integer.toString(orderId))); | |
return new DataTable(resultSet, "Orders"); | |
} | |
private static DataTable getTestOrderDetails(int orderId, String orderBy) throws Exception { | |
StringBuilder builder = new StringBuilder(); | |
builder.append(java.text.MessageFormat.format("SELECT * FROM AsposeWordOrderDetails WHERE OrderId = {0}", Integer.toString(orderId))); | |
if ((orderBy != null) && (orderBy.length() > 0)) { | |
builder.append(" ORDER BY "); | |
builder.append(orderBy); | |
} | |
java.sql.ResultSet resultSet = executeDataTable(builder.toString()); | |
return new DataTable(resultSet, "OrderDetails"); | |
} | |
/** | |
* Utility function that creates a connection, command, executes the command | |
* and return the result in a DataTable. | |
*/ | |
private static java.sql.ResultSet executeDataTable(String commandText) throws Exception { | |
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); | |
String connString = "jdbc:ucanaccess://" + dataDir + "Northwind.mdb"; | |
// From Wikipedia: The Sun driver has a known issue with character encoding and Microsoft Access databases. | |
// Microsoft Access may use an encoding that is not correctly translated by the driver, leading to the replacement | |
// in strings of, for example, accented characters by question marks. | |
// | |
// In this case I have to set CP1252 for the European characters to come through in the data values. | |
java.util.Properties props = new java.util.Properties(); | |
props.put("charSet", "Cp1252"); | |
// DSN-less DB connection. | |
java.sql.Connection conn = java.sql.DriverManager.getConnection(connString, props); | |
// Create and execute a command. | |
java.sql.Statement statement = conn.createStatement(); | |
return statement.executeQuery(commandText); | |
} |
Mail Merge操作 {#merged-documents-of-a-mail-merge-operation}的合并文档
合并文档是将模板与数据源合并时Mail Merge操作的结果。 合并文档中的所有合并字段都将替换为数据源中的实际数据。
下图显示了在执行Mail Merge操作之前具有合并字段的合并模板的示例。
下图显示了执行Mail Merge操作后输出合并文档的示例。