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 与地区:

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