Checkboxes، ورودی متن یا تصاویر را وارد کنید
موتور ادغام یک سند را به عنوان ورودی می گیرد، به دنبال MERGEFIELD
فیلد در آن است و آنها را با داده های بدست آمده از منبع داده جایگزین می کند. به طور معمول، متن ساده و HTML وارد می شوند، اما Aspose.Words کاربران همچنین می توانند سندی را ایجاد کنند که سناریوهای غیرمعمول تری را برای Mail Merge فیلد ها مدیریت می کند.
قابلیت قدرتمند Aspose.Words به شما اجازه می دهد تا فرآیند Mail Merge را گسترش دهید:
- جعبه های چک و فیلد های فرم ورودی متن را در طول یک mail mergeوارد سند کنید
- تصاویر را از هر ذخیره سازی سفارشی (فایل ها، BLOB فیلد ها و غیره) وارد کنید.)
درج CheckboxEs و ورودی متن در طول Mail Merge
گاهی اوقات لازم است که یک عملیات Mail Merge انجام شود تا متن در فیلد ادغام جایگزین نشود، بلکه یک جعبه چک یا فیلد ورودی متن باشد. حتی اگر این رایج ترین سناریو نباشد، برای برخی از کارها بسیار مفید است.
تصویر زیر از یک سند ورد یک قالب با زمینه های ادغام را نشان می دهد:

این تصویر از سند ورد زیر سند تولید شده را نشان می دهد:

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، می توانید تصاویر را از پایگاه داده به سند با استفاده از فیلد های تصویر ویژه Mail Merge وارد کنید. فیلد image Mail 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>(); | |
} | |
}; |