JasperReport 如何利用list嵌套list循环展示数据

需求描述

有时候我们在做 Jasper Report 报表的时候时常会遇到利用 list 循环数据的问题。这时候用工具自带的 list 可以解决问题。

但是如果是 list 循环下面还嵌套一层 list 数据,或者更多层 怎么办呢?

网上很多博客和解决方案都是告诉你用子报表 subReport, 但是这玩意儿很麻烦也很难维护,而且还非常的不直观。我个人非常不建议用子报表来实现循环数据展示。

这里我们最简单,最直观的还是利用自带的 list 组件来解决问题

我们一步步来

比如我们有这样的数据:

List<Teacher> teachers; // 这是最外层的数据源

    class Teacher {
        private List<Student> students;
    }

    class Student {
        private String name;
        private List<String> someList;
    }

然后我们的 Java 代码这么写,数据源可以用 JasperFillManager.fillReport() 的时候作为参数传入,也可以用 parameter 传入,这里我们就用 parameter 传入吧

JasperDesign mainReportDesign = JRXmlLoader.load("jrxml path");
JasperReport mainReport = JasperCompileManager.compileReport(mainReportDesign);
        
HashMap<String, Object> reportParameters = new HashMap<>();
reportParameters.put("teacherDataSource", teachers); // List<Teacher>
        
JasperPrint jasperPrint = JasperFillManager.fillReport(mainReport, reportParameters);

Note : 千万不要利用 JSON_INPUT_STREAM 传入json字符串作为数据源,如果是一层 list 循环,还能利用((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource(“key”) 来获取子数据源,但是再多一层循环,则无法实现

teacherDataSource 可以传入list 也可以直接传入 JRBeanCollectionDataSource.

然后就是报表的设计了

  1. 在报表里添加一个parameter,teacherDataSource,类型一定要选择 java.util.Collection
  2. 在报表上新加一个 list,数据源新创建一个,选择 JRDataSource expression 
    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{teacherDataSource})
  3. 在这个dataset下新建 Field students, 类型一样选择 java.util.Collection
  4. 然后在这个 list 组件中继续新建 一个list 组件,重复上面的步骤,数据源新创建一个,选择 JRDataSource expression 
    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{students})

    注意这里用的是$F而前面用的是$P

  5. 如果还有子list,继续一样的步骤即可

注意

list 循环中一定一定一定不要添加break分页符,会报错!

如果text组件高不够字数显示不完,记得advance中选择print repeat values即可

5人评论了“JasperReport 如何利用list嵌套list循环展示数据”

  1. 我在传入的对象内没有boolean类型的数据,但是在运行时会报这个异常:java.lang.ClassCastException: net.sf.jasperreports.engine.data.JRBeanCollectionDataSource cannot be cast to java.lang.Boolean

    1. 这个错说的是转成boolean类型出错,就是说你在报表设计哪里勾选了boolean类型的组件或者选错类型了。然而你的数据源传入的不是boolean类型的数据,再好好检查下哦。

    1. 不太清楚你报表的排版需求,但是我之前的 list 里还好,你看这篇文章http://47.94.145.96/2020/03/26/jasper-report-list-break/

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top