Chèn CheckboxEs, Nhập Văn bản hoặc Hình ảnh
Công cụ hợp nhất lấy một tài liệu làm đầu vào, tìm kiếm MERGEFIELD
các trường trong đó và thay thế chúng bằng dữ liệu thu được từ nguồn dữ liệu. Thông thường, văn bản thuần túy và HTML được chèn vào, nhưng Aspose.Words người dùng cũng có thể tạo một tài liệu xử lý các tình huống bất thường hơn cho Mail Merge lĩnh vực.
Mạnh mẽ Aspose.Words chức năng cho phép bạn mở rộng Mail Merge quy trình:
- chèn các hộp kiểm và các trường biểu mẫu nhập văn bản vào tài liệu trong một mail merge
- chèn hình ảnh từ bất kỳ bộ nhớ tùy chỉnh nào (tệp, BLOB lĩnh vực, vv)
Chèn CheckboxEs Và Nhập Văn bản trong Mail Merge
Đôi khi cần phải thực hiện một Mail Merge hoạt động để không văn bản được thay thế trong trường hợp nhất, nhưng một hộp kiểm hoặc trường nhập văn bản. Mặc dù đây không phải là kịch bản phổ biến nhất, nhưng nó rất tiện dụng cho một số nhiệm vụ.
Ảnh chụp màn hình Sau của Tài liệu Word hiển thị một mẫu với các trường hợp nhất:

Ảnh chụp màn Hình Của Tài Liệu Word bên dưới hiển thị tài liệu đã được tạo:

