插入 Checkboxes、文本输入或图像

合并引擎将文档作为输入,查找 MERGEFIELD 中的字段,并将其替换为从数据源获取的数据。 通常,纯文本和 HTML 被插入,但 Aspose.Words 用户还可以生成一个文档,用于处理更不寻常的情况 Mail Merge 菲尔兹。

强大 Aspose.Words 功能允许您扩展 Mail Merge 过程:

  • 在文档中插入复选框和文本输入表单字段 mail merge
  • 从任何自定义存储(文件)插入图像, BLOB 领域等。)

插入 Checkboxes和文本输入期间 Mail Merge

有时有必要执行一个 Mail Merge 操作,以便在合并字段中代替的不是文本,而是复选框或文本输入字段。 尽管这不是最常见的情况,但它对于某些任务来说非常方便。

Word文档的以下屏幕截图显示了具有合并字段的模板:

insert-checkboxes-or-images-mail-merge-aspose-words

下面Word文档的此屏幕截图显示了已经生成的文档:

insert-checkboxes-html-or-images-mail-merge-aspose-words

下面的代码示例演示如何在文档中插入复选框和输入文本字段 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));
}
};

期间插入图像 Mail Merge

当执行 Mail Merge 操作,您可以使用特殊图像将数据库中的图像插入到文档中 Mail Merge 菲尔兹。 图像 Mail Merge field是一个名为Image的合并字段:MyFieldName.

从数据库中插入图像

在一个 mail merge,当图像 Mail Merge 字段在文档中遇到, FieldMergingCallback 事件被触发。 您可以响应此事件以将文件名、流或图像对象返回到 Mail Merge 引擎,以便它可以插入到文档中。

下面的代码示例演示如何插入存储在数据库中的图像 BLOB 字段到报告中:

//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");

期间设置图像属性 Mail Merge

在合并图像合并字段时,有时可能需要控制各种图像属性,例如 WrapType.

目前,使用 ImageFieldMergingArgs 您只能分别设置图像宽度或高度属性。 为了克服这个问题, Aspose.Words 提供 Shape 属性,这便于获得对插入的图像或任何其他形状的完全控制。

下面的代码示例演示如何设置各种图像属性:

//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>();
}
};