从TX Text Control .NET Server 16.0开始,通过MailMerge类可以实现级联数据的合并操作,TX文档将级联模块组织成一种递归的树形结构,并通过关系数据对TX文档中的合并域进行数据合并。
我们就以生成所有员工的病假时间和休假时间报表为例,来讲解级联数据报表的实现方法。我们创建的文档模板中包含固定信息、每个员工的动态信息以及每个员工相关的病假和休假时间信息。
1、固定信息:标题Accruals Report、页号Page n
2、动态信息:公司名称Softerware Consultants,LLC、日期Date
3、每个员工的基本信息:员工编号Employee number、员工名字Employee name
4、每个员工的请假信息:Date、Type、Action、Note、Hours、Balance

通过上面的各种信息创建出下面所示的文档模板:



模板中重复显示的区域用一对起始和结束符进行标记,下面的图片展示了TX Template Designer 中的一个重复显示区域:



使用TX Test Control .NET Server 版本中的MailMerge组件,会让数据合并过程变得非常容易,你不必遍历所有的标记文本域,也不必关心重复显示区域。整个合并过程(包括级联区域的合并)都是自动完成的,下面的代码是在使用MailMerge组件时需要进行的一些设置:
 
mailMerge1.LoadTemplateFromMemory(data,  TXTextControl.DocumentServer.FileFormat.InternalUnicodeFormat);

// load the XML file
DataSet ds = new DataSet();
ds.ReadXml(tbDatabaseFile.Tag.ToString(), XmlReadMode.Auto);

// add the relations for the nested blocks
DataRelation relation_sick = new DataRelation("sick",
    ds.Tables["employee"].Columns["dyn_employee_number"],
    ds.Tables["sick"].Columns["dyn_employee_number"]);

DataRelation relation_vacation = new DataRelation("vacation",
    ds.Tables["employee"].Columns["dyn_employee_number"],
    ds.Tables["vacation"].Columns["dyn_employee_number"]);

ds.Relations.Add(relation_vacation);
ds.Relations.Add(relation_sick);

// pass the data
mailMerge1.MergeBlocks(ds);
mailMerge1.Merge(ds.Tables["general"], true);
复制代码
我们使用的数据源包含下面4个数据表,其中绿色标记的列是数据源中用于建立表之间关系的列,MailMerge类会自动解析这种树形结构,并正确的合并到相应的标记文本域中:



操作步骤:
1、点击Report菜单中的Load XML...,选择data.xml作为用于合并的数据源
2、点击Template菜单中的Load...,打开Accruals Report.docx文件
3、点击Create Report按钮,程序开始实现数据合并功能
4、合并之后的文档可以导出为doc、docx、PDF等格式

NestedReport.zip (384.75 K, 下载次数:16)