הכנס Checkbox, קלט טקסט או תמונות

מנוע המיזוג לוקח מסמך כקלט, מחפש בו שדות MERGEFIELD ומחליף אותם בנתונים המתקבלים ממקור הנתונים. בדרך כלל, טקסט רגיל ו HTML מוכנסים, אך Aspose.Words משתמשים יכולים גם ליצור מסמך המטפל בתרחישים יוצאי דופן יותר עבור שדות Mail Merge.

פונקציונליות Aspose.Words עוצמתית מאפשרת לך להרחיב את התהליך Mail Merge:

  • הכנס checkboxשדות טופס קלט טקסט למסמך במהלך mail merge
  • הוסף תמונות מכל אחסון מותאם אישית (קבצים, BLOB שדות, וכו').)

הכנס Checkboxקלט טקסט במהלך Mail Merge

לפעמים יש צורך לבצע פעולת Mail Merge כך שלא יוחלף טקסט בשדה המיזוג, אלא שדה checkbox או קלט טקסט. למרות שזה לא התרחיש הנפוץ ביותר, זה מאוד שימושי למשימות מסוימות.

צילום המסך הבא של מסמך Word מציג תבנית עם שדות מיזוג:

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

צילום מסך זה של המסמך Word למטה מציג את המסמך שכבר נוצר:

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

דוגמת הקוד הבאה מראה כיצד להוסיף checkboxשדות טקסט ושדות טקסט למסמך במהלך 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 הוא שדה מיזוג בשם תמונה: 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>();
}
};