Subject
trường đã được thay thế bằng trường nhập văn bản.
Ví dụ mã sau đây cho thấy cách chèn các hộp kiểm và các trường văn bản đầu vào vào tài liệu trong một mail merge:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(MyDir + u"Mail merge destinations - Fax.docx"); | |
// Setup mail merge event handler to do the custom work. | |
doc->get_MailMerge()->set_FieldMergingCallback(MakeObject<WorkingWithFields_::HandleMergeField>()); | |
// Trim trailing and leading whitespaces mail merge values. | |
doc->get_MailMerge()->set_TrimWhitespaces(false); | |
ArrayPtr<String> fieldNames = | |
MakeArray<String>({u"RecipientName", u"SenderName", u"FaxNumber", u"PhoneNumber", u"Subject", u"Body", u"Urgent", u"ForReview", u"PleaseComment"}); | |
ArrayPtr<SharedPtr<System::Object>> fieldValues = MakeArray<SharedPtr<System::Object>>( | |
{System::ObjectExt::Box<String>(u"Josh"), System::ObjectExt::Box<String>(u"Jenny"), System::ObjectExt::Box<String>(u"123456789"), | |
System::ObjectExt::Box<String>(u""), System::ObjectExt::Box<String>(u"Hello"), System::ObjectExt::Box<String>(u"<b>HTML Body Test message 1</b>"), | |
System::ObjectExt::Box<bool>(true), System::ObjectExt::Box<bool>(false), System::ObjectExt::Box<bool>(true)}); | |
doc->get_MailMerge()->Execute(fieldNames, fieldValues); | |
doc->Save(ArtifactsDir + u"WorkingWithFields.MailMergeFormFields.docx"); |
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class HandleMergeField : public IFieldMergingCallback | |
{ | |
private: | |
SharedPtr<DocumentBuilder> mBuilder; | |
/// <summary> | |
/// This handler is called for every mail merge field found in the document, | |
/// for every record found in the data source. | |
/// </summary> | |
void FieldMerging(SharedPtr<FieldMergingArgs> e) override | |
{ | |
if (mBuilder == nullptr) | |
{ | |
mBuilder = MakeObject<DocumentBuilder>(e->get_Document()); | |
} | |
// We decided that we want all boolean values to be output as check box form fields. | |
if (System::ObjectExt::Is<bool>(e->get_FieldValue())) | |
{ | |
// Move the "cursor" to the current merge field. | |
mBuilder->MoveToMergeField(e->get_FieldName()); | |
String checkBoxName = String::Format(u"{0}{1}", e->get_FieldName(), e->get_RecordIndex()); | |
mBuilder->InsertCheckBox(checkBoxName, System::ObjectExt::Unbox<bool>(e->get_FieldValue()), 0); | |
return; | |
} | |
if (e->get_FieldName() == u"Body") | |
{ | |
mBuilder->MoveToMergeField(e->get_FieldName()); | |
mBuilder->InsertHtml(System::ObjectExt::Unbox<String>(e->get_FieldValue())); | |
} | |
else if (e->get_FieldName() == u"Subject") | |
{ | |
mBuilder->MoveToMergeField(e->get_FieldName()); | |
String textInputName = String::Format(u"{0}{1}", e->get_FieldName(), e->get_RecordIndex()); | |
mBuilder->InsertTextInput(textInputName, TextFormFieldType::Regular, u"", System::ObjectExt::Unbox<String>(e->get_FieldValue()), 0); | |
} | |
} | |
void ImageFieldMerging(SharedPtr<ImageFieldMergingArgs> args) override | |
{ | |
args->set_ImageFileName(u"Image.png"); | |
args->get_ImageWidth()->set_Value(200); | |
args->set_ImageHeight(MakeObject<MergeFieldImageDimension>(200, MergeFieldImageDimensionUnit::Percent)); | |
} | |
}; |
Chèn Hình ảnh trong Mail Merge
Khi thực hiện một Mail Merge hoạt động, bạn có thể chèn hình ảnh từ cơ sở dữ liệu vào tài liệu bằng hình ảnh đặc biệt Mail Merge lĩnh vực. Hình ảnh Mail Merge trường là một trường hợp nhất Có Tên Hình Ảnh:MyFieldName.
Chèn Hình ảnh từ Cơ sở Dữ liệu
Trong một mail merge, khi một hình ảnh Mail Merge trường gặp phải trong một tài liệu, FieldMergingCallback sự kiện bị sa thải. Bạn có thể trả lời sự kiện này để trả về tên tệp, luồng hoặc đối tượng hình ảnh cho Mail Merge động cơ để nó có thể được chèn vào tài liệu.
Ví dụ mã sau đây cho thấy cách chèn hình ảnh được lưu trữ trong cơ sở dữ liệu BLOB trường vào một báo cáo:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
// MERGEFIELDs with "Image:" tags will receive an image during a mail merge. | |
// The string after the colon in the "Image:" tag corresponds to a column name | |
// in the data source whose cells contain URIs of image files. | |
builder->InsertField(u"MERGEFIELD Image:logo_FromWeb "); | |
builder->InsertField(u"MERGEFIELD Image:logo_FromFileSystem "); | |
// Create a data source that contains URIs of images that we will merge. | |
// A URI can be a web URL that points to an image, or a local file system filename of an image file. | |
ArrayPtr<String> columns = MakeArray<String>({u"logo_FromWeb", u"logo_FromFileSystem"}); | |
ArrayPtr<SharedPtr<System::Object>> URIs = | |
MakeArray<SharedPtr<System::Object>>({System::ObjectExt::Box<String>(ImageUrl), System::ObjectExt::Box<String>(ImageDir + u"Logo.jpg")}); | |
// Execute a mail merge on a data source with one row. | |
doc->get_MailMerge()->Execute(columns, URIs); | |
doc->Save(ArtifactsDir + u"MailMergeEvent.ImageFromUrl.docx"); |
Đặt Thuộc tính Hình ảnh trong Mail Merge
Trong khi hợp nhất trường hợp nhất hình ảnh, đôi khi bạn có thể cần kiểm soát các thuộc tính hình ảnh khác nhau, chẳng hạn như WrapType.
Hiện tại, sử dụng ImageFieldMergingArgs bạn chỉ có thể đặt thuộc tính chiều rộng hoặc chiều cao hình ảnh, tương ứng. Để khắc phục vấn đề này, Aspose.Words cung cấp Shape tài sản, tạo điều kiện để có toàn quyền kiểm soát hình ảnh được chèn hoặc bất kỳ hình dạng nào khác.
Ví dụ mã sau đây cho thấy cách đặt các thuộc tính hình ảnh khác nhau:
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"{{#foreach example}}"); | |
builder->Writeln(u"{{Image(126pt;126pt):stempel}}"); | |
builder->Writeln(u"{{/foreach example}}"); | |
doc->get_MailMerge()->set_UseNonMergeFields(true); | |
doc->get_MailMerge()->set_TrimWhitespaces(true); | |
doc->get_MailMerge()->set_UseWholeParagraphAsRegion(false); | |
doc->get_MailMerge()->set_CleanupOptions(MailMergeCleanupOptions::RemoveEmptyTableRows | MailMergeCleanupOptions::RemoveContainingFields | | |
MailMergeCleanupOptions::RemoveUnusedRegions | MailMergeCleanupOptions::RemoveUnusedFields); | |
doc->get_MailMerge()->set_FieldMergingCallback(MakeObject<WorkingWithFields_::ImageFieldMergingHandler>()); | |
doc->get_MailMerge()->ExecuteWithRegions(MakeObject<WorkingWithFields_::DataSourceRoot>()); | |
doc->Save(ArtifactsDir + u"WorkingWithFields.MailMergeImageField.docx"); |
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class ImageFieldMergingHandler : public IFieldMergingCallback | |
{ | |
private: | |
void FieldMerging(SharedPtr<FieldMergingArgs> args) override | |
{ | |
ASPOSE_UNUSED(args); | |
// Implementation is not required. | |
} | |
void ImageFieldMerging(SharedPtr<ImageFieldMergingArgs> args) override | |
{ | |
auto shape = MakeObject<Shape>(args->get_Document(), ShapeType::Image); | |
shape->set_Width(126); | |
shape->set_Height(126); | |
shape->set_WrapType(WrapType::Square); | |
shape->get_ImageData()->SetImage(MyDir + u"Mail merge image.png"); | |
args->set_Shape(shape); | |
} | |
}; |
//For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class DataSourceRoot : public IMailMergeDataSourceRoot | |
{ | |
private: | |
class DataSource : public IMailMergeDataSource | |
{ | |
public: | |
bool MoveNext() override | |
{ | |
bool result = next; | |
next = false; | |
return result; | |
} | |
SharedPtr<IMailMergeDataSource> GetChildDataSource(String s) override | |
{ | |
ASPOSE_UNUSED(s); | |
return nullptr; | |
} | |
bool GetValue(String fieldName, SharedPtr<System::Object>& fieldValue) override | |
{ | |
ASPOSE_UNUSED(fieldName); | |
fieldValue.reset(); | |
return false; | |
} | |
DataSource() : next(true) | |
{ | |
} | |
private: | |
bool next; | |
String get_TableName() override | |
{ | |
return TableName(); | |
} | |
String TableName() | |
{ | |
return u"example"; | |
} | |
}; | |
public: | |
SharedPtr<IMailMergeDataSource> GetDataSource(String s) override | |
{ | |
ASPOSE_UNUSED(s); | |
return MakeObject<WorkingWithFields_::DataSourceRoot::DataSource>(); | |
} | |
}; |