Checkboxes、テキスト入力、または画像を挿入します
マージエンジンはドキュメントを入力として受け取り、その中のMERGEFIELD
フィールドを探し、データソースから取得したデータに置き換えます。 通常、プレーンテキストとHTMLが挿入されますが、Aspose.Wordsユーザーはmail mergeフィールドのより珍しいシナリオを処理する文書を生成することもできます。
強力なAspose.Words機能を使用するとmail mergeプロセスを拡張できます:
- mail merge中にチェックボックスとテキスト入力フォームフィールドを文書に挿入します
- 任意のカスタムストレージ(ファイル、BLOBフィールドなど)から画像を挿入します。)
Mail Merge中にCheckboxesとテキスト入力を挿入します
差し込み項目でテキストが置換されるのではなく、チェックボックスまたはテキスト入力フィールドで置換されるようにmail merge操作を実行する必要があ これは最も一般的なシナリオではありませんが、一部のタスクでは非常に便利です。
Word文書の次のスクリーンショットは、差し込み項目を含むテンプレートを示しています:

下のWord文書のこのスクリーンショットは、すでに生成された文書を示しています:

Subject
フィールドはテキ
次のコード例は、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操作を実行するときは、特殊なimagemail mergeフィールドを使用してデータベースからドキュメントにイメージを挿入できます。 Imagemail mergeフィールドは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>(); | |
} | |
}; |