JasperReport框架使用教程(附带常见空白页问题说明)

【该昵称无法识别】,希望小伙伴们可以帮忙关注一下,谢谢~

概述与安装使用

1. PDF报表概述

概述

​ 在企业级应用开发中,报表生成、报表打印下载是其重要的一个环节。在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表。其实除了Excel报表之外,PDF报表也有广泛的应用场景,例如货运详情,货运单等。

常见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框架的介绍

​ 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就能生成最终用户想要的文档格式。

图片.png

JasperReport生命周期(重点)

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

图片.png
  • 设计阶段(Design):<font color=red>定义模板</font>
    所谓的报表设计就是创建一些模板,模板包含了报表的布局与设计,包括执行计算的复杂公式、可选的从数据源获取数据的查询语句、以及其它的一些信息。模板设计完成之后,我们将模板保存为JRXML文件(JR代表JasperReports),其实就是一个XML文件。
  • 执行阶段(Execution):<font color=red>模板 + 数据</font>
    使用以JRXML文件编译为可执行的二进制文件(即.Jasper文件)结合数据进行执行,填充报表数据
  • 输出阶段(Export):<font color=red>展示。 将模板和数据一起展示。</font>
    数据填充结束,可以指定输出为多种形式的报表

JasperReport执行流程(重点+)

图片.png
  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等

2. Jaspersoft Studio 模板工具

概述

​ 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 报表引擎解析、显示。

安装配置

  1. 到JasperReport官网下载 https://community.jaspersoft.com/community-download
图片.png
  1. 下载后,安装:TIB_js-studiocomm_6.5.0.final_windows_x86_64.exe。 直接下一步下一步即可。

  2. 主界面

图片.png

基本使用

如何创建模板?
  1. 打开Jaspersoft Studio ,新建一个project, 步骤: File -> New -> Project-> JasperReports Project
图片.png
  1. 下一步,输入项目名称:
图片.png
  1. 创建JasperReport模板

    图1:

图片.png

图2:

图片.png

图3:

图片.png

图4:

图片.png
面版说明
  • Title(标题):只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。
  • Page Header(页头):在整个报表中每一页都会显示。在第一页中,出现的位置在 Title Band的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。
  • Page Footer(页脚):在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。
  • Detail 1(详细):报表内容,每一页都会显示。
  • Column Header(列头):Detail中打印的是一张表的话,这Column Header就是表中列的列头。
  • Column Footer(列脚):Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。
  • Summary(统计):表格的合计段,出现在整个报表的最后一页中,在Detail 1 Band后面。主要是用来做报表的合计显示。
完善模板、编译模板

第一步:可以把不需要的面版删除:这里只留了Title、Summary

图片.png

第二步:拖入Image到面版中,输入url地址:http://i1.qhimg.com/t01e0356c940bf0a30c.jpg

图片.png

第三步:拖入Static Text,静态文本

图片.png

第四步:点击预览

图片.png

第四步:现在已经创建了jrxml模板,现在需要编译它:

注:这里千万千万注意要先保存再编译,不然打印出来的内容会是空白的,还有汉字问题,字体需要选择系统有的,如果导入到java程序中,最好在包中存放该字体文件

图片.png

编译结果:


图片.png

数据填充

1. 数据填充(一)参数map填充

需求

<font color=red>通过java代码往jasper模板中传入参数。</font>

步骤

第一步: <font color=blue>定义模板。</font>先定义模板、在模板中定义一些参数。

模板预览:

图片.png

第二步:<font color=blue>导出PDF。</font>通过java代码,往模板中设置参数,导出pdf。

第一步:定义模板

① 拖入frame


图片.png

② 设置frame边框

图片.png

③ 拖入Line到frame、设置宽度与frame一致。

图片.png

④ 设置h为1px后

图片.png

⑤ 预览

图片.png

⑥设置Parameter

图1:

图片.png

图2:

图片.png

⑦ 制作模板

图片.png

⑧ 修改文字大小、修改文字字体、编译模板生成jasper文件、把jasper文件拷贝到项目中。

第二步:导出PDF

① 拷贝jasper文件到项目中

图片.png

② 编写控制器

 /**
     * 2)带参数的导出
     * @throws Exception
     */
    @RequestMapping("/exportPdf")
    public void exportPdf() throws Exception{

        //1.读取.japser文件,构建输入流
        InputStream in = session.getServletContext().getResourceAsStream("/jasper/test02_param.jasper");

        //2.构建Print对象,用于让模块结合数据
        //第二个参数就是用来填充模板中的parameters
        Map<String, Object> map = new HashMap<>();
        map.put("userName","小泽");
        map.put("email","ze@qq.com");
        map.put("companyName","小泽科技");
        map.put("deptName","视频组");

        JasperPrint print = JasperFillManager.fillReport(in,map,new JREmptyDataSource());

        //3.使用Exporter导出PDF
        JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

    }

2. 数据填充(二)JDBC数据源 A 配置数据源

分析

数据源填充数据分为:JDBC数据源填充数据(数据库连接)、JavaBean填充数据(list集合)

如图:

图片.png

配置数据源

图1:

图片.png

图2:

图片.png

图3:配置数据库连接信息

图片.png

图4:选择驱动、点击完成

图片.png

图5:配置结果

图片.png

3. 数据填充(三)JDBC数据源 B 制作模板

制作模板

第一步:新建模板

① 新建jasper模板

图片.png

输入模板名称:

图片.png

下一步,完成

图片.png
第二步:模板制作

