4 父子报表

4.1 概述

复杂报表或数据内容较多的时候,可以使用子报表解决。

4.2 制作父报表

首先制作父报表,就是调用子报表的一个基础报表。主报表的作用有如下两种:


  1. 父报表中需要显示数据,使用子报表弥补studio设计的不足
  2. 父报表不需要显示任何数据,只是作为子报表的载体。适用于复杂报表的设计

4.3 制作子报表

点击组件面板上的“Subreport”按钮,拖动到报表工作区上。

快速学习JasperReport-父子报表_传智播客

系统会自动弹出子报表选择窗口。可以选择创建一个新报表,还是使用一个已有的报表作为子报表。

快速学习JasperReport-父子报表_数据_02

选择​​“Create a new report”​​,可以立即制作新的子报表;如果选择“Select an existing report”,则可以调用已经有的报表作为子报表;如果选择​​“Just create the subreport element”​​,系统会生成一个子报表区,可以在之后挂接需要的子报表。

4.4 参数传递

快速学习JasperReport-父子报表_数据_03

//测试父子模板
@GetMapping("/testJasper07")
public void createPdf(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/main.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
HashMap parameters = new HashMap();
Resource subResource = new ClassPathResource("templates/sub-group.jasper");
parameters.put("subpath",subResource.getFile().getPath());
parameters.put("sublist",getUserList());
parameters.put("sublist",getUserList());
JRBeanCollectionDataSource ds = new
JRBeanCollectionDataSource(getUserList());
JasperPrint print = JasperFillManager.fillReport(fis, parameters,new
JREmptyDataSource());
//3.将JasperPrint已PDF的形式输出
JasperExportManager.exportReportToPdfStream(print,os);
response.setContentType("application/pdf");
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}
//创建数据库Connection
public List<User> getUserList() throws Exception {
List<User> list = new ArrayList<>();
for(int i=1;i<=3;i++) {
User user = new User("it00"+i, "itcast"+i, "1380000000"+i, "传智播客", "讲 师");
list.add(user);
}
for(int i=1;i<=3;i++) {
User user = new User("hm00"+i, "itheima"+i, "1880000000"+i, "黑马程序员", "讲 师");
list.add(user);
}
return list;
}