近期需求原因,接触到jasperReport,它页面布局与大多数报表软件类似,页眉页脚detail,不多做表述,简单记录一下从开始到完成遇到的问题和解决办法。
1:ireport分页。
ireport中有break控件,可在break中定义分页的依据。
第二种方法detail默认超出范围自动分页换行。
2:ireport报表页数。
报表中有函数$V{PAGE_NUMBER}可记录当前页数和总页数,可在属性中修改EvaluationTime修改now或者report来设置,缺点是遇到批量导出的复杂分页就不行了。
后我使用的页数的显示只能自己写算式,需要在后台传入各自报表的条目数和明细的行号,打个比方有AB两个报表需要批量导出,
每页显示4条明细,A有5条,B有9条。按照设计的结果应该是A分为2页,B分为3页,如果按照内部的函数自动分页会变成共5页,从1到5自动分页,显然是不满足需求的,我们需要在导入Bean之前给A和B加入各自条目数和行号,当前页的算式为
<![CDATA["第 "+ new Integer($F{行号}.intValue() % 4 == 0 ? $F{行号}.intValue() / 4 % 4 : $F{行号}.intValue() / 4 % 4 + 1) +" 页,共"]]>
总页数的算式为
<![CDATA[""+ new Integer($F{条目数}.intValue() % 4 == 0 ? $F{条目数}.intValue() / 4 : $F{条目数}.intValue() / 4 + 1) +" 页"]]>
此处传入的类型为BigDecimal,具体的类型做不同的转化,重要的是格式,由于API的不熟悉,格式的坑也是纠结了一些时间。
3:ireport自动补空行
这个功能比较棘手,根据交流,大家贯用sql补充的方法加入空行,所以暂时用注入空detail的bean去填充,页眉页脚等信息需要与数据行一致,这种方法有些弊端,如果开启了行数据溢出自动换行,在使用break分页,detail总高会超出预估的范围,如果是pdf的格式,会比预料中的长一些。如果是超出自动分页,由于超出的detail的范围,当前页会少于规定的行数,如果再加上补空行的数据整个分页会出现多了一些空白页。如果单单利用ireport去修改没有找到好的解决方案,目前只能是尽量放大可能会超长的字段宽度。如果是报表的话没有影响。
如果有更好的解决方案欢迎交流。