使用response的输出流输出pdf文件_博学谷基于SaaS平台的iHRM实战开发图片上传及Jasper用户档案PDF报表 第10章...

本文档详细介绍了如何使用JasperReport在Java应用程序中生成动态PDF报表,涵盖了参数Map填充、JDBC数据源填充、JavaBean数据源、分组报表、图表和父子报表的制作方法。通过实例代码展示了如何从数据源获取数据并输出到PDF文件中。
摘要由CSDN通过智能技术生成

第10章 用户档案PDF报表


理解数据填充的两种方式
熟练构造分组报表
熟练构造Chart图形报表
实现个人档案的PDF输出


1 数据填充


我们介绍了如何使用JasperReport来生成简单的文本报表,正式企业开发中动态数据展示也是报表中最重要的一环,接下来我们共同研究的就是填充动态数据到PDF报表中。
/**
* 填充数据构造JasperPrint
* is: 文件输入流
* parameters:参数
* dataSource:数据源
*/
public static JasperPrint fillReport(InputStream is, Map parameters,
JRDataSource dataSource) throws JRException {

通过这段填充数据的源代码得知,JasperReport对报表模板中的数据填充有很多方式,最典型的有以下两种:
Parameters(参数)填充
DataSource(数据源)填充


1.1 参数Map填充数据


Parameters通常是用来在打印的时候从程序里传值到报表里。也就是说parameters通常的是起参数传递的作用。他们可以被用在一些特定的场合(比如应用中SQL 查询的条件),如report中任何一个需要从外部传入的变量等(如一个Image对象所包括的char或报表title的字符串)。parameters也需要在创建的时候定义它的数据类型。parameters的数据类型是标准的java的Object。


1.1.1 模板制作


(1) 创建新模板,删除不需要的Band

f09a09197d6ffb5cebeb60737bfcd7d1.png
(2)创建Parameter
在outline面板中找到Parameters,右键 -> Create Parameter,新建一个Parameter(生成一个Paramerter1)

b222e0e6862f0901afa8fd134681e206.png
右键 Paramete1 -> Show Properties. 设置Name为title、Class为java.lang.String.这里要注意名字要认真取不能重复,因为传入的参数的key就是这个参数名,以此来进行一一对应

db0ce2780886f2bcf66b802823e62965.png
(3)模板参数设置
将设置好的参数直接拖入表格中对应的位置,并设置好大小与对齐方式。

5dc63b4ac131b8006f242cda01bcc9ae.png


1.1.2 PDF输出


@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","传智播客");
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();
}
}

1.2 数据源填充数据


1.2.1 JDBC数据源


1.2.1.1 配置数据连接


使用JDBC数据源填充数据:使用Jaspersoft Studio 先要配置一个数据库连接填写数据源的类型,选择“Database JDBC Connection”

75e8d20b41ddf01dddc6ba043fb450e9.png
配置数据库信息

82dbf8e374a3aa17a7a7d9bf20e4839f.png
这一步,需要:(1)给创建的这个数据连接起个名字;(2)根据数据库选择驱动类型;Jaspersoft Studio 已经内置了很多常用数据库的驱动,使用的时候直接选就可以了。当然,如果这还满足不了你的话,你还可以添加你指定的 JDBC 驱动 jar 包。


1.2.1.2 模板制作


(1)制作空白模板
创建空白模板,并将不需要的Band
(2)将数据库用户字段配置到模块中
为了方便的进行模板制作,可以将需要数据库表中的字段添加到Studio中。在outline中右键模板,选择dataset
and query

cb9e4ad7f3672b48040cf112201da96e.png
用户可以在 SQL 查询语句输入窗口中,输入需要查询数据的查询语句,点击右上角的“Read Fields”按钮,界面下方的字段列表中,就会显示此查询语句中所涵盖的所有字段的列表。在后面的报表设计中,我们就可以直接使用这些字段了。

2c3b23e48efd1a4b6a8bf606e14a448f.png
在“Fields”列表中,只保留报表中使用的字段,其他用不到的字段最好用“Delete”删掉,防止由于数据表变化,导致报表模板中的字段设置与数据表对应不上,导致报表报错。输入完毕后,点击“OK”按钮,系统即会把查询语句保存在报表模板中。

48dc61804cdb0a7447b8dc4de6a778e0.png
(3)填充Filed
将id,mobile,username等拖入到 Detail Band中设计模板如下:

cd9cc3bef469549775028496744cd50b.png


1.2.1.3 PDF输出


