ireport的使用
什么是JasperReports和iReport?
- JasperReport本身是开发报表的一个格式非常复杂的XML文件,并且真实中项目的需求是千变万化的,不可能完全写Java代码去开发它;事实上,如果不使用可视化工具的话,根本就无法开发它。所以JasperReport为我们提供了一个可视化的辅助工具,即iReport。
- iReport是为JasperReports设计的强大的,直观的,易于使用的可视化报表设计器,采用纯Java开发。
一,简单创建PDF模板
1.1 安装ireport
iReport-Designer for JasperReports下载地址: https://sourceforge.net/projects/ireport/
注意:
- iReport-Designer不支持Java8的环境,所以只能使用jdk1.7
问题:
-
iReport-Designer下载完打不开
找到目录下 /ireport/etc/ireport.conf 文件,找到被注释的#jdkhome=“XXX/jdk”, 删除注释,修改为自己的jdk路径
# ${HOME} will be replaced by user home directory according to platform default_userdir="${HOME}/.${APPNAME}/5.6.0" default_mac_userdir="${HOME}/Library/Application Support/${APPNAME}/5.6.0" # options used by the launcher by default, can be overridden by explicit # command line switches default_options="-J-Xms256m -J-Xmx512m -J-Dorg.netbeans.ProxyClassLoader.level=1000 -J-XX:MaxPermSize=512m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dnetbeans.exception.report.min.level=99999 " # for development purposes you may wish to append: -J-Dnetbeans.logger.console=true -J-ea # default location of JDK/JRE, can be overridden by using --jdkhome <dir> switch jdkhome="D:\Program Files\Java\jdk1.7" # clusters' paths separated by path.separator (semicolon on Windows, colon on Unices) #extra_clusters=
1.2 定义报表
-
鼠标移至【New EDSP】,选择【报表定义文件】
-
主处理数据项:指报表中需要遍历显示的数据集合类型,可以是表或复合类型。
-
辅助数据项:指一些辅助的数据,也可以是表或复合类型。
-
报表模板:指要生成的报表模板名称(包括路径),默认直接在父目录下,如果父目录下还有子目录,模板配置为:子目录/生成模板名称。
-
自定义文件名:生成PDF的文件名。
注意:在报表的接口中一定要勾上【生成类时是否有对应的类】,否则生成的Java文件会报错:获取不到输入参数。
点击ID,就会跳转到页面处理类中:
实现该处理类中的主数据集合getMainDataQueryExecuter(input)和辅助数据getAssistentData(input)方法
1.3 配置交易和数据库
创建报表交易的步骤跟创建联机的一样,只不过在流程中不是创建【服务】,而是【报表】。
配置数据库
--报表视图交易
select * from app_transaction
-- 报表控制表
select * from app_report
交易表:
报表控制表:
1.4 生成报表模板
右键刚创建的报表文件,选择【生成报表模板】,就会生成一个 .jrxml 的文件,我们要做的PDF就是由这个jrxml生成的。
1.5 Eclipse关联ireport
首先,在IDEA工具栏找到【Window】->【Preferences】:
其次,找到【General】->【File Associations】
再关联打开*.jrxml文件的软件,即ireport
点击 .jrxml 文件,就会在ireport中打开以下页面:
1.6 报表页面结构
- Title:报表的标题,只在整个报表的第一页的最上面部分显示,除了第一页外,不管报表中有多少个页面也不会出现title中的内容。
- pageHeader:每页的头部,在每页都会显示一次,显示在页面的上部(如果是报表的第一页,将显示在title下面;否则在所有其他页面的最上端)
- pageFooter:每页的底部,在每页都会显示一次。
- Detail:数据明细,在这个band中设计报表中需要重复出现的内容,Detail段中的内容每页都会出现。
- columnHeader:每列的头部,一般的情况下,我们将表头设置在这里。
- ColumnFooter:每列的底部,一般的情况下,将整个数据明细汇总信息显示在这里。
- Summary:表格的合计段,出现在整个报表最后一页中的Detail的后面,一般用来统计报表中某一个或某几个字段的合计值。
1.7 绑定数据
-
右键点击Parameters/Fields添加新节点
-
给新节点设置Java的class类型
注意:对于新建Parameters和Fields的自定义类型全称,最后一个.要改成$,Java中已存在的就不需要(String,Integer,List......)
1.8 数据展示
对于被渲染的数据,需要通过【组件面板】组建一个【Text Field】,然后对其进行编辑
对于静态文本,则需要通过【组件面板】组建一个【Static Text】,写什么就显示什么
- 参数定义Parameters:$P{节点名称}.xxx
- 数据集合Fields:$F{节点名称}.xxx
- 变量定义Variables:$V{节点名称}.xxx
模板:
注意:【Detail】是数据遍历中会重复出现的内容,数据有多少条,【Detail】的内容就会打印多少遍。
举例:
1.9 无法显示中文
默认情况下,中文是不会显示在导出的报表中的,此时需要对要显示中文的【Text Field】或【Static Text】中修改属性:
- pdfFontName:STSong-Light
- pdfEncoding:UNIGB-UCS2-H
- isPdfEmbedded:true
导入依赖 iTextAsian:
<!--JasperReports-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
<!--ireport中文字体相关依赖-->
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
二,展示多数据列表
由于EDSP平台的报表处理类中只接收一个主处理数据项和一个辅助数据项,因此对于多个数据集合,要封装到辅助数据项中。
例如以下需求:
2.1 新建一个复合类型
新建复合类型(将存放在辅助数据项中)
2.2 编辑报表模板
2.3 新建数据集Dataset
右键项目,新建数据集Dataset,对上面每一个数据表格都对于创建一个Dataset
选择【Create en empty dataset】,设置为创建空数据集
根据自身需要创建parameter
再将每一个parameter都设置为List类型
2.4 将辅助数据项的值传到Dataset
右键表格,选择Edit table datasource
在【Sub dataset】中选择指定子数据集dataset
默认datasource expression:
new net.sf.jasperreports.engine.JREmptyDataSource(1)
代表表格只显示一条空记录
应改为:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{head}.getXxx().xxx)
可以简单认为该集合有多少条记录,报表中表格就输出多少行
在Dataset中将我们刚刚创建的Parameter节点跟辅助数据项的数据绑定起来,以便可以传到数据绑定到表格中。
2.5 定义变量
由于对于java.util.List,获取第index个数据时是使用 .get( index ),因此还需要定义一个自增变量index来作为get()方法的参数,此时就需要用到变量了。
2.6 在Table中渲染数据
直接渲染:
数据加工(三目运算符):
2.7 无数据时问题
注意:当无数据时,默认都不会显示表头信息
此时需要在ireport中修改表格属性【When no data type】(默认为【blank】,要改为【All sections, no detail】)
修改后展示结果:
三,整合前台
前端js代码跟文件下载的js代码基本一致:
在输出接口中也是返回文件名称:
由于报表的接口没有返回文件名的方法,因此需要在交易中定义一个方法,设置返回的文件名。
获取文件的路径名称,再写入到输出的output中。