JasperReport框架使用教程(附带常见空白页问题说明)
概述与安装使用
1. PDF报表概述
概述
在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,例如货运详情,货运单等。
常见PDF报表的制作方式
目前世面上比较流行的制作PDF报表的工具如下:
- iText PDF:iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
- Openoffice:openoffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化为PDF文档。
- Jasper Report:是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF
JasperReport框架的介绍
JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。只需要将JasperReport引入工程中即可完成PDF报表的编译、显示、输出等工作。
在开源的JAVA报表工具中,JASPER Report发展是比较好的,比一些商业的报表引擎做得还好,如支持了十字交叉报表、统计报表、图形报表,支持多种报表格式的输出,如PDF、RTF、XML、CSV、XHTML、TEXT、DOCX以及OpenOffice。
数据源支持更多,常用 JDBC SQL查询、XML文件、CSV文件 、HQL(Hibernate查询),HBase,JAVA集合等。还允许你义自己的数据源,通过JASPER文件及数据源,JASPER就能生成最终用户想要的文档格式。

JasperReport生命周期(重点)
通常我们提到PDF报表的时候,浮现在脑海中的是最终的PDF文档文件。在JasperReports中,这只是报表生命周期的最后阶段。通过JasperReports生成PDF报表一共要经过三个阶段,我们称之为 JasperReport的生命周期,这三个阶段为:设计(Design)阶段、执行(Execution)阶段以及输出(Export)阶段,如下图所示:

- 设计阶段(Design):定义模板
所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保存为JRXML文件(JR代表JasperReports),其实就是一个XML文件。 - 执行阶段(Execution):模板 + 数据
使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执行,填充报表数据 - 输出阶段(Export):展示。 将模板和数据一起展示。
数据填充结束,可以指定输出为多种形式的报表
JasperReport执行流程(重点+)

- JRXML:报表填充模板,本质是一个XML.
JasperReport已经封装了一个dtd,只要按照规定的格式写这个xml文件,那么jasperReport就可以将其解析最终生成报表,但是jasperReport所解析的不是我们常见的.xml文件,而是.jrxml文件,其实跟xml是一样的,只是后缀不一样。 - Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据。
解析完成后JasperReport就开始编译.jrxml文件,将其编译成.jasper文件,因为JasperReport只可以对.jasper文件进行填充数据和转换,这步操作就跟我们java中将java文件编译成class文件是一样的 - .Jrprint:当用数据填充完Jasper后生成的文件,用于输出报表。
这一步才是JasperReport的核心所在,它会根据你在xml里面写好的查询语句来查询指定是数据库,也可以控制在后台编写查询语句,参数,数据库。在报表填充完后,会再生成一个.jrprint格式的文件(读取jasper文件进行填充,然后生成一个jrprint文件) - Exporter:决定要输出的报表为何种格式,报表输出的管理类。
- Jasperreport 可以输出多种格式的报表文件,常见的有Html,PDF,xls等
2. Jaspersoft Studio 模板工具
概述
Jaspersoft Studio是JasperReports库和JasperReports服务器的基于Eclipse的报告设计器; 它可以作为Eclipse插件或作为独立的应用程序使用。Jaspersoft Studio允许您创建包含图表,图像,子报表,交叉表等的复杂布局。您可以通过JDBC,TableModels,JavaBeans,XML,Hibernate,大数据(如Hive),CSV,XML / A以及自定义来源等各种来源访问数据,然后将报告发布为PDF,RTF, XML,XLS,CSV,HTML,XHTML,文本,DOCX或OpenOffice。
Jaspersoft Studio 是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格式.jrxml 的 XML 文件,并且可以把.jrxml 文件编译成.jasper 格式文件方便 JasperReport 报表引擎解析、显示。
安装配置
- 到JasperReport官网下载 https://community.jaspersoft.com/community-download

下载后,安装:TIB_js-studiocomm_6.5.0.final_windows_x86_64.exe。 直接下一步下一步即可。
主界面

基本使用
如何创建模板?
- 打开Jaspersoft Studio ,新建一个project, 步骤: File -> New -> Project-> JasperReports Project

- 下一步,输入项目名称:

创建JasperReport模板
图1:

图2:

图3:

图4:

面版说明
- Title(标题):只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。
- Page Header(页头):在整个报表中每一页都会显示。在第一页中,出现的位置在 Title Band的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。
- Page Footer(页脚):在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。
- Detail 1(详细):报表内容,每一页都会显示。
- Column Header(列头):Detail中打印的是一张表的话,这Column Header就是表中列的列头。
- Column Footer(列脚):Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。
- Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail 1 Band后面。主要是用来做报表的合计显示。
完善模板、编译模板
第一步:可以把不需要的面版删除:这里只留了Title、Summary

第二步:拖入Image到面版中,输入url地址:http://i1.qhimg.com/t01e0356c940bf0a30c.jpg

第三步:拖入Static Text,静态文本

第四步:点击预览

