需求
客户需要统计某个月内连续几天的数据,前面两三列跟后面的合计列是固定的,但是中间每个日期列是不固定的,这就要求日期列是要能动态生成,网上能查到的方法有两种:
第一种是把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文件,然后使用
JasperDes