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 지역:

제한 사항 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 인터페이스
이러한 규칙 중 하나가 깨진 경우 예기치 않은 결과를 얻거나 예외가 발생할 수 있습니다.