概述与安装使用

1. PDF报表概述

概述

​ 在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,例如货运详情,货运单等。

常见PDF报表的制作方式

目前世面上比较流行的制作PDF报表的工具如下:

  1. iText PDF:iText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
  2. Openoffice:openoffice是开源软件且能在windows和linux平台下运行,可以灵活的将word或者Excel转化为PDF文档。
  3. 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执行流程(重点+)

  1. JRXML:报表填充模板,本质是一个XML.

    JasperReport已经封装了一个dtd,只要按照规定的格式写这个xml文件,那么jasperReport就可以将其解析最终生成报表,但是jasperReport所解析的不是我们常见的.xml文件,而是.jrxml文件,其实跟xml是一样的,只是后缀不一样。
  2. Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据。

    解析完成后JasperReport就开始编译.jrxml文件,将其编译成.jasper文件,因为JasperReport只可以对.jasper文件进行填充数据和转换,这步操作就跟我们java中将java文件编译成class文件是一样的
  3. .Jrprint:当用数据填充完Jasper后生成的文件,用于输出报表。

    这一步才是JasperReport的核心所在,它会根据你在xml里面写好的查询语句来查询指定是数据库,也可以控制在后台编写查询语句,参数,数据库。在报表填充完后,会再生成一个.jrprint格式的文件(读取jasper文件进行填充,然后生成一个jrprint文件)
  4. Exporter:决定要输出的报表为何种格式,报表输出的管理类。
  5. 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 报表引擎解析、显示。

安装配置

  1. 到JasperReport官网下载 https://community.jaspersoft.com/community-download

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

  2. 主界面

基本使用

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

  1. 下一步,输入项目名称:

  1. 创建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步:

  1. 制作jasper模板
  2. 导出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框架使用教程(附带常见空白页问题说明)的更多相关文章

  1. 深度学习与CV教程(8) | 常见深度学习框架介绍

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  2. PHP: 手把手编写自己的 MVC 框架实例教程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  3. [!!!!!]Inno Setup教程-常见问题解答

    [转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字  * 它支持 MBCS (多字节字符集) 吗?  * 将来会支持 Windows Installer 吗?   ...

  4. dwr与ssh框架整合教程

    (1)dwr与ssh框架整合教程dwr框架介绍. DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开 发人员开发包含AJ ...

  5. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  6. 关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?

    学习LAMP.LNMP时,遇到很奇怪的问题就是:搭建完LAMP或LNMP环境后安装PHPweb程序时,Discuz和Wordpress打不开安装向导,直接显示空白页(PHPWind9.0除外),没有任 ...

  7. php教程之php空白页的原因及解决方法

    php中出现空白页的原因及解决方法汇总. 很多程序员在进行php开发的时候都遇到过出现空白页的请,综合分析来说,在php编程中出现空白页面可能是由以下几个原因造成的: 1.逻辑错误逻辑错误是最难排除的 ...

  8. 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍  <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

随机推荐

  1. 18)PHP,可变函数,匿名函数 变量的作用域

    (1)可变函数: 可变函数,就是函数名“可变”——其实跟可变变量一样的道理. $str1 = “f1”;   //只是一个字符串,内容为”f1” $v1 = $str1(3, 4);   //形式上看 ...

  2. space sniffer

    space sniffer 一款检测本地磁盘文件占用情况的工具,高效,快速.

  3. [LC] 314. Binary Tree Vertical Order Traversal

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  4. PAT甲级——1002 A+B for Polynomials

    PATA1002 A+B for Polynomials This time, you are supposed to find A+B where A and B are two polynomia ...

  5. 1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?

    网络编程分为UDP通信和TCP通信 UDP协议: 发送端:1.创建DatagramSocket对象.2.创建DatagramPacket对象,并封装数据.3.发送数据.4.释放 资源. 接收端:1.创 ...

  6. redHat更新yum源

    1. 网易镜像仓库查找相关rpm 包并下载 :http://mirrors.163.com/centos/6/os/x86_64/Packages/ wget http://mirrors.163.c ...

  7. 75)PHP,session在使用时的一些语法问题

    (1)cookie仅能存字符串类型,但是session能存任何数据类型,比如: 然后我在session_2.php中输出这个session_1.php的数据: 结果展示: 我得在浏览器的地址栏中先请求 ...

  8. java 变量分类

    转:https://blog.csdn.net/suneqing/article/details/37909811 1.按被声明的位置划分 局部变量:方法和语句块内定义的的变量.(在定义局部变量时,必 ...

  9. Null Hypotheses| Alternative Hypotheses|Hypothesis Test|Significance Level|two tailed |one tailed|

    9.1 The Nature of Hypothesis Testing Over the years, however, null hypothesis has come to mean simpl ...

  10. Python opencv PIL numpy base64互相转化

    PIL2numpy and numpy2PIL from PIL import Image import numpy image = Image.open('timg.jpeg')# image is ...