Mail Merge地域を指定します
テンプレートにさまざまなリージョンを作成して、データを入力するだけの特別な領域を作成できます。 テンプレート内でこれらの領域を指定してドキュメントを動的に拡張するために、繰り返しデータを含むテーブル、行を挿入する場合は、mail mergewith regionsを使用し
入れ子になった(子)リージョンを作成したり、マージリージョンを作成したりすることができます。 このタイプを使用する主な利点は、ドキュメント内のパーツを動的に増やすことです。 詳細については、次の記事"NestedMail Mergewith Regions"を参照してください。
地域でMail Mergeを実行する方法
Mail merge領域は、開始点と終了点を持つドキュメント内の特定の部分です。 両方の点は、特定の名前*“TableStart:XXX”*と*“TableEnd:XXX”*を持つmail mergeフィールドとして表されます。 mail mergeリージョンに含まれているすべてのコンテンツは、データソース内のすべてのレコードに対して自動的に繰り返されます。
Aspose.Wordsを使用すると、IMailMergeDataSourceカスタムデータソースを受け入れるExecuteWithRegionsメソッドのいずれかを使用して、リージョンでmail mergeを実行できます。
次のコード例は、sqliteデータベースのリージョンでmail mergeを実行する方法を示しています 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インターフェイスを実装する必要があります。
これらのルールのいずれかが壊れている場合は、予期しない結果が得られるか、例外がスローされる可能性があります。