在报表打印的过程中,打印记录的归并,合计是一个非常普遍的场景,下面我承接<<如何使用JasperReport做动态报表>>,如何在动态报表实现行的归并和合计。
在Jasper报表本身提供的合计和归并的功能,经过使用,发现要和上一篇提到的Jasper动态报表结合非常困难。
第一在归并问题上,jasper报表的归并必须以报表呈现中的某一行进行归并,但在实际过程中,我们往往希望通过一个不进行打印呈现的行进行归并。
第二在汇总行上,jasper报表会在每一页上加上一个汇总信息,但在实际运用过程中,我们只希望在报表的第一行出现合计数据,而不是每一页。
第三为了兼容归并和统计场景,我们必须维护更复杂的报表模板或者是维护几套模板。
基于此,我在这里给出另外一个解决方案:归并和统计功能,我们不使用JasperReport, 我们在动态报表引擎通过处理要呈现的数据集合 DateList(归并,合计),然后使用再归并统计过的数据集合进行报表填充,来代替jasperReport的归并统计功能。这样做可以:
第一:归并可以不依赖与报表中的呈现数据,我们在归并数据集时,完全可以根据一个隐藏字段进行,而这个字段压根不会在jasperReport中出现
第二:我们把统计数据插入到集合中的首位,这样在报表呈现时,表现为只有第一页的第一行为统计数据。
第三:我们可以沿用以前的报表模板,报表模板维护简单
当要使用DynaJasper的归并和统计功能是,只要在构造模型是,给响应的列添加响应的属性即可.
查看nst.report.jasper.ext.ColumnInfo的如下属性
//是否为统计列,默认为false,如果为true,那么该列将会被统计
//在没有统计的情况下,不会在首页首行添加统计行
//统计列数据必须为数字类型
private boolean gatherColumn = false;
/**
* 是否为归并行的依据列,在做数据处理时,<br>
* 如果所有groupColumn=true的列和上一次的列数据相同,<br>
* 那么会被认为是同一条数据.<br>
* 这个时候所有列printedInGroup=true的列数据会被设置成NULL<br>
* printedInGroup = false 的列数据则保持原值<br>
*在没有归并列的情况下,不进行归并
*/
private boolean groupColumn = false;
/**
* 在归并行时是否进行归并,在做数据处理时,<br>
* 如果所有groupColumn=true的列和上一次的列数据相同,<br>
* 那么会被认为是同一条数据.<br>
* 这个时候所有列printedInGroup=true的列数据会被设置成NULL<br>
* printedInGroup = false 的列数据则保持原值
*/
private boolean printedInGroup = true;
/**
* 是否为隐藏列,隐藏列不进行显示
*/
private boolean hided = false;
下载附件后,解压后使用eclipse打开DynaJasperProject工程,运行classpath:TestMergeRecord查看效果(该附件和《如何使用JasperReport做动态报表》的源码附件相同,避免重复下载)。
另外在classpath:TestTipText中展现另外一个小功能:在报表的右上角展现不同的信息。
效果图:
由于整个完整的eclipse的工程较大,要整个工程源码的朋友可以到我的个人博客上下载(http://www.chlusoft.com/tech/index.jhtml)
原创文章,转载请注明个人博客出处:http://www.chlusoft.com/tech/345.jhtml