①创建空白模板后,并将不需要的Band删除, 只留下如下面版:

图片.png

②新建数据源

图1:

图片.png

图2:

图片.png
图片.png

③ 新建数据源后,自动生成如下四个Fields

图片.png

④ 构造模板

图片.png
第三步:制作细节

①由于模板数据有空格,需要去除数据的空格

图1:双击空白区域

图片.png

图2:


图片.png

由于没有边框,现在设置边框

图1:

图片.png

4. 数据填充(四)JDBC数据源 C 代码实现

这里的数据是从pe_user表查询出来的,在jasper模板中配置的数据源。

实现

第一步:拷贝生成的jasper文件到项目中

图片.png

第二步:实现导出PDF

  //注入数据源
    @Autowired
    private DataSource dataSource;


/**
     * 3)使用JDBC数据源导出
     * @throws Exception
     */
    @RequestMapping("/exportPdf")
    public void exportPdf() throws Exception{

        //1.读取.japser文件,构建输入流
        InputStream in = session.getServletContext().getResourceAsStream("/jasper/test03_jdbc.jasper");

        //2.构建Print对象,用于让模块结合数据
        //第三个参数:如果是JDBC数据源,应该设置Connection对象
        JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource.getConnection());

        //3.使用Exporter导出PDF
        JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

    }

5. 数据填充(五)JavaBean数据源(重点)

需求

刚才我们实现了jdbc数据源,直接查询表中的数据填充jasper模板。但是很多时候我们需要对数据进行处理,再把处理后的数据填充到jasper模板。所以,我们就需要把处理后的数据用javabean封装,这里就用到了javabean数据源。

我们的实现步骤分为下面2步:

  1. 制作jasper模板
  2. 导出pdf

制作模板

图片.png

导出pdf

先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:

/**
     * 4)使用JavaBean数据源导出
     * @throws Exception
     */
    @RequestMapping("/exportPdf")
    public void exportPdf() throws Exception{

        //1.读取.japser文件,构建输入流
        InputStream in = session.getServletContext().getResourceAsStream("/jasper/test04_javabean.jasper");

        //2.构建Print对象,用于让模块结合数据
        //注意:JavaBean的属性名称和模版的Fileds的名称一致的
        List<User> list = new ArrayList<>();
        for(int i=1;i<=10;i++){
            User user = new User();
            user.setUserName("张三-"+i);
            user.setEmail("zhangsan-"+i+"@qq.com");
            user.setCompanyName("熊掌科技");
            user.setDeptName("开发部");
            list.add(user);
        }

        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);

        //第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
        JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);

        //3.使用Exporter导出PDF
        JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

    }

6. 数据填充(六)分组报表

制作模板

① 新建模板:test06_group.jrxml

②新建Fields


图片.png

③ 新建组

图1:

图片.png

图2:

图片.png

图3:

图片.png

④ 编辑模板 - 组

图1:按照哪个字段进行分组,就拖入对应字段


图片.png

图2:编辑组名称

图片.png

图3:双击组名称

图片.png

图4: 再次拖入分组字段到Footer中

图片.png

图5:输入统计信息放入Footer

图片.png

⑤ 添加Field、完成模板制作

图片.png

导出pdf

先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:

  /**
     * 5)分组导出
     * @throws Exception
     */
    @RequestMapping("/exportPdf")
    public void exportPdf() throws Exception{

        //1.读取.japser文件,构建输入流
        InputStream in = session.getServletContext().getResourceAsStream("/jasper/test05_group.jasper");

        //2.构建Print对象,用于让模块结合数据
        //注意:JavaBean的属性名称和模版的Fileds的名称一致的
        List<User> list = new ArrayList<>();
        for(int j=1;j<5;j++) {
            for (int i = 1; i <= 10; i++) {
                User user = new User();
                user.setUserName("张三-" + i);
                user.setEmail("zhangsan-" + i + "@qq.com");
                user.setCompanyName("熊掌科技-" + j);
                user.setDeptName("开发部");
                list.add(user);
            }
        }

        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);

        //第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
        JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);

        //3.使用Exporter导出PDF
        JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

    }

7. 数据填充(七)图形报表

制作模板

①创建模板、创建Fields

图片.png

②添加Charts

图1:

图片.png

图2:

图片.png

③设置饼图属性

图1:

图片.png

图2:

图片.png

图3:

图片.png

图3:

图片.png

④最后pdf模板

图片.png

<font color=red>注意: 设置了标题,一定设置 标题 + 饼图的字体。</font>

导出pdf

先把编译后的jasper模板文件拷贝到项目中,再在控制器添加如下方法:

/**
     * 6)图标导出
     * @throws Exception
     */
    @RequestMapping("/exportPdf")
    public void exportPdf() throws Exception{

        //1.读取.japser文件,构建输入流
        InputStream in = session.getServletContext().getResourceAsStream("/jasper/test06_pie.jasper");

        //2.构建Print对象,用于让模块结合数据
        //注意:JavaBean的属性名称和模版的Fileds的名称一致的
        List<Map> list = new ArrayList<>();
        for (int i = 1; i <= 6; i++) {
            Map map = new HashMap();
            map.put("title","标题:"+i);
            map.put("value",new Random().nextInt(100));
            list.add(map);
        }


        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);

        //第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充
        JasperPrint print = JasperFillManager.fillReport(in,new HashMap<>(),dataSource);

        //3.使用Exporter导出PDF
        JasperExportManager.exportReportToPdfStream(print,response.getOutputStream());

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342