PDF报表的制作入门,JasperReport

概述

在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,必须用户详细资料,用户简历等。接下来的课程,我们就来共同学习PDF报表

常见PDF报表的制作方式

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

1.iText PDFiText是著名的开放项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDFrtf

的文档,而且可以将XMLHtml文件转化为PDF文件。

2.Openofficeopenoffice是开源软件且能在windowslinux平台下运行,可以灵活的将word或者Excel转化   为PDF文档。

3.Jasper Report:是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF

JasperReport框架的介绍

JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDFHTML,或者

XML格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EEWeb应用程序中生成动态内容。只需要将JasperReport引入工程中即可完成PDF报表的编译、显示、输出等工作。

在开源的JAVA报表工具中,JASPER      Report发展是比较好的,比一些商业的报表引擎做得还好,如支持了十字交叉报表、统计报表、图形报表,支持多种报表格式的输出,如PDFRTFXMLCSVXHTMLTEXT

DOCX以及OpenOffice

数据源支持更多,常用 JDBC SQL查询、XML文件、CSV文件 、HQLHibernate查询),HBaseJAVA集合等。还允许你义自己的数据源,通过JASPER文件及数据源,JASPER就能生成最终用户想要的文档格式。

JasperReport的开发步骤

JasperReport生命周期

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

  1. 设计阶段(Design):所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的    复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保存为JRXML文件(JR代表JasperReports,其实就是一个XML文件。
  2. 执行阶段(Execution):使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执行,填充报表数据

3. 输出阶段(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

​​​​​​​开发流程概述

制作报表模板

模板编译

构造数据

一:qiniu-demo项目

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast</groupId><artifactId>qiniu-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>[7.2.0, 7.2.99]</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>

test/QiniuDemo.java

package cn.itcast.qiniu;import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.persistent.FileRecorder;
import com.qiniu.util.Auth;
import org.junit.Test;import java.io.IOException;
import java.nio.file.Paths;public class QiniuDemo {/*** 将图片上传到七牛云服务*      1.更新用户图片信息(用户id=key)*      2.访问图片*          存储空间分配的:http://pkbivgfrm.bkt.clouddn.com*          上传的文件名*          更新图片之后:访问的时候,再请求连接添加上时间戳**/@Testpublic void testUpload01() {//构造一个带指定Zone对象的配置类//指定上传文件服务器地址:Configuration cfg = new Configuration(Zone.zone0());//...其他参数参考类注释//上传管理器UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传String accessKey = "COuoDRVa7JLsuurzIvQSI_pEDceHDw3yGfJEmvwv";String secretKey = "3RWpTjB5Jxg3QosUFr4mxbHXJ5JR2m6AHQqYsSlr";String bucket = "ihrm-bucket";//图片路径String localFilePath = "C:\\Users\\ThinkPad\\Desktop\\ihrm\\day9\\资源\\资源\\001.png";//存入到存储空间的文件名String key = "test";//身份认证Auth auth = Auth.create(accessKey, secretKey);//指定覆盖上传String upToken = auth.uploadToken(bucket,key);try {//上传Response response = uploadManager.put(localFilePath, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}}//断点续传@Testpublic void testUpload02() {//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(Zone.zone0());//...其他参数参考类注释//...生成上传凭证,然后准备上传String accessKey = "COuoDRVa7JLsuurzIvQSI_pEDceHDw3yGfJEmvwv";String secretKey = "3RWpTjB5Jxg3QosUFr4mxbHXJ5JR2m6AHQqYsSlr";String bucket = "ihrm-bucket";//如果是Windows情况下,格式是 D:\\qiniu\\test.pngString localFilePath = "C:\\Users\\ThinkPad\\Desktop\\ihrm\\day9\\资源\\资源\\test.xlsx";//默认不指定key的情况下,以文件内容的hash值作为文件名String key = "testExcel";Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);//断点续传:String localTempDir = Paths.get(System.getProperty("java.io.tmpdir"), bucket).toString();System.out.println(localTempDir);try {//设置断点续传文件进度保存目录FileRecorder fileRecorder = new FileRecorder(localTempDir);UploadManager uploadManager = new UploadManager(cfg, fileRecorder);try {Response response = uploadManager.put(localFilePath, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);System.out.println(putRet.hash);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}} catch (IOException ex) {ex.printStackTrace();}}
}

二 :jr-demo项目

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast</groupId><artifactId>jr-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><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></dependencies>
</project>

jr-demo\src\test\java\cn\itcast\jr\JrDemo.java

package cn.itcast.jr;import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.view.JasperViewer;import java.util.HashMap;public class JrDemo {public static void main(String[] args) {showPdf();}//1.将pdf模板编译为Jasper文件public static void createJasper(){try{String path = "C:\\Users\\ThinkPad\\Desktop\\ihrm\\day9\\资源\\资源\\生命周期测试\\test01.jrxml";JasperCompileManager.compileReportToFile(path);}catch(Exception e){e.printStackTrace();}}//2.将Jasper文件和数据进行填充,获取Jrprintpublic static void createJrprint(){try{String path = "C:\\Users\\ThinkPad\\Desktop\\ihrm\\day9\\资源\\资源\\生命周期测试\\test01.jasper";//通过空参数和空数据源进行填充JasperFillManager.fillReportToFile(path,new HashMap(),new JREmptyDataSource());}catch(Exception e){e.printStackTrace();}}//3.预览public static void showPdf(){try{String path = "C:\\Users\\ThinkPad\\Desktop\\ihrm\\day9\\资源\\资源\\生命周期测试\\test01.jrprint";JasperViewer.viewReport(path,false);}catch(Exception e){e.printStackTrace();}}
}

三 :jasper-springboot项目

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.itcast</groupId><artifactId>jasper-springboot</artifactId><version>1.0-SNAPSHOT</version><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>
</project>

jasper-springboot\src\main\java\cn\itcast\controller\JasperController.java

package cn.itcast.controller;import net.sf.jasperreports.engine.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;@RestController
public class JasperController {@GetMapping("/testJasper")public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {//1.引入jasper文件Resource resource = new ClassPathResource("templates/test.jasper");FileInputStream fis = new FileInputStream(resource.getFile());//2.创建JasperPrint,向jasper文件中填充数据ServletOutputStream os = response.getOutputStream();try {/*** fis: jasper 文件输入流* new HashMap :向模板中输入的参数* JasperDataSource:数据源(和数据库数据源不同)*              填充模板的数据来源(connection,javaBean,Map)*               填充空数据来源:JREmptyDataSource*/JasperPrint print = JasperFillManager.fillReport(fis, new HashMap<>(),new JREmptyDataSource());//3.将JasperPrint已PDF的形式输出JasperExportManager.exportReportToPdfStream(print,os);} catch (JRException e) {e.printStackTrace();}finally {os.flush();}}
}

启动类:JasperApplication.java

package cn.itcast;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "cn.itcast")
public class JasperApplication {/*** 启动方法*/public static void main(String[] args) {SpringApplication.run(JasperApplication.class,args);}
}

配置文件:

resources/application.yml

server:port: 8181
#spring配置
spring:#1.应用配置application:name: jasper-springboot #指定服务名#2.数据库连接池datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ihrm?useUnicode=true&characterEncoding=utf8username: rootpassword: 111111

resources/jasperreports_extension.properties [解决中文乱码]

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml

resources/stsong/fonts.xml[解决中文乱码]

<?xml version="1.0" encoding="UTF-8"?><fontFamilies><!--<fontFamily name="Lobster Two">--><!--<normal>lobstertwo/LobsterTwo-Regular.otf</normal>--><!--<bold>lobstertwo/LobsterTwo-Bold.otf</bold>--><!--<italic>lobstertwo/LobsterTwo-Italic.otf</italic>--><!--<boldItalic>lobstertwo/LobsterTwo-BoldItalic.otf</boldItalic>--><!--<pdfEncoding>Identity-H</pdfEncoding>--><!--<pdfEmbedded>true</pdfEmbedded>--><!--<!–--><!--<exportFonts>--><!--<export key="net.sf.jasperreports.html">'Lobster Two', 'Times New Roman', Times, serif</export>--><!--</exportFonts>--><!--–>--><!--</fontFamily>--><fontFamily name="华文宋体"><normal>stsong/stsong.TTF</normal><bold>stsong/stsong.TTF</bold><italic>stsong/stsong.TTF</italic><boldItalic>stsong/stsong.TTF</boldItalic><pdfEncoding>Identity-H</pdfEncoding><pdfEmbedded>true</pdfEmbedded><exportFonts><export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sans-serif</export><export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sans-serif</export></exportFonts><!--<locales><locale>en_US</locale><locale>de_DE</locale></locales>--></fontFamily>
</fontFamilies>

resources/stsong/stsong.TTF [解决中文乱码]

resources/templates/test.jasper  [模板编译文件]

入门代码地址:

链接:https://pan.baidu.com/s/1CM0YA9gZOE6hopcbfAn5Ww 
提取码:iowa


 解决乱码文件下载:

链接:https://pan.baidu.com/s/1FVjCkL4I8jh4I5pCNvLWqQ 
提取码:j7mw

pdf报表的制作入门,JasperReport相关推荐

  1. iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门

    iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...

  2. 前后端分离微服务管理系统项目实战SaaS-HRM项目(九)——文件上传与PDF报表入门

    文章目录 九.文件上传与PDF报表入门 1.图片上传 <1>.Data URL (1).概述 (2).入门 (3).基本原理 (4).优缺点分析 <2>.实现用户头像上传 2. ...

  3. PDF报表打印 -- Jasper Report

    一. PDF报表打印概述 1 概述 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之外,PDF报 ...

  4. JasperReport框架制作PDF报表

    JasperReport框架制作PDF报表 1. PDF报表概述 1.1 概述 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.除了Excel报表之外,PDF报表也有广泛的应用场景. 1 ...

  5. 【PDF报表】Jasperreports+jaspersoft studio快速入门

    目录 一.JasperReport简介 二. JasperReport的开发步骤 1.生命周期 2.执行流程 三.模板工具Jaspersoft Studio 1.概述 2.安装配置 3.面板介绍 4. ...

  6. 使用JasperReport 引擎PDF报表,因为iText版本升级,由原来的包名com.lowagie.text.pdf.fonts转化为com.itextpdf.text.pdf.fonts

    使用JasperReport 引擎PDF报表,因为iText版本升级,由原来的包名com.lowagie.text.pdf.fonts转化为com.itextpdf.text.pdf.fonts,如果 ...

  7. java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题

    1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...

  8. Java生成PDF报表文件

    Java生成PDF报表文件 视频出处:https://www.bilibili.com/video/BV1Bo4y117zV?p=254 资源文件:链接:https://pan.baidu.com/s ...

  9. Jasper(2)——简单使用导出PDF报表

    接着上一次所说的,没看过的可跳转 Jasper(1)--入门 第一阶段:初步导出PDF Jasper报表设计 点击 Static Text,并拖动到 title 位置 然后双击此框,根据需要修改,可看 ...

最新文章

  1. 数据结构基础:栈和队列学习笔记
  2. DVWA Cross Site Request Forgery (CSRF) -------WP
  3. linux vi 撤销与恢复,vi撤销与恢复
  4. 【随机过程】马尔可夫链(2)
  5. SpringMVC系列(十六)Spring MVC与Struts2的对比
  6. 码农们的聚餐,会复杂到什么程度?
  7. T3139 栈练习3 codevs
  8. 生成模型VS判别模型
  9. linux系统查看java安装路径
  10. 【软考系统架构设计师】2015年下系统架构师综合知识历年真题
  11. 3 二十五项反措--防止电气误操作及机组上电事故
  12. 输出星期名缩写python_python练习题5.1输出星期名缩写
  13. mysql 视图创建与查询数据库作业(10)
  14. 题解 P2504 【[HAOI2006]聪明的猴子】
  15. java get/set方法好处
  16. 基于 Prometheus 的边缘计算监控实践
  17. 8051单片机内部结构
  18. RF MEMS开关时代将开启-30?
  19. C. Interesting Sequence
  20. 【mud】文字mud游戏的魅力(龟跑比赛)

热门文章

  1. JCGridMenu
  2. 用Java读取pdf中的数据
  3. 来点硬件知识吧,今天求职吃亏了!
  4. 第一个简单APP设计图
  5. 误删除MySQL数据库表的ibd文件怎么办
  6. 为企业搭建Gitlab软件版本管理服务器
  7. openssh漏洞升级修复
  8. 32位64位Eclipse和jdk对应关系
  9. java 匿名类实现6_java匿名内部类,以及实现Comparato和Comparable接口实现对对象的排序...
  10. 【Linux】Another app is currently holding the yum lock; waiting for it to exit...