Jasperreport+studio设计报表教程(四)--java输出报表

标签: Jasperreport+studio

创建Java工程实现报表用不同格式文档输出

1.创建一个Java工程

上一章已经用Jaspersoft studio6.3.1生成了一个学生成绩单的模板,现在该用这个模板来生成输出一个报表文档了,可以是PDF,HTML,或者PNG这些的常见的格式。
首先打开Eclipse来创建一个Java工程,将所有要用的包导入添加依赖。
这里写图片描述
上面是我所用的所有Jar包,第一眼看到这么多包头都要炸了,但要实现所有Jasperreports支持的报表输出与所有功能,就要导入这些包,其中有一些包是只有某些特定功能才能用到的,可以自行根据功能进行筛选。
有一大部分包我是直接从IReport软件目录下lib下拉过来的。这样直接拉Jar包会出现一些报错的情况,就是输出某些文件格式的时候会出现找不到某个Jar包里的类或者方法的情况。
这是因为Jasperreports6.3.1所依赖的Jar包版本不一致了,那如何找到正确的Jar包呢,请参考第一章里ant.xml所列的Jar包版本。
下载传送门
可以下载我的Jar包集合,因为上传限制大小的因素去掉了Jasperreports项目里自带的包(如font字体包),还有mysql驱动包,ant,itext包,Spring包,可自行下载。

2.编译JRXML生成二进制文件Jasper并导入

再次打开Jaspersoft Studio,进入到上一章制作好的模板文件JRXML中,JRXML只是一个模板文件,虽然Jasperreports也提供了将其编译成二制文件的方法,但为了简便,在Jaspersoft Studio里就可将其编译成二进制文件。
点击JRXML模板文件右键,选中Compile report。
这里写图片描述
随后会弹出一个窗口提示正在编译,编译完成后,在工程目录下可以看到一个名字相同后辍名为.jasper的文件,这就是我们要的二进制文件。
这里写图片描述
将这个文件复制到Java工程src目录下。
这里写图片描述

3.将报表模板输出为Html文件。

具体步骤如下,注意参数集合的key值一定要与模板JRXML里面设定的参数名一致方能正常传递数据。

package test;
import java.util.HashMap;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

public class JasperTest {
    public static void main(String[] args) {
        //1.设定模板二进制文件路径,一定要可以通过该路径找到该文件
        String reportPath="./src/JasperSample.jasper";

        //2.设定报表的外部参数,map集合,这里要注意map的key值一定要与模板里Parameters的名字一致
        HashMap<String,Object> map=new HashMap<>();
        map.put("name", "王小明");
        map.put("id", "2017022301");
        map.put("rank", "32");
        map.put("yuwen", "81");
        map.put("shuxue", "102");
        map.put("english", "123");
        map.put("shengwu", "67");
        map.put("wuli", "75");
        map.put("huaxue", "86");
        map.put("rankone", "21");
        try {

    //3.通过JasperFillManager工具进行填充报表,填充成功后会生成一个JasperPring文件,该文件用于输出
        JasperPrint jasperPrint
         =JasperFillManager.fillReport(reportPath, map);

    //4.设定目标文件输出的路径
             String desFilePath
             = "./src/JasperSampleTest.html";

 //5.通过JasperExportManager管理工具进行报表输出文档,此处设定为输出Html文件.
                                  JasperExportManager.exportReportToHtmlFile(jasperPrint,desFilePath);

        } catch (JRException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

运行工程,可以看到生成了一个Html文件。
这里写图片描述

4.输出Html文件为空问题

当打开输出的Html文件时,发现界面一片空白,什么也没显示,如下图,但是工程并没有报错,也正常生成了文件,唯一的可能就是模板的内容根本就没有解析出来,只是单纯的生成了一个空白的Html文件布局。
这里写图片描述
注意到Eclipse控制台输出了一个警告信息

xxxx 2017-02-24 19:14:54,795 WARN [net.sf.jasperreports.engine.query.JRJdbcQueryExecuter] - <The supplied java.sql.Connection object is null.>
  • 1

警告的意思是与数据库的连接对象为空。
一般如果报表模板要与数据库连接起来才需要传入这个连接,可我的报表模板中并没有用到数据库连接,那为什么还会出现这个问题呢?应该是填充模板那里出了问题。
打开模板的source,看到标签 property默认数据源为myadapter
这里写图片描述
是不是这个数据源为空,所以导致了模板无法向下解析了呢?将这个标签property删掉试一下。
删除后重样编译再覆盖工程中文件后,再次运行Java工程,依旧出现了这个警告。看来与这个模板中设置的数据源无关,再来看一下模板中还有什么什么选项是与数据源相关的。
点开jrxml的配置界面,发现了一个when No data type的选项,是不是这个呢。
当选为NoPage和Blank Page时,编译运行工程后依然是空白的。
但当选为All sections No Detail,出现了标题内容,但细节里的内容并没有出现,这个选项会把细节的内容都屏蔽掉。
这里写图片描述
最后一个选项No Data Section出现了同样的警告,文件是空的。看来这个属性并不能解决空文件问题。
再来看另一个属性,DataSet节点下的When Resource Missing Type,看来这个属性挺像的,当数据源无类型时。
这里写图片描述
先试Empty,结果还是出现警告与空文件,看来这个选项不行。
再试Key,与Error,结果还是一样,空文件,看来改模板这里已经行不懂,就算是将数据源设为空的(第一章中设置的为空的数据库),感觉只能从代码处下手了。
研究下JasperFillManager这个类里面的方法,其中两个参数的方法都行不通了,虽然不会报错,但会出现空文件的情况,看来不管有没有第三个参数最后都会加上一个数据源参数。

这里写图片描述

由上图可知,除了传Connection,我们还可以传入JRDataSource参数,现在我们并不会用到数据库连接,那直接传入一个JRDataSource。
那这个JRDataSource是什么呢?简单来说就是一个数据源接口,它有许多不同的数据来源实现类,像JDBC,Map,XML,还有JavaBean.我们可以自己创建实现JRDataSource接口的实现类,然后将其传入。
JRDataSource的继承结构如下
这里写图片描述
既然我们不需要数据源,那就传一个空的好了,在最后一个接口的实现类里有这样一个类JREmptyDataSource,从字面意思上看这是一个空的数据源类,这就是我们需要的。
这里写图片描述

将填充报表的代码改动一下:

//将第三个参数设为一个空的数据源
JasperPrint jasperPrint
=JasperFillManager.fillReport(reportPath, map,
new JREmptyDataSource());

JasperExportManager.exportReportToHtmlFile(jasperPrint,desFilePath);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行工程,可以看到报表成功的填充了数据,生成了Html文件。
这里写图片描述

PS:如果生成的Html出现线条没法显示的问题,可以把这个线条设粗一点,这个问题只有Html文件会出现,pdf并不会出现这样的问题
这里写图片描述
这里写图片描述



原文链接:加载失败,请重新获取