Mail Merge กับภูมิภาค

คุณสามารถสร้างภูมิภาคต่างๆในเทมเพลตของคุณเพื่อให้มีพื้นที่พิเศษที่คุณสามารถกรอกข้อมู ใช้ Mail Merge ด้วยพื้นที่หากคุณต้องการแทรกตารางแถวที่มีข้อมูลซ้ำเพื่อให้เอกสารของคุณเติบโตแบบได.

คุณสามารถสร้างพื้นที่ที่ซ้อนกัน(เด็ก)รวมทั้งผสานพื้นที่ ข้อได้เปรียบหลักของการใช้ประเภทนี้คือการเพิ่มชิ้นส่วนภายในเอกสารแบบไดนามิก ดูรายละเอียดเพิ่มเติมในบทความถัดไป"ซ้อนกัน Mail Merge กับภูมิภาค".

วิธีการดำเนินการ Mail Merge กับภูมิภาค

A Mail Merge ภูมิภาคเป็นส่วนที่เฉพาะเจาะจงภายในเอกสารที่มีจุดเริ่มต้นและจุดสิ้นสุด จุดทั้งสองจะแสดงเป็น Mail Merge ช่องที่มีชื่อเฉพาะ “TableStart:XXX” และ “TableEnd:XXX”. เนื้อหาทั้งหมดที่รวมอยู่ใน Mail Merge ภูมิภาคจะถูกทำซ้ำโดยอัตโนมัติสำหรับทุกระเบียนในแหล่งข้อมูล.

Aspose.Words ช่วยให้คุณสามารถดำเนินการ Mail Merge กับภูมิภาคโดยใช้อย่างใดอย่างหนึ่ง ExecuteWithRegions วิธีการที่ยอมรับ IMailMergeDataSource แหล่งข้อมูลที่กำหนดเอง.

ตัวอย่างรหัสต่อไปนี้แสดงวิธีการดำเนินการ 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_with_regions_template

และหลังจากที่ดำเนินการ Mail Merge กับภูมิภาค:

mail_merge_with_regions_execute

ข้อจำกัดของ 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 อินเตอร์เฟซ.

ถ้าหนึ่งในกฎเหล่านี้เสียคุณจะได้รับผลลัพธ์ที่ไม่คาดคิดหรือข้อยกเว้นอาจจะโยน.