//测试JDBC连接数据源
@GetMapping("/testJasper03")
public void createPdf(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/testConn.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
/**
* 1.jasper文件流
* 2.参数列表
* 3.数据库连接
*/
HashMap parameters = new HashMap();
JasperPrint print = JasperFillManager.fillReport(fis,
parameters,getConnection());
//3.将JasperPrint已PDF的形式输出
JasperExportManager.exportReportToPdfStream(print,os);
response.setContentType("application/pdf");
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}
//创建数据库Connection
public Connection getConnection() throws Exception {
String url = "jdbc:mysql://localhost/ihrm";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, "root", "111111");
return conn;
}

1.2.2 JavaBean数据源


1.2.2.1 创建Filed


(1)创建Filed

51ada834fcac593962e9224b11af8ee1.png

(2)构造模板ca4b7a578f5034300568810be95801af.png


1.2.2.2 PDF输出


(1)配置实体类
package cn.itcast.bean;
public class User {
private String id;
private String username;
private String mobile;
private String companyName;
private String departmentName;
public User(String id, String username, String mobile, String companyName, String
departmentName) {
this.id = id;
this.username = username;
this.mobile = mobile;
this.companyName = companyName;
this.departmentName = departmentName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
}

(2)使用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();
}
}
//创建数据库Connection
public List getUserList() throws Exception {
List 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;
}

2 分组报表


2.1 概述


有两种情况会使用分组报表:
1)美观和好看的显示。
2)当数据分为两层表时,经常需要批量打印子表的数据。打印时,常常需要按照父表的外键或关联值进行自动分组,即每一条父表记录所属的子表记录打印到一组报表中,每组报表都单独计数及计算页数。在应用中,可以通过选择需要打印的父表记录,将父表记录的 ID 传入,由报表自动进行分组。


2.2 设置分组属性


(1)新建模板
使用用户列表模板完成分组案例
(2)新建报表群组
选中报表名称点击右键,选择菜单中的“Create Group”。

07a9a52f199d73e7a772ee4f16b051e6.png


需要设置分组的名称、分组字段。也可以设置按照指定的函数、方法处理后进行分组

1e0ee8fc15a0f9e71f568ed39ec13362.png
按照字段“companyName”进行分组。设置完毕,点击“Next”。系统显示细节设置界面。此处可以设置是否加
入“group header”和“group footer”区。建议保持默认选中,加入这两个区域,这样可以控制在每组报表的结尾,
打印相应的信息,例如统计信息等。

14e1ae9ef7d9707c217bf78db1dd7c26.png
(3)放置报表数据
将companyName拖入 Group Header中 ,会跳出 TextField Wizard框,选中 NoCalculation Function

79356584499befdddebcfad79ab60087.png
双击 $F{deptId} 会弹出Expression editor框

859ad0a426c2f7c2182a8e6479472d92.png


2.3 添加分组Band


将需要作为表头打印的内容拖入 CompanyGroup Header1 栏,将字段拖入 detail 栏,将每个分组结尾需要打印的内容放入 Companygroup footer 栏,将页脚需要打印的内容放入 Page Footer栏,如下图。

f3d49240f699458d84d52515442e2c8c.png


2.4 PDF输出


//测试分组
@GetMapping("/testJasper05")
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 {
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();
}
}
//创建数据库Connection
public List getUserList() throws Exception {
List list = new ArrayList<>();
for(int i=1;i<=3;i++) {
User user = new User("it00"+i, "itcast"+i, "1380000000"+i, "传智播客", "讲
师");
list.add(user);
}
for(int i=1;i<=3;i++) {
User user = new User("hm00"+i, "itheima"+i, "1880000000"+i, "黑马程序员", "讲
师");
list.add(user);
}
return list;
}

效果如下:

40dcd434488c13c3fe2d36f05de91960.png


3 Chart图表


3.1 创建模板


(1)创建模板,删除不需要的band,保留title和summary。

f0e328ae48d8b56812a77b5c61b037d5.png
(2)创建fileds

d1e0d17ed936c6c53d7c30702710b308.png
(3)创建chart图标
第一步:palette面板找到chart图表,拖拽到band中
第二步:选择需要的图表类型

e688fc8279f5fb91f0f63a5453cb325a.png
第三步:设置图表参数

b428aa1aa800c985a371d6f27c8322e1.png

1)Key:圆饼图的内容是什么,也就是下面的 First,Second…的内容
2)Value:这个圆饼图的比例依据,根据 Value 属性来显示每个 Key 占的比例
3)Label:显示标签


3.2 PDF输出


3.2.1 实体类


