首页 > 编程语言 >JasperReport 如何利用list嵌套list循环展示数据

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

时间:2023-03-23 10:55:58浏览次数:37  
标签:报表 嵌套 数据源 list teacherDataSource JasperReport 循环 List

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

需求描述

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

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

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

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

我们一步步来

比如我们有这样的数据:

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

 

 
1 2 3 4 5 6 7 8     class Teacher {         private List<Student> students;     }       class Student {         private String name;         private List<String> someList;     }

 

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

 

 
1 2 3 4 5 6 7 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 

     

     
    1 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{teacherDataSource})

     

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

     

     
    1 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{students})

     

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

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

注意

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

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

标签:报表,嵌套,数据源,list,teacherDataSource,JasperReport,循环,List
From: https://www.cnblogs.com/linus-tan/p/17246644.html

相关文章

  • ajax返回值List转换为json格式数据
    总的来说,代码就是下面这个样子,不多说了,直接上代码,大家看的就是一目了然了。1.vardata=newArray();2.3.for(vari=0;i<res.data.length;i++){4.varcityNam......
  • CS61B学习笔记_Lecture4 References, Recursion, and Lists
    还是得先熟悉java的语法规则,准备先回归CS61B了。。。Bits: 计算机将信息储存为内存,用bits(0或1)序列表示这些信息。(一般简写为“b”,注意不要与字节Byte搞混,字节一般用“B......
  • spring.rabbitmq.listener.simple.acknowledge-mode = manual and auto
    spring.rabbitmq.listener.simple.acknowledge-mode=manual*配置改成手动之后,spring不会报错。所以需要消费者抛异常*channel属性    basicNack和basicReject原......
  • 一统天下 flutter - 输入: RawKeyboardListener - 按键
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-输入:RawKeyboardListener-按键示例如下:lib\input\raw_keyboard_li......
  • 一统天下 flutter - dart: 数据类型(num, int, double, bool, String, List, Set, Map,
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-dart:数据类型(num,int,double,bool,String,List,Set,Map,Object......
  • SQL Server如何找出视图依赖的对象和视图嵌套层数
    场景:在SQLServer数据库的SQL优化中,我们有时候会需要找出某个视图的依赖对象,简单的视图倒是很容易一眼就找出依赖对象,一旦遇到一些复杂的视图,如果我们手动整理的话,就相当麻......
  • STL之list底层简单实现(七千字长文详解!)
    list底层的简单实现list_node的实现!要实现链表我们首先就要实现节点的结构体!structlist_node{ list_node*_next; list_node*_prev; T_data;};list_node的构......
  • Java 循环嵌套
    使用说明所谓嵌套循环:是指一个循环结构A的循环体是另一个循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for,while,do-while均可以作为外层循环或内层循......
  • List集合
    特点有序,有重复实现类1.ArrayList是一个基于数组的集合,其扩容策略为,默认为0,添加第一个元素直接扩展到10,此后每次扩容50%。常用API点击查看代码importjava.util.Ar......
  • ArrayList集合对象
    1、ArrayList集合对象usingSystem;usingSystem.Collections;namespaceArrayList集合{classProgram{staticvoidMain(string[]args)......