在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。除了 Excel 报表之外,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

1.1介绍

JasperReport 是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成 PDF,HTML,或者 XML格式。该库完全由 Java 写成,可以用于在各种Java应用程序,包括 J2EE,Web应用程序中生成动态内容。只需要将 JasperReport 引入工程中即可完成 PDF 报表的编译、显示、输出等工作。数据源支持更多,常用 JDBC SQL 查询、XML 文件、CSV 文件 、HQL(Hibernate 查询),HBase,JAVA集合等。还允许你义自己的数据源,通过 JASPER 文件及数据源,JASPER 就能生成最终用户想要的文档格式。

1.2开发步骤

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

  • 设计阶段( De sign ):所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保存为JRXML 文件(JR 代表 JasperReports),其实就是一个 XML 文件。

  • 执行阶段(Execution ):使用以 JRXML 文件编译为可执行的二进制文件(即.Jasper 文件)结合数据进行执行,填充报表数据。

  • 输出阶段(Export ):数据填充结束,可以指定 输出为多种形式的报表。

Tips: 综上得知,对于使用JasperReport进行开发,我们重点关注如下几点即可:

  • 制作报表模板并进行编译

  • 构造数据并填充模板

  • 输出报表

1.3模板工具Jaspersoft Studio

Jaspersoft Studio 是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格式.jrxml 的 XML 文件,并且可以把.jrxml 文件编译成.jasper 格式文件方便 JasperReport 报表引擎解析、显示。

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

(关于Jaspersoft Studio的使用这里不做介绍)

制做好模板并编译为 .jasper文件, 将模板文件拷贝到项目中(使用中文,需要拷贝模板中使用到的相应字体文件),目录结构如下:

webapp/jasper/dintalk.jasper | 模板文件

resources/stsong/fonts.xml /stsong.TTF | 字体文件

1.4导入相关坐标

<!--jasper坐标-->
<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>

1.5填充模板并输出

/**
* 生成用户的采购表单
* @param id
*/
@RequestMapping(value = "/userPdf",name = "下载用户采购单")
public void userPdf(String id) throws IOException, JRException {
//1.读取jasper文件
String realPath = session.getServletContext().getRealPath("/jasper/dintalk.jasper");
InputStream in = new FileInputStream(realPath);
//2.根据用户的id查询用户,将其转为Map
User user = userService.findById(id);
Map<String, Object> map = BeanMapUtils.beanToMap(user);
//3.使用用户的id,查询所购商品信息
ProductExample productExample = new ProductExample();
productExample.createCriteria().andUserIdEqualTo(id);
List<Product> Products = productService.findAll(productExample);
//4.创建jrdatasource :数据源
JRDataSource jrDataSource = new JRBeanCollectionDataSource(products);
//5.创建pdf的输出对象,参数(模板输入流, map, 数据源 )
JasperPrint jasperPrint = JasperFillManager.fillReport(in,map,jrDataSource); //==========设置pdf下载时的文件名称, 及解决文件名称中文乱码问题=============== //6.设置页面下载文件名称
String fileName = user.getName()+"采购单.pdf";
//7.处理中文文件名乱码问题:根据user-agent获取浏览器类型
fileName = DownloadUtil.getName(request.getHeader("user-agent"),fileName); //7.1 设置此响应头,则点击下载链接后直接完成下载
//response.setHeader("Content-Disposition", "attachment;filename="+fileName); //7.2 设置此响应头,则点击后在浏览器预览(若链接有设置,可打开新页面),可再下载
//response.setHeader("content-Disposition","filename="+fileName); //==========设置pdf下载时的文件名称, 及解决文件名称中文乱码问题=============== //8.输出pdf
JasperExportManager.exportReportToPdfStream(jasperPrint,response.getOutputStream());
//9.关闭流
in.close();
}

Tips1: 处理中文文件名乱码问题

