使用场景
在本文中我将JasperReport应用于某业务管理系统(WEB)的综合查询页面中,用于报表展示以及PDF和EXCEL文件的导出。
使用效果如下:
模板制作
在项目中使用之前,需要限制做好jasper模板。比较方便的做法是使用ireport制作模板。
ireport
界面
ireport界面如下,我们可以新建一个A4空白页面,或者使用ireport中准备好的模板。
重要参数
- Fields
直接存储对应数据的地方,用于存储JavaBean的变量或者数据源的字段。比如
class bean{
private String col1;
private Integer col2;
// getter, setter 略
}
在Fields中就得有对应的col1
, col2
而且数据类型也得一一对应比较好,不然可能出现转换错误。
- Variables
用于保存Fields中数据的一些自定义计算结果的地方,比如下文讲到的分组求和。
页面元素
- Title
报表的标题页,分页报表也指出现在第一页。 - Page Header
报表的页眉,位置处于Title之下,分页报表中每页均会出现。 - ColumnHeader
数据展示的列标题 - Detail
数据展示的详细列表(一条数据占一行) - ColumnFooter
列的末尾,可以用于合计项目 - PageFooter
页脚,分页情况下每页均会出现。 - Summary
位于最后一页的末尾,但是位于页脚之前。
页面组件
- Static Text
用于显示静态文本,可以作为字段的标题 - TextField
用于显示变量的值,可以用于Fields以及Variables - PageNumber \TotalPages\ Page X of Y
页码相应信息的展示 - CurrentDate
用于展示报表的生成日期
报表制作
基本使用
- 1、创建基本A4空白页面
- 2、根据JavaBean录入Field
- 3、在模板中绘制表格(注意默认方格可以是StaticText和TextField拼接出来的,但是要设置边框宽度,否则没有边框)。
模板如下:
4、需要结合动态数据的地方使用Text Field。并且编辑Field的表达式(在这里可以指定显示Filed还是Variable)。
5、点击Compile或者预览,就能生成.jasper文件啦。
进阶-分组合计
制作报表肯定不能只列举每个商品的销售清单,如果要统计每个商户的销售情况,就得按照商户分组合计。有点类似 SELECT SUM(XXX) FROM REPORT GROUP BY COMPANY
这样的效果。
流程如下:
1、在设置好Fields后,右键单击报表,选择Add Report Group。
在这里命名好分组名,选择GroupBy 的字段即可。
* 多字段分组,使用下面的expression。可以填写$F{fields1}+$F{fields2}
这样。
2、声明汇总字段
新建Variable
Calculation设置为Sum,选择相应的Group
VariableExpression 中选择需要计算的Field
在需要展示的Text Fields中设置表达式为该Variable即可。
嵌套报表
~~~~不太会。不过主要用于实现类似EXCEL的纵向合并单元格。
模板编译
ireport保存的模板文件后缀为jrxml。而jasper使用的模板文件后缀为jasper。jasper文件可以从ireport的编译结果中得到。这里可以在’工具 - 选项 - Compilation and excution’ 中,将 Compilation directory 指定到你想保存jasper文件的地方,这样在编译后,编译结果就能方便的拿到了。
截图如下:
项目引入
包引入
- MAVEN引入jasper包
<!-- jasperreport -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>4.1.3</version>
</dependency>
同时再引入中文字体包iText, iText-Asia。
注意:在WEB-INF/classes中建立一个jasperreports.properties 中加入一条:
net.sf.jasperreports.awt.ignore.missing.font=true
这样在中文字体找不到的时候可以自动调用默认字体而不是直接报错。
模板使用代码
将.jasper文件放在web资源路径下。
在java代码中查询出数据列表List<JavaBean>
将其填充到数据源中,然后套用模板即可。jasper的报表数据可以有好几种形式,这里只写通过HttpResponse输出的方法(HTML,PDF,EXCEL)。
java代码如下:
@RequestMapping(value = "/queryIncomeSumServlet", method = RequestMethod.POST)
public void queryIncomeSumHtml(HttpServletRequest request,
HttpServletResponse response) throws IOException {
//STEP 1 : 查询数据
List<JavaBean> beans = myService.getData();
//STEP 2 : 指定数据源
JRDataSource datasource = new JRBeanCollectionDataSource(sales);
//STEP 3 : 指定模板文件
ServletContext context = request.getSession().getServletContext();
File reportFile = null;
reportFile =