zoukankan      html  css  js  c++  java
  • 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的生命周期,这三个阶段为:设计(Design)阶段、执行(Execution)阶段以及输出(Export)阶段,如下图所示:

    图片.png

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

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

    需求

    通过java代码往jasper模板中传入参数。

    步骤

    第一步: 定义模板。先定义模板、在模板中定义一些参数。

    模板预览:

    图片.png

    第二步:导出PDF。通过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

    注意: 设置了标题,一定设置 标题 + 饼图的字体。

    导出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());
    
        }
    
  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/unrecognized/p/11585228.html
Copyright © 2011-2022 走看看