The DocumentServer.MailMerge component can not only merge single fields in a template. Additionally, blocks can be defined that are repeated based on the number of specified data rows.
A MergeBlock is a region in a document that will be repeated in the merge process. This block can be easily inserted using the shipped TX Text Control Words. A MergeBlock's start and end is marked by two document targets with special names. The start and end of a merge block must either be in the floating text, comprising of one or more table rows as a whole or inside a single table cell. The following illustration shows an example of such a block start and end with their special names (in red) in detail:
The format of the target name is as follows:
blockStart_ + unique name
blockEnd_ + unique name
Load the sample program from the MailMerge_Blocks directory and start it. Automatically, a template is loaded that consists of simple merge fields and a repeating block which is basically the second row of the table.
Choose Merge from the MailMerge main menu to start the merge process. With a very few lines of code, the template is loaded and the data is merged using the DocumentServer.MailMerge component.
[C#] private DataSet dsAddresses; dsAddresses = new DataSet(); dsAddresses.ReadXml(Application.StartupPath + "\\data.xml"); TXTextControl.LoadSettings ls = new TXTextControl.LoadSettings(); ls.ApplicationFieldFormat = TXTextControl.ApplicationFieldFormat.MSWord; textControl1.Load(Application.StartupPath + "\\template.docx", TXTextControl.StreamType.WordprocessingML, ls); mailMerge1.MergeBlocks(dsAddresses); mailMerge1.Merge(dsAddresses.Tables["address"], true);
[Visual Basic] Private dsAddresses As DataSet dsAddresses = New DataSet() dsAddresses.ReadXml(Application.StartupPath + "\data.xml") Dim ls As New TXTextControl.LoadSettings() ls.ApplicationFieldFormat = TXTextControl.ApplicationFieldFormat.MSWord textControl1.Load(Application.StartupPath + "\template.docx", TXTextControl.StreamType.WordprocessingML, ls) mailMerge1.MergeBlocks(dsAddresses) mailMerge1.Merge(dsAddresses.Tables("address"), True)