1.关于修改下载文件名(若不进行设置,则默认下载文件名为 : userPdf.do 请求链接的结尾部分)
2.DownloadUtil.getName(request.getHeader("user-agent"),fileName);
public static String getName(String agent, String filename) throws
UnsupportedEncodingException { if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
3.处理中文文件名乱码问题,还需在下载链接页面加入以下内容
<script>
function isIE(){
//获取当前浏览器相关信息
var explorer = window.navigator.userAgent.toLowerCase() ;
//判断是否是ie浏览器
if (explorer.indexOf("msie") >= 0 || explorer.indexOf("rv:11.0) like gecko") >=
0) {
return true;
}else {
return false;
}
}
//ww 是下载链接的id,使用时修改
window.onload = function () {
if(isIE()){
//在是IE浏览器的情况下,对中文请求参数编码
var str = document.getElementById("ww").href;
str = encodeURI(str);
document.getElementById("ww").href = str;
}
};
</script>

Tips2:将实体对象转为Map对象

1.BeanMapUtils.beanToMap(user);
import org.springframework.cglib.beans.BeanMap;
import java.util.HashMap;
import java.util.Map; public class BeanMapUtils {
/**
* 将对象属性转化为map结合
*/
public static <T> Map<String, Object> beanToMap(T bean) {
Map<String, Object> map = new HashMap<String, Object>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key+"", beanMap.get(key));
}
}
return map;
}

关注微信公众号, 随时随地学习

Java操作pdf: JarsperReport的简单使用的更多相关文章

  1. 转 Java操作PDF之iText详细入门

    转 Java操作PDF之iText详细入门 2016年08月08日 11:06:00 阅读数:19490 iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成 ...

  2. Java 操作pdf与excel

    java 操作pdf组件  itextpdf <dependency> <groupId>com.itextpdf</groupId> <artifactId ...

  3. java操作pdf添加页眉条码添加水印图片

    添加条码页眉以及图片水印 1. 引入jar包     1. itext-4.2.1.jar     2. itext-asian-5.2.0.jar     3. jbarcode-0.2.8.jar ...

  4. Java操作PDF之itext入门

    转载:http://lichunhui.iteye.com/blog/1550584 iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档 ...

  5. Java操作PDF之iText超入门

    iText是著名的开放项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. http://itextpdf.c ...

  6. java操作mongoDB数据库的简单实例

    首先导入mongoDB的jar包 http://pan.baidu.com/s/1bnGMJRD //DataBase.java package com.mongodb.test; import ja ...

  7. Java操作Excel之POI简单例子

    /** * 利用POI操作Excel表单 * * 需要jar包: * HSSF针对03及以前版本,即.xls后缀 * |---poi-3.16.jar * XSSF针对07及以后版本,即xlsx后缀 ...

  8. java操作pdf

    使用pdf模板生成pdf 1,工具 Adobe Acrobat X Pro 2,pom文件配置 <dependency> <groupId>com.itextpdf</g ...

  9. Java 借助poi操作PDF工具类

    ​ 一直以来说写一个关于Java操作PDF的工具类,也没有时间去写,今天抽空写一个简单的工具类,拥有PDF中 换行,字体大小,字体设置,字体颜色,首行缩进,居中,居左,居右,增加新一页等功能,如果需要 ...

随机推荐

  1. WebApi-路由机制 Visual Studio 2015中的常用调试技巧分享

    WebApi-路由机制   一.WebApi路由机制是什么? 路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地址和路由表中的路由进行匹配,并根据最终匹配的路由去寻找并匹配相应 ...

  2. Linux下kill命令的学习,(主要根据man手册进行的翻译)

    名字      kill -终止一个进程 格式     kill  [-s signal | -p]  [--] pid ..                                      ...

  3. Eclipse导入项目: No projects are found to import

    Eclipse导入项目: No projects are found to import  如果发导入工程import的时候,出现”No projects are found to import” 的 ...

  4. GCC编译动态和静态链接库例子

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...

  5. 2016/2/25 1、<表单验证<form></form> 2、正则表达式 3、事件

    1.<表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电 ...

  6. 2015/12/29 eclipse应用 输出三角形

    public class Myfirst { public static void main(String[] args) { System.out.println("hello world ...

  7. Synthesizing Images of Humans in Unseen Poses

    Synthesizing Images of Humans in Unseen Poses balakg/posewarp-cvpr2018 https://github.com/balakg/pos ...

  8. 移动端和PC端有什么区别

    1.PC考虑的是浏览器的兼容性,而移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器使用的都是webkit内核,所以说做移动端开发,更多考虑的应该是手机分辨 ...

  9. appche配置访问限制

    1. 禁止访问某些文件/目录增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:<Files ~ "\.inc$">   Order a ...

  10. idea新建springmvc+spring+mybaties项目1

    1,点击file,选择module,新建项目 2,选择maven -- >maven-archetype-webapp 3,输入GroupId,ArtifactId,点击next 4,选择本地m ...