We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

MailMerge.ExecuteWithRegions- Is there something wrong with my MailMerge Data Source

Hello there,

I am trying to run MailMerge.ExecuteWithRegions against IMailMergeDataSource object but
it seems there is some issue with my data source that I am not able to catch.

Here is the code snipper where I am calling .MailMerge.ExecuteWithRegions():

private void ExecuteMailMerge()
string[] mergeFields = objTemplateDocument.MailMerge.GetFieldNames();
if (mergeFields.Count() > 0)
objTemplateDocument.MailMerge.MergeField += new MergeFieldEventHandler(MailMerge_MergeField);
objTemplateDocument.MailMerge.MergeImageField += new MergeImageFieldEventHandler(MailMerge_MergeImageField);

PropertyMailMergeDataSource mmPropertyDataSource = new PropertyMailMergeDataSource(“Properties”);
string[] mergeFieldsProperty = mergeFields.Where(x => (x.StartsWith(“P”) || x.StartsWith(“Z”) || x.StartsWith(“T”) || x.StartsWith(“Image:”) || x.Equals(“APPLICANTS”) || x.Equals(“VENDORS”)) && !x.StartsWith(“TableStart:”) && !x.StartsWith(“TableEnd:”)).ToArray();
for (int i = 0; i < mergeFieldsProperty.Count(); i++)
if (mergeFieldsProperty[i].StartsWith(“Image:”))
mergeFieldsProperty[i] = mergeFieldsProperty[i].Substring(6);

foreach (IPropertyTransaction objProperty in propertyList)
mmPropertyDataSource.AddItem(new object[] { objProperty }, mergeFieldsProperty, null);
ClientsMailMergeDataSource mmDataSource = new ClientsMailMergeDataSource(clientList, mmPropertyDataSource);

private void AddParentMergeRegion()
DocumentBuilder docBuilder = new DocumentBuilder(objTemplateDocument);
docBuilder.ParagraphFormat.PageBreakBefore = true;
docBuilder.InsertField(“MERGEFIELD TableStart:Template”, “«TableStart:Template»”);
docBuilder.InsertField(“MERGEFIELD TableEnd:Template”, “«TableEnd:Template»”);

Please note that I am adding top level TableStart and TableEnd at run-time.
The child region “Properties” needs to be replicated for all the properties for each client.

I have attached following files for your reference:
- Input Document (Applicant Properties.docx)
- ClientsMailMergeDataSource.cs (Main Data Source file)
- PropertyMailMergeDataSource.cs (Child Region Data Source file)

Could you please guide me what I am missing in running the mail merge.

Thank you!

Hi Nutan,

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Thanks for your request. Why do you think that there is some problem with your mail merge data sources? Could you please describe your problem more specifically?

Also, please create a simple application, which will allow me to reproduce the problem on my side.

Best regards.

Thanks for your reply Alexey.

I am thinking so because I am not getting merged document as an output i.e. output document is same as my source document.

Can you please verify if my source document is correct to have TableStart:Template and TableEnd:Template which I am adding to the document at run-time?

Thank you!

Hi Nutan,

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Thanks for your request. Your document seems to be correct. I tested it using the following simple example and all works fine.

// Open template.

Document doc = new Document(@"Test001\in.docx");

// Execute mail merge with regions.


// Save output document.




/// Returns dummy datasource, which contaion two tables with parent-child relationships.

/// The first table name is "Template", the child table name is "PROPERTIES".


private static DataSet GetData()


DataSet ds = new DataSet();

// Create two tables and add them into the data set.

DataTable parent = new DataTable("Template");




DataTable child = new DataTable("PROPERTIES");

child.Columns.Add("parnetId"); // this column is needed to create relationshoip between tables.







// Add tables into the data set and add relationship.



ds.Relations.Add(parent.Columns["id"], child.Columns["parnetId"]);

// Structure of our datasource is ready. Let's add some dummy data.

Random rnd = new Random();

for (int i = 0; i < 10; i++)


parent.Rows.Add(new object[] { i, string.Format("ATITLE#{0}", i), string.Format("ASURNAME#{0}", i) });

for (int j = 0; j < rnd.Next(1, 15); j++)


child.Rows.Add(new object[] { i, string.Format("PSTREETNAME {0} {1}", i, j),





return ds;


Best regards.

Thanks for the detailed code Alexey.
Yes, the mail merge run fine against your parent-child table data source.
However when I run against my data source, it is same… I don’t get any mail merge document :frowning:

I have attached demo code with this post along with input file.
Both the data sources Parent+child implements IMailMergeDataSource.

Could you please have a look and let me know what I am missing.

Thank you!

Any update on this?

Hi Nutan,

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Thank you for additional information. The template was not filled with data, because you missed to specify table name of ClientsMailMergeDataSourceDemo. Here is snippet of your code:

public class ClientsMailMergeDataSourceDemo : IMailMergeDataSource


// Code here

// ....................................

string IMailMergeDataSource.TableName




return "";




Also, you repeat the problem described here:

Best regards.

Hey Alexey,

Thanks for pointing that out. Good one!
All running fine.