public class UserCount {
private String companyName;
private Integer count;
public UserCount(String companyName, Integer count) {
this.companyName = companyName;
this.count = count;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}

3.2.2 PDF输出


//测试图表
@GetMapping("/testJasper06")
public void createPdf(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/testChart.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
HashMap parameters = new HashMap();
//parameters.put("userCountList",getUserList());
//构造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();
}
}
//创建数据库Connection
public List getUserList() throws Exception {
List list = new ArrayList<>();
UserCount uc1 = new UserCount("传智播客",10);
UserCount uc2 = new UserCount("黑马程序员",10);
list.add(uc1);
list.add(uc2);
return list;
}


4 父子报表


4.1 概述


复杂报表或数据内容较多的时候,可以使用子报表解决。


4.2 制作父报表


首先制作父报表,就是调用子报表的一个基础报表。主报表的作用有如下两种:
1)父报表中需要显示数据,使用子报表弥补studio设计的不足
2)父报表不需要显示任何数据,只是作为子报表的载体。适用于复杂报表的设计


4.3 制作子报表


点击组件面板上的“Subreport”按钮,拖动到报表工作区上。

5045dd9d69efddd5d61a132c7f250614.png
系统会自动弹出子报表选择窗口。可以选择创建一个新报表,还是使用一个已有的报表作为子报表。

0bc42d7af142f2c7d760188654faf44c.png
选择“Create a new report”,可以立即制作新的子报表;如果选择“Select an existing report”,则可以调用已经有的报表作为子报表;如果选择“Just create the subreport element”,系统会生成一个子报表区,可以在之后挂接需要的子报表。


4.4 参数传递

23fa71b2f15043e9fb053250005a50b0.png
//测试父子模板
@GetMapping("/testJasper07")
public void createPdf(HttpServletRequest request, HttpServletResponse response)
throws Exception {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/main.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.创建JasperPrint,向jasper文件中填充数据
ServletOutputStream os = response.getOutputStream();
try {
HashMap parameters = new HashMap();
Resource subResource = new ClassPathResource("templates/sub-group.jasper");
parameters.put("subpath",subResource.getFile().getPath());
parameters.put("sublist",getUserList());
parameters.put("sublist",getUserList());
JRBeanCollectionDataSource ds = new
JRBeanCollectionDataSource(getUserList());
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();
}
}
//创建数据库Connection
public List getUserList() throws Exception {
List list = new ArrayList<>();
for(int i=1;i<=3;i++) {
User user = new User("it00"+i, "itcast"+i, "1380000000"+i, "传智播客", "讲
师");
list.add(user);
}
for(int i=1;i<=3;i++) {
User user = new User("hm00"+i, "itheima"+i, "1880000000"+i, "黑马程序员", "讲
师");
list.add(user);
}
return list;
}


5 用户档案下载


5.1 搭建环境


(1) 配置坐标net.sf.jasperreportsjasperreports6.5.0org.olap4jolap4j1.2.0com.lowagieitext2.1.7

(2)解决乱码问题
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperrepor
ts.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml


5.2 实现用户档案下载


/**
* 打印员工pdf报表x
*/
@RequestMapping(value="/{id}/pdf",method = RequestMethod.GET)
public void pdf(@PathVariable String id) throws IOException {
//1.引入jasper文件
Resource resource = new ClassPathResource("templates/profile.jasper");
FileInputStream fis = new FileInputStream(resource.getFile());
//2.构造数据
//a.用户详情数据
UserCompanyPersonal personal = userCompanyPersonalService.findById(id);
//b.用户岗位信息数据
UserCompanyJobs jobs = userCompanyJobsService.findById(id);
//c.用户头像 域名 / id
String staffPhoto = "http://pkbivgfrm.bkt.clouddn.com/"+id;
System.out.println(staffPhoto);
//3.填充pdf模板数据,并输出pdf
Map params = new HashMap();
Map map1 = BeanMapUtils.beanToMap(personal);
Map map2 = BeanMapUtils.beanToMap(jobs);
params.putAll(map1);
params.putAll(map2);
params.put("staffPhoto","staffPhoto");
ServletOutputStream os = response.getOutputStream();
try {
JasperPrint print = JasperFillManager.fillReport(fis, params,new
JREmptyDataSource());
JasperExportManager.exportReportToPdfStream(print,os);
} catch (JRException e) {
e.printStackTrace();
}finally {
os.flush();
}
}

以下是视频目录截图!!!

需要视频下载call 我!!!

f97894d0a4c94055133ce567cef4a1eb.png

4f97dbf71bd5c5a4ad0615bf1155cd18.png

582d22a96e79630b9bd68ff18e9c5220.png

第10章完结!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值