pdf数据填充

填充动态数据到PDF报表中

/**
*填充数据构造JasperPrint
*is: 文件输入流
*parameters:参数
*dataSource:数据源
*/
public static JasperPrint fillReport(InputStream is, Map<String, Object> parameters, JRDataSource dataSource) throws JRException {

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

Parameters(参数)填充DataSource(数据源)填充

参数Map填充数据

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

模板制作

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

2)创建Parameter

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

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

3)模板参数设置

将设置好的参数直接拖入表格中对应的位置,并设置好大小与对齐方式。

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();
}
}

数据源填充数据

JDBC数据源

配置数据连接

使用JDBC数据源填充数据:使用Jaspersoft Studio 先要配置一个数据库连接

填写数据源的类型,选择“Database JDBC Connection”

配置数据库信息 

这一步,需要:

(1)给创建的这个数据连接起个名字;

(2)根据数据库选择驱动类型; Jaspersoft Studio 已经内置了很多常用数据库的驱动,使用的时候直接选就可以了。当然,如果这还满足不了你的话,你还可以添加你指  定的 JDBC 驱动 jar 包。

模板制作

1)制作空白模板

创建空白模板,并将不需要的Band

2)将数据库用户字段配置到模块中

为了方便的进行模板制作,可以将需要数据库表中的字段添加到Studio中。在outline中右键模板,选择dataset and query

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

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

3)填充Filed

将id,mobile,username等拖入到 Detail Band中设计模板如下:

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;
}

创建Filed

1)创建Filed

2)构造模板

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<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;
}

​​​​​​​分组报表

概述

有两种情况会使用分组报表: 美观和好看的显示。

当数据分为两层表时,经常需要批量打印子表的数据。打印时,常常需要按照父表的外键或关联值进行自动

分组,即每一条父表记录所属的子表记录打印到一组报表中,每组报表都单独计数及计算页数。

在应用中,可以通过选择需要打印的父表记录,将父表记录的 ID 传入,由报表自动进行分组。

设置分组属性

1)新建模板

使用用户列表模板完成分组案例

2)新建报表群组

选中报表名称点击右键,选择菜单中的“Create Group”。

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

按照字段“companyName”进行分组。设置完毕,点击“Next”。系统显示细节设置界面。此处可以设置是否加

入“group header”和“group footer”区。建议保持默认选中,加入这两个区域,这样可以控制在每组报表的结尾, 打印相应的信息,例如统计信息等。

3)放置报表数据

将companyName拖入 Group Header中 ,会跳出 TextField Wizard框,选中 NoCalculation Function

双击 $F{deptId} 会弹出Expression editor框

​​​​​​​添加分组Band

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

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<User> getUserList() throws Exception {
List<User> 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;
}

Chart图表

创建模板

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

(3)创建chart图标

第一步:palette面板找到chart图表,拖拽到band中第二步:选择需要的图表类型

第三步:设置图表参数

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

​​​​​​​PDF输出

实体类

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;
}
}

​​​​​​​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<UserCount> getUserList() throws Exception {
List<UserCount> list = new ArrayList<>(); UserCount uc1 = new UserCount("传智播客",10); UserCount uc2 = new UserCount("黑马程序员",10); list.add(uc1);
list.add(uc2); return list;
}

父子报表

概述

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

制作父报表

首先制作父报表,就是调用子报表的一个基础报表。主报表的作用有如下两种: 父报表中需要显示数据,使用子报表弥补studio设计的不足

父报表不需要显示任何数据,只是作为子报表的载体。适用于复杂报表的设计

制作子报表

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

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

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

​​​​​​​参数传递

/测试父子模板
@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<User> getUserList() throws Exception { List<User> 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;
}

用户档案下载

​​​​​​​搭建环境

(1) 配置坐标


<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>

