2 分组报表
2.1 概述
有两种情况会使用分组报表:
- 美观和好看的显示。
- 当数据分为两层表时,经常需要批量打印子表的数据。打印时,常常需要按照父表的外键或关联值进行自动
分组,即每一条父表记录所属的子表记录打印到一组报表中,每组报表都单独计数及计算页数。在应用中,可以通过选择需要打印的父表记录,将父表记录的 ID 传入,由报表自动进行分组。
2.2 设置分组属性
(1)新建模板 使用用户列表模板完成分组案例
(2)新建报表群组 选中报表名称点击右键,选择菜单中的“Create Group”。
需要设置分组的名称、分组字段。也可以设置按照指定的函数、方法处理后进行分组
按照字段“companyName
”进行分组。设置完毕,点击“Next”。系统显示细节设置界面。此处可以设置是否加入“group header
”和“group footer
”区。建议保持默认选中,加入这两个区域,这样可以控制在每组报表的结尾,打印相应的信息,例如统计信息等。
(3)放置报表数据
将companyName
拖入 Group Header
中 ,会跳出 Text Field Wizard
框,选中 No Calculation Function
双击 $F{deptId}
会弹出Expression editor
框
2.3 添加分组Band
将需要作为表头打印的内容拖入 CompanyGroup Header1
栏,将字段拖入 detail 栏,将每个分组结尾需要打印的内容放入 Companygroup footer
栏,将页脚需要打印的内容放入 Page Footer栏,如下图。
2.4 PDF输出
代码语言:javascript复制 //测试分组
@GetMapping("/testJasper05")
public void createPdf(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/testGroup.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
HashMap parameters = new HashMap();
//构造javaBean数据源
JRBeanCollectionDataSource ds = new
JRBeanCollectionDataSource(getUserList());
/**
* 1.jasper文件流
* 2.参数列表
* 3.JRBeanCollectionDataSource
*/
JasperPrint print = JasperFillManager.fillReport(fis, parameters,ds);
//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;
}
效果如下: