首页 > 应用开发 > IT综合 > JasperReport的使用原因 (2)
第二步:运行报表为某种格式 这一步按某种格式运行报表,生成输出字节流,相当于iReport中点击,不过这一步并未生成输出结果,只是生成输出结果的字节流,为下一步的的输出字节流做好了充分的准备。 |
第二步:运行报表为某种格式 这一步按某种格式运行报表,生成输出字节流,相当于iReport中点击,不过这一步并未生成输出结果,只是生成输出结果的字节流,为下一步的的输出字节流做好了充分的准备。 这一步我们使用的函数为 byte[] JasperRunManager.runReportToPdf(String jrFile, HashMap,map,Listl list); 来生成PDF输出的字节流。 下面详细地解释这个函数各参数的意义及生成查询结果的原理。 jrFile即为第一步中生成的.jasper文件的文件名. lsit存放的是需要重复显示的数据。 map存放的是只显示一次的数据。 这一步需要数据库查询结果,这样,JasperReport的API才能把动态数据库和.jrxml文件结合生成动态报表。 在iReport中,数据库查询结果的获得是通过,输入sql语句来获得的,而对查询结果的使用是通过中创建动态文本元素以“%F{field}”来访问某个field的,这个动态方便将根据查询结果中记录的的条数来被重复打印。 而通过JasperReport的API来生成动态报表,也是需要做数据库查询的,然后把结果以多种方式传给runReport方法,当然这就没有iReport数据库查询那样方便了,一输入sql语句即可生成相应的field变量,在这里,我们需要事先在iReport中定义需要重复显示的field,当然在传给其查询结果前,这些field都取值为null,当然也只会显示一次,然后在程序在访问数据库,把查询结果保存在某个list中,当然list存放的是对象的,这些对象的属性名必须与iReport中的field名字一致。这样,当把这个list传入runReport方法后,list中的对象的属性将根据名称与iReport中的field按名称建立起了对应关系。因此,就相当于通过生成了查询结果和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等)之类的方法,慢慢实验一下就知道了。 |
第三步:打印输出结果 我们可以在Jsp或是Servlet中调用 byte[] bytes=JasperRunManager.runReportToPdf(rFile, map, new JRBeanCollectionDataSource(list)); OutputStream out = res.getOutputStream();//获得输出流,即HTTP的response输出流,再用 out.write(bytes); out.flush(); 就可以得到输出结果,这果浏览器弹出的打开或保存文件的对话框,我们就可以对输出结果文件进行打开或者保存等. |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7767849/viewspace-908379/ ,如需转载,请注明出处,否则将追究法律责任。