(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

实现用户档案下载

/**
* 打印员工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<String, Object> map1 = BeanMapUtils.beanToMap(personal); Map<String, Object> 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();
}
}

代码示例下载:

链接:https://pan.baidu.com/s/1R234WamTLI_fAOHr_WlrFg 
提取码:nnyt

pdf数据填充,JaspersoftStudio,JasperReport相关推荐

  1. pdf模板工具JaspersoftStudio,JasperReport

    pdf模板工具JaspersoftStudio,JasperReport 概述 Jaspersoft    Studio是JasperReports库和JasperReports服务器的基于Eclip ...

  2. Java word动态数据填充并转为pdf最详细的讲解附带项目

    Java Word数据动态填充,并将word转为pdf 适用范围: 1.已有word模板,word中的一些数据需要动态生成. 2.word转为pdf 本文章讲解的内容是一个完整的适用流程.就是首先是一 ...

  3. java之数据填充PDF模板

    1.既然要使用PDF模板填充,那么就需要制作PDF模板,可以使用Adobe Acrobat DC,下载地址:https://carrot.ctfile.com/dir/11269771-2715881 ...

  4. 后台填充pdf数据后并下载 的实现

    场景:后台有"合同".pdf 需要填充 客户名称.身份证件号 等信息. 解决办法: 方式1: 先对pdf进行特殊处理,设置"表单",再通过程序获取pdf的表单, ...

  5. 使用iTextPdf为Pdf模板填充表单项

    说明 日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态.批量向Pdf模板中填充内容. 这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf ...

  6. PDF数据提取------1.介绍

    1.关于PDF文件     PDF(Portable Document Format的简称,意为"便携式文件格式")是由Adobe Systems在1993年用于文件交换所发展出的 ...

  7. R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析、用虚线标记进行数据填充的区域

    R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析.用虚线标记进行数据填充的区域 目录

  8. pandas使用pct_change函数计算数据列的百分比变化:计算当前元素和前一个元素之间的百分比变化(包含NaN值的情况以及数据填充方法)

    pandas使用pct_change函数计算当前元素和前一个元素之间的百分比变化:默认情况下pct_change函数计算与紧邻前一行相比的百分比变化.计算当前元素和前一个元素之间的百分比变化(包含Na ...

  9. C# - list数据填充到Dataset里

    C# - list<>数据填充到Dataset里 publicstatic DataSet ConvertToDataSet<T>(IList<T> list) { ...

最新文章

  1. 爱立信华为MWC展前叫阵:5G成重头戏
  2. getCount()和getChildCount()区别
  3. poj 2454 Jersey Politics 随机化
  4. python实现文件下载-Python 实现文件下载
  5. 【转载】Linux修改文件权限
  6. java中8种基本类型与运算符
  7. centos7配置br0_centos7 bond 和 网桥配置
  8. asp.net 生成、解析条形码和二维码
  9. MySQL语法解析和预处理(Parser Preprocessor)
  10. 计算机应用基础王秀娟,计算机应用基础课教学内容设计分析.doc
  11. Powershell 批量替换文件
  12. 双向关联一对一映射详解(2)
  13. Hibernate学习之createSQLQuery与createQuery的区别及使用
  14. Java高级编程练习题
  15. codeblocks下载安装教程
  16. 黑苹果 OC (OpenCore) 引导 0.6.8 最新版及其通用配置
  17. html设计思路,网页设计思路7个方法
  18. html 中 超链接的写法,网页超链接样式的CSS写法
  19. 【Unity】Unity 几何知识、弧度、三角函数、向量运算、点乘、叉乘
  20. Opencv测量图片中的物体大小

热门文章

  1. 大批量安装系统的解决方案(集锦)
  2. 重拾web开发-DIV+CSS基础(总结)
  3. java字符串加密解密
  4. 现有书形成的网络职业知识体系
  5. Django实战1-权限管理功能实现-10:用户管理
  6. 用java网络编程中的TCP方式上传文本文件及出现的小问题
  7. CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码...
  8. 用Java实现HTTP Multipart的服务端和客户端
  9. ajax前台值传到后台
  10. 如何经由PHP获得MySQL procedure结果