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

https://www.wanaright.com/2021/01/26/jasperreport-list-nest-list/

需求描述

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

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

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

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

我们一步步来

比如我们有这样的数据:

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

 

 

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

 

 

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 

     

     

  3. 在这个dataset下新建 Field students, 类型一样选择 java.util.Collection
  4. 然后在这个 list 组件中继续新建 一个list 组件,重复上面的步骤,数据源新创建一个,选择 JRDataSource expression 

     

     

    注意这里用的是FP

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

注意

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

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

posted @   liness0713  阅读(1536)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示