JasperReport-父子报表
4 父子报表
4.1 概述
复杂报表或数据内容较多的时候,可以使用子报表解决。
4.2 制作父报表
首先制作父报表,就是调用子报表的一个基础报表。主报表的作用有如下两种:
父报表中需要显示数据,使用子报表弥补studio设计的不足
父报表不需要显示任何数据,只是作为子报表的载体。适用于复杂报表的设计
4.3 制作子报表
点击组件面板上的“Subreport”按钮,拖动到报表工作区上。
系统会自动弹出子报表选择窗口。可以选择创建一个新报表,还是使用一个已有的报表作为子报表。
选择“Create a new report”,可以立即制作新的子报表;如果选择“Select an existing report”,则可以调用已经有的报表作为子报表;如果选择“Just create the subreport element”,系统会生成一个子报表区,可以在之后挂接需要的子报表。
4.4 参数传递
//测试父子模板
@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;
}