前段时间做了一些报表,本想写个blog来总结一下,也给刚学的朋友一点启示。但本人生性懒惰,一直没能写成。昨天,又来做个报表,谁知却因为一个很愚蠢的疏忽(下面将会讲到),搞了一天才明白是怎么回事。想来,真该总结一下了。已免将来再犯类似的过错!
配置和安装jasperreport和ireport已有不少资料写了。我就不多说了。先说说一些常见的问题,这些是我们首先要注意的:
1、在ireport中做好的报表,预览时却什么都没有。我的经验是,多半是没设置好字体,或者是缺少亚洲语言包iTextAsian.jar
2、如果在页面中只出现net.sf.jasperreports.engine.JasperPrint之类的信息。多半是报表本身出错了。要在ireport中检查报表参数传递有没有问题或子报表有没有问题,我曾被这个问题困惑了一整天,下班时才解决。
3、关于子报表的路径设置
本人被些问题困扰多日,始终不得解脱。后来一不小心给搞定了。虽然辛苦但也甚感欣慰!如果发布到服务器上的工程在调用报表是出现“Could not load object :subReportName.jasper”。那么说明找不到子报表。可一般我们是在ireport中编译通过的。且运行正常。为什么一服务器上我移植到别的平台上时就找不到呢。我也不没有最终搞清楚。只是知道了解决办法:
(1)在ireport中将参数“SUBREPORT_DIR”的缺少值设为“”
(2)在java程序中定义报表文件在工程中的路径如:
String reportPath =servletContext.getRealPath("/WEB-INF/classes/report")+File.separator;
(3)将报表路径“reportPath”传参给jasper
Map parameters = new HashMap();
parameters.put("ID",id); //给报表设置参数值
parameters.put("SUBREPORT_DIR",reportPath);//为子报表设置路径
如果,子报表中又有子报表呢。也很好办。java程序就这样不用再做改动了。是要在ireprot中为子表的子表传参了
其实,jasperreport有点弱智,为什么不将报表默认为与主表在同一路径下呢,因为多数应用都是这样的呀。且它的例子中也不有说明子表还需要特别设置的,奇怪的是例子中根本就没有“SUBREPORT_DIR”这一参数!!真搞不懂!要是有哪位知道这其中的端倪,还烦请告诉给我。让我也做一回明白人啦……
4、怎样使用scriptlet