第四步:现在已经创建了jrxml模板,现在需要编译它:
注:这里千万千万注意要先保存再编译,不然打印出来的内容会是空白的,还有汉字问题,字体需要选择系统有的,如果导入到java程序中,最好在包中存放该字体文件

编译结果:

数据填充
1. 数据填充(一)参数map填充
需求
通过java代码往jasper模板中传入参数。
步骤
第一步: 定义模板。先定义模板、在模板中定义一些参数。
模板预览:

第二步:导出PDF。通过java代码,往模板中设置参数,导出pdf。
第一步:定义模板
① 拖入frame

② 设置frame边框

③ 拖入Line到frame、设置宽度与frame一致。

④ 设置h为1px后

⑤ 预览

⑥设置Parameter
图1:

图2:

⑦ 制作模板

⑧ 修改文字大小、修改文字字体、编译模板生成jasper文件、把jasper文件拷贝到项目中。
第二步:导出PDF
① 拷贝jasper文件到项目中

② 编写控制器
/**
* 2)带参数的导出
* @throws Exception
*/
@RequestMapping("/exportPdf")
public void exportPdf() throws Exception{
//1.读取.japser文件,构建输入流
InputStream in = session.getServletContext().getResourceAsStream("/jasper/test02_param.jasper");
//2.构建Print对象,用于让模块结合数据
//第二个参数就是用来填充模板中的parameters
Map<String, Object> map = new HashMap<>();
map.put("userName","小泽");
map.put("email","ze@qq.com");
map.put("companyName","小泽科技");
map.put("deptName","视频组");
JasperPrint print = JasperFillManager.fillReport(in,map,new JREmptyDataSource());
//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());
}
2. 数据填充(二)JDBC数据源 A 配置数据源
分析
数据源填充数据分为:JDBC数据源填充数据(数据库连接)、JavaBean填充数据(list集合)
如图:

配置数据源
图1:

图2:

图3:配置数据库连接信息

图4:选择驱动、点击完成

图5:配置结果

3. 数据填充(三)JDBC数据源 B 制作模板
制作模板
第一步:新建模板
① 新建jasper模板

输入模板名称:

下一步,完成

第二步:模板制作
①创建空白模板后,并将不需要的Band删除, 只留下如下面版:

②新建数据源
图1:

图2:


③ 新建数据源后,自动生成如下四个Fields

④ 构造模板

第三步:制作细节
①由于模板数据有空格,需要去除数据的空格
图1:双击空白区域

图2:

由于没有边框,现在设置边框
图1:

4. 数据填充(四)JDBC数据源 C 代码实现
这里的数据是从pe_user表查询出来的,在jasper模板中配置的数据源。
实现
第一步:拷贝生成的jasper文件到项目中

第二步:实现导出PDF
//注入数据源
@Autowired
private DataSource dataSource;
/**
* 3)使用JDBC数据源导出
* @throws Exception
*/
@RequestMapping("/exportPdf")
public void exportPdf() throws Exception{
//1.读取.japser文件,构建输入流
InputStream in = session.getServletContext().getResourceAsStream("/jasper/test03_jdbc.jasper");
//2.构建Print对象,用于让模块结合数据
//第三个参数:如果是JDBC数据源,应该设置Connection对象
JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource.getConnection());
//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());
}
5. 数据填充(五)JavaBean数据源(重点)
需求
刚才我们实现了jdbc数据源,直接查询表中的数据填充jasper模板。但是很多时候我们需要对数据进行处理,再把处理后的数据填充到jasper模板。所以,我们就需要把处理后的数据用javabean封装,这里就用到了javabean数据源。
我们的实现步骤分为下面2步:
- 制作jasper模板
- 导出pdf
制作模板

