Вложени Mail Merge С региони
В някои сценарии може да се наложи да използвате вложени Mail Merge С региони. Вложено обединяване е функция, която ви позволява да обедините йерархични данни от вашия източник на данни във вашия шаблон за обединяване, за да попълните лесно вашия документ. По принцип йерархичните данни се представят като набор от елементи от данни, а йерархичните зависимости описват как елементите от данни са свързани помежду си (един елемент от данни е родител на друг).
Aspose.Words ви позволява да извършите операция Mail Merge с вложени региони. Можете да използвате тази функция, ако имате източник на данни, който е организиран в дървовидна структура и искате да изпълните операция Mail Merge, за да попълните шаблон с йерархични данни.
Какво е вложено Mail Merge
Областта Mail Merge се нарича вложена, ако имате две или повече Mail Merge региони, където един от тях е вътре в другия в йерархична форма. Имайте предвид, че всеки регион съдържа данни от една таблица.
Най-често срещаният пример за вложено Mail Merge е поръчка, която съдържа няколко елемента, където трябва да свържете много таблици с данни и да представите информацията в шаблон.
Снимката по-долу показва два вложени региона, където регионът Order Mail Merge е родител на региона Item Mail Merge.

Как да обработваме Mail Merge С вложени региони
Данните, които трябва да бъдат обединени в шаблон, могат да идват от различни източници, главно релационни бази данни или XML документи. В нашия пример ще използваме SQLite база данни за съхранение на нашите данни и да го заредите с потребителски източник на данни изпълнение.
Изображението по-долу показва как данните от таблицата Order, предадени на вложените региони за обединяване, ще бъдат свързани с таблицата Item, както и резултатите, генерирани по време на операцията по сливане.

Както можете да видите от изходния документ, всяка поръчка от таблицата Order се вмъква в шаблона за обединяване с всички свързани с поръчката елементи от таблицата Item. Следващата поръчка ще бъде вмъкната заедно с техните артикули, докато не бъдат изброени всички поръчки и артикули. Редът на влагане Mail Merge С региони в шаблона трябва да съответства на релациите от данни между таблиците в източника на данни.
Как да създадете Релации от потребителски източник на данни
Имплементирайте интерфейса IMailMergeDataSource, За да създадете релации в структурата родител-дете на вашия потребителски източник на данни. Използвайте метода GetChildDataSource, за да върнете съответните данни на детето от текущия запис на родител.
Следващият пример за код показва как да генерирате фактура, използвайки вложени 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; | |
}; |