Inserați Checkboxes, introducere Text sau imagini
Merge engine ia un document ca intrare, caută câmpuri MERGEFIELD
în el și le înlocuiește cu datele obținute din sursa de date. De obicei, textul simplu și HTML sunt inserate, dar Aspose.Words Utilizatorii pot genera, de asemenea, un document care gestionează scenarii mai neobișnuite pentru câmpurile mail merge.
Funcționalitatea puternică Aspose.Words vă permite să extindeți procesul mail merge:
- introduceți checkboxes și câmpurile formularului de introducere a textului în document în timpul unui mail merge
- introduceți imagini din orice stocare personalizată (fișiere, câmpuri BLOB etc.).)
Introduceți Checkboxes și introducerea textului în timpul Mail Merge
Uneori este necesar să efectuați o operație mail merge, astfel încât nu textul să fie înlocuit în câmpul de îmbinare, ci un checkbox sau un câmp de introducere a textului. Chiar dacă acesta nu este cel mai comun scenariu, este foarte util pentru unele sarcini.
Următoarea captură de ecran a unui document Word arată un șablon cu câmpuri de îmbinare:

Această captură de ecran a documentului Word de mai jos arată documentul deja generat:

Subject
a fost înlocuit cu un câmp de introducere a textului.
Următorul exemplu de cod arată cum să inserați checkboxes și câmpurile de text de intrare într-un document în timpul unui 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)); | |
} | |
}; |
Inserați imagini în timpul Mail Merge
Când efectuați o operație mail merge, puteți insera imagini din Baza de date în document folosind câmpuri speciale image mail merge. Câmpul image Mail Merge este un câmp de îmbinare numit Image: MyFieldName.
Inserați imagini dintr-o bază de date
În timpul unui mail merge, când un câmp de imagine Mail Merge este întâlnit într-un document, evenimentul FieldMergingCallback este declanșat. Puteți răspunde la acest eveniment pentru a returna un nume de fișier, un flux sau un obiect de imagine la motorul mail merge, astfel încât să poată fi inserat în document.
Următorul exemplu de cod arată cum să inserați imagini stocate într-o bază de date BLOB câmp într-un raport:
//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"); |
Setați proprietățile imaginii în timpul Mail Merge
În timp ce fuzionați un câmp de îmbinare a imaginii, uneori poate fi necesar să controlați diferite proprietăți ale imaginii, cum ar fi WrapType.
În prezent, folosind ImageFieldMergingArgs Puteți seta doar lățimea imaginii sau, respectiv, proprietățile înălțimii. Pentru a depăși această problemă, Aspose.Words oferă proprietatea Shape, care facilitează obținerea controlului deplin asupra imaginii inserate sau a oricărei alte forme.
Următorul exemplu de cod arată cum să setați diferite proprietăți ale imaginii:
//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>(); | |
} | |
}; |