扩展_报表_JasperReport
- 简述
- 生命周期
- 模板制作
- SpringBoot整合
-
- pom.xml
- Parameters(参数)填充
- JavaBean 填充
- 分组报表
- 图形报表
- 父子报表
简述
在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较 重要的一种: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是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成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就能生成最终用户想要的文档格式。
生命周期
- 设计阶段(Design):所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的 复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保 存为JRXML文件(JR代表JasperReports),其实就是一个XML文件。
- 执行阶段(Execution):使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执 行,填充报表数据
- 输出阶段(Export):数据填充结束,可以指定输出为多种形式的报表
模板制作
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 报表引擎解析、显示。
下载地址: https://community.jaspersoft.com/community-download
SpringBoot整合
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.5.0</version>
</dependency>
<dependency>
<groupId>org.olap4j</groupId>
<artifactId>olap4j</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
Parameters(参数)填充
Parameters通常是用来在打印的时候从程序里传值到报表里。也就是说parameters通常的是起参数传递的作用。 他们可以被用在一些特定的场合(比如应用中SQL 查询的条件),如report中任何一个需要从外部传入的变量等(如一个 Image对象所包括的char或报表title的字符串)。parameters也需要在创建的时候定义它的数据类型。parameters 的数据类型是标准的java的Object。
(1) 创建新模板,删除不需要的Band
(2)创建Parameter
@GetMapping("/testJasper02")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1.引入jasper文件
Resource resource = new ClassPathResource("templates/parametersTest.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
// 2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
/**
*
* parameters集合中传递的key需要和设计模板中使用的name一致
*
*/
HashMap parameters = new HashMap();
parameters.put("title", "用户详情");
parameters.put("username", "李四");
parameters.put("companyName", plxc");
parameters.put("mobile", "120");
parameters.put("departmentName", "讲师");
JasperPrint print = JasperFillManager.fillReport(fis, parameters, new JREmptyDataSource());
// 3.将JasperPrint已PDF的形式输出
JasperExportManager.exportReportToPdfStream(print, os);
response.setContentType("application/pdf");
} catch (JRException e) {
e.printStackTrace();
} finally {
os.flush();
}
}
JavaBean 填充
//测试javaBean数据源
@GetMapping("/testJasper04")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1.引入jasper文件
Resource resource = new ClassPathResource("templates/testJavaBean.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();
}
}
// 一般从数据库查询
public List<User> getUserList() throws Exception {
List<User> list = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
User user = new User(i + "", "testName" + i, "10" + i, "企业" + i, "部门" + i);
list.add(user);
}
return list;
}
分组报表
/**
* 分组报表
*/
@GetMapping("/testJasper5")
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 {
Map parameters = new HashMap<>();
//构建javaBean的数据源
//1.获取到对象的list集合
List<User> userList = getUserList();
//2.通过list集合创建javaBean的数据源对象
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(userList);
JasperPrint print = JasperFillManager.fillReport(fis,parameters,ds);
JasperExportManager.exportReportToPdfStream(print,os);
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}
public List<User> getUserList() {
List<User> list = new ArrayList<>();
for(int i=0;i<10;i++) {
User user = new User(i+"", "itcast"+i, "传智播客","讲师", "1380000000"+i);
list.add(user);
}
for(int i=0;i<5;i++) {
User user = new User(i+"", "itheima"+i, "黑马程序员","讲师", "1380000000"+i);
list.add(user);
}
return list;
}
图形报表
/**
* charts图形报表
*/
@GetMapping("/testJasper6")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/testCharts.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
Map parameters = new HashMap<>();
//构建javaBean的数据源
//1.获取到对象的list集合
List<UserCount> userList = getUserCountList();
//2.通过list集合创建javaBean的数据源对象
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(userList);
JasperPrint print = JasperFillManager.fillReport(fis,parameters,ds);
JasperExportManager.exportReportToPdfStream(print,os);
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}
public List<UserCount> getUserCountList() {
List<UserCount> list = new ArrayList<>();
UserCount uc1 = new UserCount("传智播客",1000l);
UserCount uc2 = new UserCount("黑马程序员",1000l);
UserCount uc3 = new UserCount("baidu",1000l);
list.add(uc1);
list.add(uc2);
list.add(uc3);
return list;
}
父子报表
/**
* 父子报表
*/
@GetMapping("/testJasper7")
public void createPdf(HttpServletRequest request, HttpServletResponse response) throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/main01.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
Map parameters = new HashMap<>();
//参数 子报表的路径 子报表需要的数据
Resource subResout = new ClassPathResource("templates/testCharts.jasper");
parameters.put("sublist",getUserCountList());//子报表需要的数据
parameters.put("subpath",subResout.getFile().getPath());// 子报表的路径
JasperPrint print = JasperFillManager.fillReport(fis,parameters,new JREmptyDataSource());
JasperExportManager.exportReportToPdfStream(print,os);
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}
public List<UserCount> getUserCountList() {
List<UserCount> list = new ArrayList<>();
UserCount uc1 = new UserCount("传智播客",1000l);
UserCount uc2 = new UserCount("黑马程序员",1000l);
UserCount uc3 = new UserCount("baidu",1000l);
list.add(uc1);
list.add(uc2);
list.add(uc3);
return list;
}