【工作笔记】笨办法搞定jasper动态列

需求

客户需要统计某个月内连续几天的数据,前面两三列跟后面的合计列是固定的,但是中间每个日期列是不固定的,这就要求日期列是要能动态生成,网上能查到的方法有两种:
第一种是把1~31天的列全部用ireport画出来,然后动态隐藏不需要的列
第二种是在代码中新建JasperDesign对象,用代码画出来。
经过仔细分析,第一种思路不错,但是动态列是有上限的,而且必须按照上限的标准画报表,很容易造成整个报表被撑得很大,但是只有一点数据;第二种方式代码量多,而且也不够直观,在ireport上拖拖拉拉已经很麻烦了,用代码实现更加麻烦orz。

解决方案

借用动态代理的思路,先用ireport生成一个模板,然后用字符串接收对应.jrxml源码,类似这样:
String s = "<xml>......</xml>"
然后计算好纸张的长宽、title、header、col、footer等等的长宽。类似这样:

int headWith = 500; 
String head = "<header with="+headWith+" height="..."></header>"

计算好这些东西之后,使用Writer写成.jrxml文件,然后使用

JasperDesign jdesign = JRXmlLoader  
                    .load("/xxx/1.jrxml");  
JasperReport jreport = JasperCompileManager.compileReport(jdesign);  

生成编译后的文件
到此动态列报表就能够生成出来了。
与其对应的vo,如果有上限,可以使用反射动态赋值,如果没有上限,可以使用动态代理生成对应的vo。
缺点呢就是这动态报表改期了很麻烦,我不说大家也能想到。。
不过前面说到的两种方式缺点也很明显,一个无法满足自适应无上限列,另一个嘛,报表不直观,用ireport更容易画好,而且效率也高,我个人认为用动态生成源码的方式要快不少(大部分代码都copy从ireport那画好的模板)

由于源码不在手上,只能记一下思路,望各位见谅。个人感觉这种方法的实现简单粗暴,故称作笨办法~lol

猜你喜欢

转载自blog.csdn.net/qq_28298683/article/details/73695395