Mail Merge 与地区

您可以在模板中创建不同的区域,以便具有可以简单地填充数据的特殊区域。 使用 Mail Merge 使用区域如果要插入表,则可以通过在模板中指定这些区域来插入具有重复数据的行,以使文档动态增长。

您可以创建嵌套(子)区域以及合并区域。 使用这种类型的主要优点是动态增加文档中的部分。 在下一篇文章"嵌套"中查看更多细节 Mail Merge 与地区"。

如何执行 Mail Merge 与地区

A Mail Merge 区域是文档中具有起点和终点的特定部分。 两个点都表示为 Mail Merge 具有特定名称的字段 “TableStart:XXX”“TableEnd:XXX”. 包含在a中的所有内容 Mail Merge 区域将自动为数据源中的每条记录重复。

Aspose.Words 允许您执行 Mail Merge 使用其中一个区域 ExecuteWithRegions 接受的方法 IMailMergeDataSource 自定义数据源。

下面的代码示例演示如何执行 Mail Merge 与来自sqlite数据库的区域 SQLiteCpp:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
void NestedMailMerge()
{
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->InsertField(u" MERGEFIELD TableStart:Customers");
builder->Write(u"Full name:\t");
builder->InsertField(u" MERGEFIELD FullName ");
builder->Write(u"\nAddress:\t");
builder->InsertField(u" MERGEFIELD Address ");
builder->Write(u"\nOrders:\n");
builder->InsertField(u" MERGEFIELD TableStart:Orders");
builder->Write(u"\tItem name:\t");
builder->InsertField(u" MERGEFIELD ItemName ");
builder->Write(u"\n\tQuantity:\t");
builder->InsertField(u" MERGEFIELD Quantity ");
builder->InsertParagraph();
builder->InsertField(u" MERGEFIELD TableEnd:Orders");
builder->InsertField(u" MERGEFIELD TableEnd:Customers");
SQLite::Database database((std::string)(DatabaseDir + u"customers.db3"));
// To be able to mail merge from your data source,
// it must be wrapped into an object that implements the IMailMergeDataSource interface.
auto customersDataSource = MakeObject<NestedMailMergeCustom::CustomersDataSource>(database);
doc->get_MailMerge()->ExecuteWithRegions(customersDataSource);
doc->Save(ArtifactsDir + u"NestedMailMergeCustom.CustomMailMerge.docx");
}
class OrdersDataSource : public MailMerging::IMailMergeDataSource
{
public:
OrdersDataSource(SQLite::Database& database, int32_t id)
: mQuery(database, "SELECT ItemName, Quantity FROM Orders WHERE CustomerId = ?")
{
mQuery.bind(1, id);
}
String get_TableName() override
{
return u"Orders";
}
bool GetValue(String fieldName, SharedPtr<Object>& fieldValue) override
{
if (fieldName == u"ItemName")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(0).getString()));
return true;
}
if (fieldName == u"Quantity")
{
fieldValue = System::ObjectExt::Box<int32_t>(mQuery.getColumn(1).getInt());
return true;
}
fieldValue.reset();
return false;
}
bool MoveNext() override
{
return mQuery.executeStep();
}
SharedPtr<IMailMergeDataSource> GetChildDataSource(String tableName) override
{
return nullptr;
}
private:
SQLite::Statement mQuery;
};
class CustomersDataSource : public MailMerging::IMailMergeDataSource
{
public:
CustomersDataSource(SQLite::Database& database)
: mDatabase{ database }
, mQuery{ mDatabase, "SELECT * FROM Customers" }
{
}
String get_TableName() override
{
return u"Customers";
}
bool GetValue(String fieldName, SharedPtr<Object>& fieldValue) override
{
if (fieldName == u"FullName")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(1).getString()));
return true;
}
if (fieldName == u"Address")
{
fieldValue = System::ObjectExt::Box<String>(String::FromUtf8(mQuery.getColumn(2).getString()));
return true;
}
fieldValue.reset();
return false;
}
bool MoveNext() override
{
return mQuery.executeStep();
}
SharedPtr<IMailMergeDataSource> GetChildDataSource(String tableName) override
{
if (tableName == u"Orders")
{
return MakeObject<OrdersDataSource>(mDatabase, mQuery.getColumn(0).getInt());
}
return nullptr;
}
private:
SQLite::Database& mDatabase;
SQLite::Statement mQuery;
};

您可以在执行之前注意到文档之间的差异 Mail Merge 与地区:

mail_merge_with_regions_template

执行后 Mail Merge 与地区:

mail_merge_with_regions_execute

的限制 Mail Merge 与地区

在执行一个 Mail Merge 与地区:

  • 起点 TableStart:Orders 和终点 TableEnd:Orders 两者都需要在同一行或单元格中。 例如,如果在表的单元格中开始合并区域,则必须在与第一个单元格相同的行中结束合并区域。 合并字段名称必须与您的 DataTable. 除非指定映射字段, Mail Merge 对于具有列名以外的名称的任何合并字段,使用区域都不会成功。
  • Aspose.Words 为 C++ 仅支持 IMailMergeDataSourceIMailMergeDataSourceRoot 基于数据源。 不像 .NET 和 Java, C++ 没有普遍接受的跨平台 API 用于处理数据库(如 ADODB, ODBC,或 JDBC). 为了使用特定的数据源,您必须实现 IMailMergeDataSourceIMailMergeDataSourceRoot 界面。

如果这些规则之一被破坏,您将得到意外的结果,或者可能引发异常。