jasper报表制作-父子报表嵌套-记录下

Author Avatar
没饲养员的猩猩 06月 06,2020
  • 在其它设备中阅读本文章

简单的jasper报表就不重复说了,百度一搜一大把,可以自己查查看,主要记录下报表嵌套子报表的方式,当时查资料没发现有人记录过,也不想啃英文帮助手册,所以我来记录补充吧!
使用到子报表的场景:一页报表中有多个需要循环的数据区域,每个数据区域数据量都不确定。

报表制作前提:
1.java jdk 1.8+(没差具体支持什么版本,我用的8);
2.TIBCO Jaspersoft Studio(报表制作软件);
3.https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports;(Java制作报表需要的依赖)

maven依赖引入
image.png

父报表制作:
父报表就是个普通的报表(具体做法可以百度去查);
image.png
上图为一个简单的父报表 解释下每个区域的意义。

  • title:报表的标题区域;
  • pageHeader:页头区域;
  • columnHeader:栏目头,我理解就是内容区头;
  • detail:内容区域,detail内是可以循环显示数据的,一个报表可以有多个
    detail区域,但循环数据时,每个detail区域都会循环,也就是说,多个detail区域内需要循环的数据条数不一时,数据少的detail区域会出现空白内容(具体看你设置的无数据展示属性是什么,好像是下图这个);
    image.png
  • columnFooter:栏目尾 我理解是内容区域的结尾内容;
  • pageFooter:页尾;
  • lastPageFooter:最后一页页尾(就字面意思);

父报表的数据插入
常用的数据插入就是textField,添加一个数据字段key。
image.png
如:$F
对应dataSet内设置
image.png

父报表中插入子报表
选择subReport 插入到父报表的任意区域
image.png
选定子报表区域后,会提示选择已有报表还是创建新报表,根据需要选择即可
插入好的报表如下图
image.png
点击插入后的子报表,查看子报表属性
image.png

  • experssion内是子报表的完整路径及子报表文件名(绝对路径)
  • dataSourceExpression 是子报表的数据集别名(相当于父报表中的一个textField)
    image.png
    注: 1.子报表完整路径一般不能在报表内写死,需要获取并作为param拼接进去dataSet中选择param选项卡创建一个参数,此参数为子报表除文件名外的完整路径
    image.png
    2.子报表数据集textFileld类型是JRMapCollectionDataSource:
    net.sf.jasperreports.engine.data.JRMapCollectionDataSource

数据方面
无论父子报表 最后传给JasperFillManager的数据都是一个JRMapCollectionDataSource也就是这个:
new JRMapCollectionDataSource(Collection),我们只需要做好collection即可
单纯父报表的collection如下图
image.png
包含子报表的collection如下图
image.png
注:父报表的collection中每个map都要有子报表collection(也许理论上不需要每个map都设置,但测试发现某个map缺少子报表map会导致子报表数据为空,其实还是懒得查文档)
子报表的路径,就追加到父报表的parameters里面,key就是在报表工具内设置的key值,value一定要是子报表的绝对路径。

到这里报表就完整啦 按道理说这种报表制作方式可以无限套娃。
以上仅实践所得,有说的不对的地方请各位大佬指正。