您的位置:首页 > 编程语言 > ASP

JasperReport的使用原因与原理

2011-12-30 14:41 501 查看
JasperReport的使用

一、JasperReport的使用原因

iReport连接数据库固然能得到动态的报表,但是在网络高度发展的神龛,客户理需要的通过网页,经过一系列的查询,然后点击一个按纽或链接就可以得到含有其需要数据的报表,可以说,持有这样需求的报表用户是大多数的,,毕竟用iReport连接数据库做成的报表,一来操作对客户不透明,客户不可能写sql语句,创建报表文件,再花费很大心思调整报表的布局等,然后点击得到需要的报表,这是根本不可能的;另一方面,仅仅是通过iReport这个客户端软件来生成,访问报表,而不是网络。

二、JasperReport的使用原理:

使用流程上面已经介绍过了,首先需要的一个xml文件,编译得到.jasper文件,然后和数据源结合生成报表输出。这里xml文件自己写比较难,因此需要借iReport生成,不过后缀名为.jrxml,其实和.xml是一个意思,编译由JasperReport APsI中的.

第一步:编译

这一步,把.jrxml文件编译成.jasper文件。

JasperCompileManager.compileReportToFile()方法,这个方法由三个重载版本,你可以查JasperReport的API文档看到,这里我们仅解释一下其中一个版本,

void compileReportToFile(String arg0,String arg1);

arg0指事先创建的.jrxml文件的全路径,包括文件名.

arg1指经过编译后生成的.jasper文件的文件名,当然你也可以写上路径,这样你就可以在固定路径上查看.jasper文件,不过这个文件放在哪儿无所谓,注意这个参数的String串必须以.jasper结束。

尽管可以用iReport来编译,省略这一下, 直接访问的已生成的.jasper文件,不过,不推荐这样做,毕竟是iReport使用的JasperReport版本可能与我们在Java工程中包含的版本不一样,这样,直接使用iReport生成的.jasper文件可能会在下一步的runReport中出问题。但是,我们可以用iReport来调试.jrxml文件是否有错误,这倒是挺好的。

第二步:运行报表为某种格式

这一步按某种格式运行报表,生成输出字节流,不过这一步并未生成输出结果,只是生成输出结果的字节流,为下一步的的输出字节流做好了充分的准备。

这一步我们使用的函数为

byte[] JasperRunManager.runReportToPdf(String jrFile, HashMap,map,Listl list);

来生成PDF输出的字节流。

下面详细地解释这个函数各参数的意义及生成查询结果的原理。

jrFile即为第一步中生成的.jasper文件的文件名.

lsit存放的是需要重复显示的数据。

map存放的是只显示一次的数据。

这一步需要数据库查询结果,这样,JasperReport的API才能把动态数据库和.jrxml文件结合生成动态报表。

通过JasperReport的API来生成动态报表,也是需要做数据库查询的,然后把结果以多种方式传给runReport方法,当然这就没有iReport数据库查询那样方便了,一输入sql语句即可生成相应的field变量,在这里,我们需要事先在iReport中定义需要重复显示的field,当然在传给其查询结果前,这些field都取值为null,当然也只会显示一次,然后在程序在访问数据库,把查询结果保存在某个list中,当然list存放的是对象的,这些对象的属性名必须与iReport中的field名字一致。这样,当把这个list传入runReport方法后,list中的对象的属性将根据名称与iReport中的field按名称建立起了对应关系。这里的field不是自动生成的,而是事先创建的,查询结果不是自动与field关联,而是把查询结果以某种形式(lsit,ResultSet,Connection等)传给runReport方法,然后按属性名称与field关联。

这样,把需要重复显示的查询结果就传给了runReport方法,那么如果想传入的查询结果只有一条怎么办?毕竟,这样的结果一般不放在detail中,而是放在其他的band中,这样按照上述方法根本是不可能实现的,JasperReport的API用map来存放查询结果只有一条记录的字段名。为了实现这个目的,我们事先建立parameter变量,比如我们建立了一个叫averAge的field,那么我们根据上面的查询结果得到的list,取age属性来算出平均年龄,假如叫average,然后通过map.put("averAge",average),这样把map传给runReport方法后,averAge这个parameter变量自然有有了值了。

最后我们用下列语句来生成PDF输出字节流:

byte[] bytes=JasperRunManager.runReportToPdf(rFile, map, new JRBeanCollectionDataSource(list));

上面只是讲述的一种典型的list+map的形式生成输出结果字节流,其实还有其他的形式,读者可以看看JasperRunManager的runReportToPdf()的其他重载版本。不过原理都差不多。另外,上面只是生成Pdf输出字节流,我们也可以生成HTML,CSV,XLS等多种输出字节流,这里就不多说了,读者好好看一下JasperRunManager的runReportToXXX()(XXX代表输出的格式如HTML,CSV,XLS等)之类的方法,慢慢实验一下就知道了。

SV,XLS等)之类的方法,慢慢实验一下就知道了。

第三步:打印输出结果

我们可以在Jsp或是Servlet中调用

byte[] bytes=JasperRunManager.runReportToPdf(rFile, map, new JRBeanCollectionDataSource(list));

OutputStream out = res.getOutputStream();//获得输出流,即HTTP的response输出流,再用

out.write(bytes);

out.flush();

就可以得到输出结果,浏览器弹出的打开或保存文件的对话框,提示我进行打开或者保存等.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