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-and-reporting-aspose-words-java-1

下图显示了执行Mail Merge操作后输出合并文档的示例。

mail-merge-and-reporting-aspose-words-java-2

请参阅