导出pdf
先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:
/**
* 4)使用JavaBean数据源导出
* @throws Exception
*/
@RequestMapping("/exportPdf")
public void exportPdf() throws Exception{
//1.读取.japser文件,构建输入流
InputStream in = session.getServletContext().getResourceAsStream("/jasper/test04_javabean.jasper");
//2.构建Print对象,用于让模块结合数据
//注意:JavaBean的属性名称和模版的Fileds的名称一致的
List<User> list = new ArrayList<>();
for(int i=1;i<=10;i++){
User user = new User();
user.setUserName("张三-"+i);
user.setEmail("zhangsan-"+i+"@qq.com");
user.setCompanyName("熊掌科技");
user.setDeptName("开发部");
list.add(user);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
//第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);
//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());
}
6. 数据填充(六)分组报表
制作模板
① 新建模板:test06_group.jrxml
②新建Fields

③ 新建组
图1:

图2:

图3:

④ 编辑模板 - 组
图1:按照哪个字段进行分组,就拖入对应字段

图2:编辑组名称

图3:双击组名称

图4: 再次拖入分组字段到Footer中

图5:输入统计信息放入Footer

⑤ 添加Field、完成模板制作

导出pdf
先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:
/**
* 5)分组导出
* @throws Exception
*/
@RequestMapping("/exportPdf")
public void exportPdf() throws Exception{
//1.读取.japser文件,构建输入流
InputStream in = session.getServletContext().getResourceAsStream("/jasper/test05_group.jasper");
//2.构建Print对象,用于让模块结合数据
//注意:JavaBean的属性名称和模版的Fileds的名称一致的
List<User> list = new ArrayList<>();
for(int j=1;j<5;j++) {
for (int i = 1; i <= 10; i++) {
User user = new User();
user.setUserName("张三-" + i);
user.setEmail("zhangsan-" + i + "@qq.com");
user.setCompanyName("熊掌科技-" + j);
user.setDeptName("开发部");
list.add(user);
}
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
//第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);
//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());
}
7. 数据填充(七)图形报表
制作模板
①创建模板、创建Fields

②添加Charts
图1:

图2:

③设置饼图属性
图1:

图2:

图3:

图3:

④最后pdf模板

注意: 设置了标题,一定设置 标题 + 饼图的字体。
导出pdf
先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:
/**
* 6)图标导出
* @throws Exception
*/
@RequestMapping("/exportPdf")
public void exportPdf() throws Exception{
//1.读取.japser文件,构建输入流
InputStream in = session.getServletContext().getResourceAsStream("/jasper/test06_pie.jasper");
//2.构建Print对象,用于让模块结合数据
//注意:JavaBean的属性名称和模版的Fileds的名称一致的
List<Map> list = new ArrayList<>();
for (int i = 1; i <= 6; i++) {
Map map = new HashMap();
map.put("title","标题:"+i);
map.put("value",new Random().nextInt(100));
list.add(map);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
//第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);
//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());
}
JasperReport框架使用教程(附带常见空白页问题说明)的更多相关文章
- 深度学习与CV教程(8) | 常见深度学习框架介绍
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- PHP: 手把手编写自己的 MVC 框架实例教程
1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- [!!!!!]Inno Setup教程-常见问题解答
[转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字 * 它支持 MBCS (多字节字符集) 吗? * 将来会支持 Windows Installer 吗? ...
- dwr与ssh框架整合教程
(1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?
学习LAMP.LNMP时,遇到很奇怪的问题就是:搭建完LAMP或LNMP环境后安装PHPweb程序时,Discuz和Wordpress打不开安装向导,直接显示空白页(PHPWind9.0除外),没有任 ...
- php教程之php空白页的原因及解决方法
php中出现空白页的原因及解决方法汇总. 很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误逻辑错误是最难排除的 ...
- 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- 获取cell上按钮事件
原由:点击cell上的按钮,无法获取button对应的cell位置 //获取按钮上层控件,也就是cell本身 AccountCell *cell= (AccountCell *)[按钮名称 super ...
- [原]UEFI+GPT启动VHD
1. 缘起 2. 创建VHD文件并写入系统镜像到VHD文件 2.1 制作VHD文件 2.1.1 纯界面创建 2.1.2 命令行创建 2.2 把系统镜像写入VHD文件 3. 添加VHD文件到系统引导 3 ...
- RedBlack-Tree(红黑树)原理及C++代码实现
众所周知,红黑树是用途很广的平衡二叉搜索树,用过的都说好.所以我们来看看红黑树的是怎么实现的吧. 红黑树顾名思义,通过红与黑两种颜色来给每个节点上色.其中根结点和叶子结点一定是黑色的,并且红色结点的两 ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块开发俄罗斯方块游戏
俄罗斯方块游戏 多年前,游戏机中最流行的游戏就是“俄罗斯方块”了.时至今日,虽然网络 游戏日新月异 ,但“俄罗斯方块”这款小游戏仍在许多人心中 占有一席之地.本例中, 我们将亲手设计一个简单的俄罗斯方 ...
- nc命令的用法
1.什么是nc netcat(nc)是一个简单而有用的工具,可以使用tcp或者udp进行网络间读写数据,传输文件,接收发送数据,验证网络是否畅通. 2.命令行: 1) -l 用于指定nc将处于侦听模式 ...
- windows cmd下netstat查看占用端口号的进程和程序
其实很简单,大家可以在cmd窗口 C:\Documents and Settings\Administrator>netstat -help 显示协议统计信息和当前 TCP/IP 网络连接. N ...
- 《C 程序设计语言》练习1-3
#include<stdio.h> /*当fahr=0,20,...,300时,打印华氏温度与摄氏温度对照表; 浮点数版本*/ main () { float fahr,celsius; ...
- 文件加密,密码加密,os模块
序列化模块 (非常非常重要) 序列化:将一个数据结构(list,dict....)转化成一个特殊的序列(特殊的字符串)的过程. # l1 = [1, 2, 3] # ret = str(l1) # p ...
- relieved|auction|calculate|campaign|charge for |chartered
ADJ-GRADED 感到宽慰的;感到安心的;宽心的If you are relieved, you feel happy because something unpleasant has not h ...
- 升级mongodb数据库2.6.6到3.0.3,切换引擎,主从同步数据
只升级mongodb的版本极为简单,更新/替换 bin/目录下的可执行文件即可. debian和osx上的升级,按步骤来,没什么好说的. http://docs.mongodb.org/manual/ ...