Prosta Operacja Mail Merge

Prosty Mail Merge służy do wypełnienia pól Mail Merge w szablonie wymaganymi danymi ze źródła danych (reprezentacja pojedynczej tabeli). Jest więc podobny do klasycznego Mail Merge w Microsoft Word.

Możesz dodać jedno lub więcej pól scalania w szablonie, a następnie wykonać prostą operację Mail Merge. Zaleca się użycie go, jeśli szablon nie zawiera żadnych regionów scalania.

Głównym ograniczeniem używania tego typu jest to, że cała zawartość dokumentu zostanie powtórzona dla każdego rekordu w źródle danych.

Jak wykonać prostą operację Mail Merge

Gdy szablon będzie gotowy, możesz rozpocząć wykonywanie prostej operacji Mail Merge. Aspose.Words umożliwia wykonanie prostej operacji Mail Merge przy użyciu różnych metod Execute, które akceptują różne obiekty danych jako źródło danych.

Poniższy przykład kodu pokazuje, jak wykonać prostą operację Mail Merge przy użyciu jednej z metod Execute:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->InsertField(u" MERGEFIELD CustomerName ");
builder->InsertParagraph();
builder->InsertField(u" MERGEFIELD Item ");
builder->InsertParagraph();
builder->InsertField(u" MERGEFIELD Quantity ");
auto boxHelper = [](const char16_t* value) { return System::ObjectExt::Box<String>(value); };
// Fill the fields in the document with user data.
doc->get_MailMerge()->Execute(
MakeArray<String>({u"CustomerName", u"Item", u"Quantity"}),
MakeArray<SharedPtr<System::Object>>(
{ boxHelper(u"John Doe"), boxHelper(u"Hawaiian"), boxHelper(u"2")}));
doc->Save(ArtifactsDir + u"BaseOperations.SimpleMailMerge.docx");

Możesz zauważyć różnicę między dokumentem przed wykonaniem prostego mail merge:

simple_mail_merge_template-aspose-words-cpp

I po wykonaniu prostego mail merge:

execute_simple_mail_merge-aspose-words-cpp

Jak utworzyć wiele scalonych dokumentów

W Aspose.Words standardowa operacja Mail Merge wypełnia tylko jeden dokument treścią ze źródła danych. Tak więc będziesz musiał wykonać operację Mail Merge wiele razy, aby utworzyć kilka scalonych dokumentów jako dane wyjściowe.

Poniższy przykład kodu pokazuje, jak wygenerować kilka scalonych dokumentów podczas operacji Mail Merge z SQLiteCpp:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
void MultipleDocumentsMailMerge()
{
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->InsertField(u" MERGEFIELD FullName ");
builder->InsertParagraph();
builder->InsertField(u" MERGEFIELD Address ");
// Fill the fields in the document with user data.
SQLite::Database database{ (std::string)(DatabaseDir + u"customers.db3") };
SQLite::Statement query{ database, "SELECT * FROM Customers" };
auto dataSource = MakeObject<CustomersRowMailMergeDataSource>(query);
int32_t counter = 1;
while (query.executeStep())
{
dataSource->Reset();
doc->get_MailMerge()->Execute(dataSource);
doc->Save(ArtifactsDir + u"BaseOperations.MultipleDocumentsMailMerge_" + counter++ + u".docx");
}
}
class CustomersRowMailMergeDataSource : public MailMerging::IMailMergeDataSource
{
public:
CustomersRowMailMergeDataSource(SQLite::Statement& query) : mQuery(query) {}
String get_TableName() override
{
return u"Customers";
}
bool GetValue(String fieldName, SharedPtr<Object>& fieldValue) override
{
auto boxHelper = [](const std::string& value) { return System::ObjectExt::Box<String>(String::FromUtf8(value)); };
if (fieldName == u"FullName")
{
fieldValue = boxHelper(mQuery.getColumn(1).getString());
return true;
}
if (fieldName == u"Address")
{
fieldValue = boxHelper(mQuery.getColumn(2).getString());
return true;
}
fieldValue.reset();
return false;
}
bool MoveNext() override
{
if (!isInitialized)
{
isInitialized = true;
return true;
}
return false;
}
SharedPtr<IMailMergeDataSource> GetChildDataSource(String tableName) override
{
return nullptr;
}
void Reset()
{
isInitialized = false;
}
private:
SQLite::Statement& mQuery;
bool isInitialized = false;
};