当前位置: 首页 > 工具软件 > Jasper > 使用案例 >

Jasperreport文档

於宾白
2023-12-01

Jasperreport是http://www.sourceforge.net上一个优秀的开源的报表工具,其强大的功能及免费的特性得到了广大的认可和赞誉,现在的最新版本是Jasperreport0.6.1。下载地址是
https://sourceforge.net/projects/jasperreports/
iReport是jasperreport的一个IDE的开发工具,使Jasperreport变得更易用,其最新版本是iReport0.4.0支持到Jasperreport0.6.1,和Jasperreport一样也在不断的更新中。下载地址是https://sourceforge.net/projects/ireport/
关于利用这两个工具开发Web报表,这里已经有几份很好的材料:
 JasperReport与iReport的配置与使用.pdf(该文档可用于一开始入门熟悉这两个工具)
 TheJasperReportsUltimateGuide.1.0.pdf (这个本是一份收费的文档,讲述了Jasperreport生成的原理方面的知识,如果你打算能熟练的使用Jasperreport这个报表工具,需要好好看这份英文资料的)
http://www.javaresearch.org/forum/thread.j...16&thread=14374
(这是我在论坛上写的一个另一篇入门指南)


第一次运行


第一次总是比较痛苦,使用这个报表工具也是,下面是我总结出的一些运行中比较容易出现的问题。
我的总结是建立在使用iReport0.4.0 + Jasperreport0.6.1)。至于这两者的组合,我用到现在还是觉得比较顺的。
从souceforge上下载iReport-0.4.0.zip 解压后,要注意一点,把你的JDK的tools.jar拷到你解压后的iReport的lib目录下,做中文的pdf报表还需要把iTextAsian.jar拷到lib下,如果你用的是Oracle的数据库,那么你还需要把class12.jar也就是Oracle的Jdbc包拷到lib下,其他数据库也一样。
好了准备工作做好了,运行iReport.bat。如果比较看到UI界面,说明
iReport成功运行了。

如果dos界面一闪而过,说明没有成功。按以下步骤可解决该问题:
确定系统安装有JDK,而且系统环境设置,path里有JDK的bin目录,并有java_home参数,以下是我的几个参数的配置情况可供参考:
1 java_home D:/JBuilder9/jdk1.4
2 path D:/JBuilder9/jdk1.4/bin;D:/Install/ant161/bin
3 classpath D:/iReport042/fonts;E:/Project/EssV6/webapps/WEB-INF/classes
4 ant_home D:/Install/ant161
(关于上面参数设置的说明:
 iReport0.4.0要求JDK1.4以上版本,所以要注意Oracle9装好会自动把java环境设为Oracle自带的JDK1.3.1,会导致无法运行iReport。
 ant_home及path中ant的设置是为了可以用ant来学习Jasperreport的例子,这些例子在Jasperreport解压后的demo/samples目录下,比如在Dos环境下进入demo/samples/jasper目录下,输入命令ant view 就可以看到该示例报表。
 classpath中D:/iReport042/fonts;的设置是确保iReport里字体设置的时候能选择一些外部字体,比如要让PDF显示黑体,那么把windows下的simhei.ttf拷到D:/iReport042/fonts下,在iReport中如下设置:pdffontname为外部字体、truetypefont 为simhei.ttf、 编码为unicode with horizontal writing,这样就能使用黑体了
 E:/Project/EssV6/webapps/WEB-INF/classes,classpath里的这是设置,是让报表里一些数据要经过特殊处理,可以用工程里的函数。

这些设置完成后,到dos环境下的iReport目录下,运行iReport.bat,dos环境下的好处是如果iReport运行失败可以看到失败原因,然后针对性的解决。
iReport可以运行后就是一个摸索使用,慢慢了解熟悉的过程了,直到你能做出像样的一些报表。这个过程可以参考上面提到的
http://www.javaresearch.org/forum/thread.j...16&thread=14374

常见问题的解决


具体做报表的时候会碰到许多问题,关键的是我们需要分析出错提示,根据找到解决办法,比如你把报表放到你的工程下,比如运行结果提示java.io.FileNotFoundException,那么你就需要确定你的报表编译后的文件在相应的目录;又比如提示NoClassDefFoundError,那你就要看看是哪个包没有放到你的工程下。
需要非常强调的是:好好看Jasperreport自带的例子,看懂那些例子,至少模仿一下,就能做出你想要的报表了。


我的报表Faq

1.java.io.FileNotFoundException
Jasperreport自带的webapp的例子中,用于定位.jasper报表模板文件的方法是:
File reportFile = new File(application.getRealPath("/reports/WebappReport.jasper"));
这个时候,如果你的web服务器是tomcat,wabapp中的文件就放在root目录下
那么这个报表的实际位置是:D:/Tomcat41/webapps/ROOT/reports/WebappReport.jasper
然而当你使用子报表时,情况有所不同,首先在子报表中没有 application 这个对象
所以你不能使用 new File(application.getRealPath("/reports/WebappReport.jasper"))的方法来定位子报表。
jasperreport支持三种方式定位文件,具体参看 JasperreportUtimateGuide.pdf
这里说一下,如果你是用String的类型来关联子报表,并且String的值是 subreport.jasper
那么Jasperreport会到 D:/Tomcat41/webapps/ROOT/WEB-INF/classes目录下查找是否有subreport.jasper这个文件
知道这点就能采取各种办法了
==============================================
JasperReport 学习必备手册


这是我学习JasperReport的一点经验,欢迎大家指正、赐教,我只是起个砖块的作用,大家就接着抛玉吧,希望最后真的能累成一个必备手册,呵呵。

假设大家已经对JasperReport有一定的了解(至少知道大概的开发流程),这里就不赘述JasperReport的好处、设计、表达式的定义等JasperReport自带文档里有的东西了。

可能因为我是java新手,所以遇到的问题特别多,下面仅列一些,并附上我的解决方法:
l Jsp生成不了PDF的问题

l 生成HTML时JRHtmlExporterParameter.IMAGES_MAP的问题

l 中文显示的问题

l 图片显示的实现方法(JFreeChart)

l 我的通用 .jasper 生成方法

l 我的项目的实现

Jsp生成不了PDF的问题
问题描述:运行自带的web(webapp目录下)例子时(我使用的服务器是TomCat),用Servlet生成PDF完全没问题,而JSP方式却报getOutputStream() has already been called for this response 的错,看JSP源码发现和Servlet差不多。

问题原因:Tomcat首先执行.jsp文件开始的Java代码,然后准备session, out等变量。而输出PDF的代码出现在.jsp文件开始的<% ... %>段中,这样HttpServerletResponse的getOutputStream()方法已被调用。在JSP规范中定义此方法只能被调用一次,这样当Tomcat准备out变量时必然会出错。

所以基于TomCat的服务器都会出错,如Jboss, Sun ONE AppServer

解决方法:很简单,按照JSP/Servlet规范定义输出非文本内容,如图片、声音等应该使用Servlet而不是JSP。在Servlet中输出流完全由应用程序按需打开/关闭。

虽然仿佛这不叫解决方法,但我查了很多地方,也没有找到更好的说法,所以大家做JasperReport还是用Servlet好了

生成HTML时JRHtmlExporterParameter.IMAGES_MAP的问题
这算不得一个问题,只是当时我有点迷惑,就拿出来说说好了。

不知大家注意过没有,每次生成Html时,都有下面一段:

Map imagesMap = new HashMap();

session.setAttribute("IMAGES_MAP", imagesMap);

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image.jsp?image=");

特别是:

exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);

exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "image.jsp?image=");

这几句,感觉莫名其妙的,

最初猜想是显示图片用的,可到底是不是呢?

而且生成的Html页面的源码中,有很多

<td><img src="image?image=px" width=40 height=1></td>

到底px是什么样的图片?

查看javadoc,写的过于简单,根本没有说明。于是,看源码:

his.imagesMap = (Map)this.parameters.get(JRHtmlExporterParameter.IMAGES_MAP);

if(this.imagesMap == null)

{

this.imagesMap = new HashMap();

}

………….

this.loadedImagesMap = new HashMap();

byte[] pxBytes = JRImageLoader.loadImageDataFromLocation("dori/jasper/engine/images/pixel.GIF");

this.loadedImagesMap.put(pxBytes, "px");

this.imagesMap.put("px", pxBytes);

哈哈,原形毕露了,原来px就是dori/jasper/engine/images/pixel.GIF(一个小不点),但它对网页的美观起了很大的作用,不信你写错Image(jsp、servlet)的路径看看(这也是个可能出错的地方)。

中文显示的问题
问题描述:生成的Html或PDF中文显示为乱码或不显示

解决方法(HTML):

如果只要求生成Html(可能不会有这么简单就能打发走的客户),很好办,如果是JSP: <%@ page contentType="text/html;charset=GB2312" %>

如果是Servlet:response.setContentType("text/html;charset=GB2312");

哈哈,大功告成,预知PDF的中文解决方法,请拨打收费咨询电话110。

解决方法(PDF):

大家把手上的板砖放下吧,我说还不行吗,只是不知道这是不是正确或比较好的解决方法,请多指点。

由于生成PDF时没有什么地方可以设置charset=GB2312(真是个天才的傻想法)。

我们分三步走好了。

1.由于JasperReport使用iText生成PDF,所以我们需要iText亚洲语言包

http://itext.sourceforge.net/downloads/iTextAsian.jar.

将他放在lib中。

2.在JasperReport的设计xml中,可以定义一个中文Font:

<reportFont name="Arial_Normal" isDefault="true" fontName="Arial" size="12" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H" isPdfEmbedded="true"/>

其中pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H"的就是iTextAsian.jar包中定义的字体了。

3.汉字都用UTF-8编码

功能,所以她(请容许我使用”她”,谁让我是光棍程序员呢,嘿嘿)的chart都是依靠别的工具生成,然后作为variable或者parameter传递的。这样我们就可以随心所欲的让她显示任何BufferedImage了,嘿嘿,管他是JfreeChart生成的还是静态image。

我比较倾向于定义为parameter,因为可以在生成JRDataSource的同一个程序中得到Chart的数据,免去Scriptlet里的数据库操作,或者如果是简单报表,直接Scriptlet都省了。

tartdioengnget.javaRITER, out);


我的通用 .jasper 生成方法
JasperReport自带的范例都是用ant构建的,但每个范例有不同的build.xml和.class,那么能不能有一个统一的构件程序呢?iReport可以,但他每次都会写所有的属性,显得页面很不整洁、明了,所以我修改了一个范例的build.xm.和.class,来构建我的JasperReport。有兴趣的同道可以看看。

1.在build.xml中定义

<property name="filename" value="" />

用于动态传递文件名

2.替换所有的 <arg value="-F*******.xml"/>为<arg value="-F${filename}.xml"/>

3.修改程序,每次FILL时都传JREmptyDataSource进去。

每次build时,只需在以前的基础上加上参数:

-Dfilename=******

如:ant compile -Dfilename="myDemo"

我的项目的实现
只是进行了简单的封装,可能并不适用于其他系统,如果需要,请与我联系。

(这次时间比较仓促,等有时间再补上)

 类似资料: