posts - 310, comments - 6939, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

怎样用iReport制作Web报表 转

Posted on 2007-12-02 22:02 诗特林 阅读(2938) 评论(1)  编辑  收藏 所属分类: BI

怎样用iReport制作Web报表 转

用iReport开发Web报表功能强大,容易上手使用。由于iReport支持JasperReport,它是纯Java程序,所以用于Web的最佳引擎是JSP,首选Tomcat。报表开发平台使用Windows平台即可。iReport早期在Windows系统上安装只要直接解压即可,而目前最新的版本是1.3.1,可在其官方网站下载http://ireport.sf.net/,支持安装程序。

安装时需要预先安装java jre,可打开DOS窗口输入java-version看使用的是哪个版本的jre。实用中,安装Oracle10g客户端自带的Java 1.4.2最适合当前的iReport版本,使用Jbuilder2006自带的Java 1.5.0在打开某些交叉报表时可能出现死机现象,建议在Windows系统上安装Java1.4,它支持最新iReport。

iReport开发文档是收费的,虽然网上可找到较多例子供参考,还有完整的简单报表开发指南,稍加研究即可开发简单报表。但如果要开发中小企业级各类Web报表,就需要深入研究,反复测试了。

在报表中显示中文

iReport内部使用Unicode UTF-8编码,设置正确就可支持所有中文报表需求。界面选项支持简体中文。为了在报表中显示中文,在报表字体或较新版本的Style,选择宋体字体。为了正确显示中文,必须安装亚洲语言包,可以从网上下载iTextAsian.jar考入开发机iReport安装目录/lib之下和服务器端WEB-INF/lib目录下。还必须将服务器端的Java汉化,Java1.4比较麻烦,除拷贝宋体字库外,还要修改几个属性文件。Java1.5汉化非常简单,只要在jre/lib/fonts下建立fallback目录,将宋体字库考入该目录即可。为了以PDF格式输出中文,需要在“PDF Font Name”选项中选择“STSong-Light”,在中文字体定义中勾选“Default”、“PDF Embedded”,“PDF Encoding”选择“UniGB-UCS2-H (Chinese Simplified)”。

在报表中插入图形

适当的插图在报表中起到画龙点睛作用,可以使枯燥冗长的数据趋势、比例等一目了然。iReport内置基于jfreechart的Chart Tool工具可以方便绘制常用的柱状图、饼图、曲线图等,可满足一般报表的需求。

如果需要插入静态图片,则要用image工具,要在图片的“Image Expression”中写图片文件的绝对路径。为了便于在PC上调试并可用于服务器,文件路径应写成“$P{imagePath}+文件名”的形式,参数$P{imagePath}在PC上设为PC机上的DOS路径,注意因为“\”是转义符号,DOS路径的“\”要写成“\\”。在Web输出图片时将服务器上的文件路径作为参数$P{imagePath}传递给输出程序,就可输出正确图片。在以下设定子报表绝对路径等场合,为了增加灵活性,都需要这样做。

iReport内置的Chart工具并没有支持jfreechart的全部功能,绘图存在局限性,例如,1.2.7之后的版本才实现标记label的旋转,旋转90度可使标记字符垂直显示,以免水平项目过多时标记显示重叠在一起而显示不出来。又如图片中的category各个项目只能是查询结果集各个记录垂直方向的项目,如果要显示同一记录中水平方向各个项目就无法绘图。另外,至今最新版本饼图还不能显示百分比。为了显示更为灵活的图片,应该使用第三方绘图工具。自行开发jfteechart绘图程序可解决这些问题。jfreeChart也是纯Java工具,一般设计Servlet用于绘图,使用image工具,在“Image Expression”中用URL表示对绘图程序Servlet的调用,new java.net.URL(URL?参数),其中URL绘图Servlet的调用路径,问号后用于传递各种绘图参数。其中为了正确传递中文参数,中文字符串应该使用标准的URL编码,即定义一个变量值为java.net.URLEncoder.encode("中文字符串","GB2312"),在image的URL中使用变量名传递中文。

对数据源的支持

iReport报表引擎需要从数据源获取报表中的数据。而最基本的查询数据源的方法就是SQL查询语句,一个报表只支持一个查询结果集,设计一个报表的核心内容就是设计SQL语句。如果一个报表在不同条件使用完全不同的数据库表查询语句,一般在报表程序中形成SQL语句,并查询得到结果集,再将所得结果集传递给报表引擎形成报表。这样虽然很灵活,但使报表程序冗长复杂,不便维护。最好是将SQL写在报表数据源内,运行时将数据库连接和其他必要参数传递给报表引擎,由报表引擎执行SQL语句并生成报表。

由于报表只支持单一结果集,对较为复杂的报表,SQL语句的设计就需要较高技巧。简单的参数如数字可直接传递,在报表的SQL语句中用参数表示,如查询条件where x=$P{y},实际使用时程序中直接将参数值如“10”传递给报表引擎,执行时就可以当做where x=10执行。较为复杂的参数可用$P!{param},可用于替代SQL语句的任何部分,如在不同条件下使用不同的字段排序,可在报表SQL中写order by $P!{y},实际使用报表时可将实际的值如“a,b”或“b desc”传递给报表引擎,实际执行时就当做“order by a,b”或“order by b desc”排序子句执行,参数使用是SQL语句灵活支持多种需要的最重要手段。

绝大部分参数是字符串格式,偶然需要日期格式的参数,iReport中设缺省值比较复杂,如“2007年2月28日”要写成“(new SimpleDateFormat("yyyy-MM-dd")).parse("2003-01-01")”,要使用Java函数形式,实际上iReport中所有设定表达式都要显式使用Java函数。

对于涉及多个表查询的情况,需要使用联合查询语句join和union,join用语横向联结多个表,而union用于纵向合并相同结构表的结果集。可以使用子查询技术,即将一个查询语句当做临时表再进行查询,或与其他表联合查询。

通过以上各种技术,在各种条件下,最终形成一个单一数据结果集,形成报表。对于报表各个记录来自完全不同来源的情况,可考虑使用非SQL基本数据源,如可用“JavaBean Data Source”。定义一个基本类,声明各个字段类型及getXXX()、setXXX()方法。测试报表时,建一个数据类,用JRBeanCollectionDataSource(list)封装,其中用list加入测试数据。将class打包考入iReport/lib目录下,在iReport新建数据源,类型为JRDataSourceProvider,类名为刚才定义的类,就可用该类提供测试数据测试报表。打包时注意两点,编译和打包使用的jar的Java版本要与安装iReport时Java版本一致,特别在电脑上装有多个版本的Java时。实际使用报表时,也是使用list先动态填充数据,fill报表时传递数据源为new JRBeanCollectionDataSource(list)即可生成动态报表。


评论

# re: 怎样用iReport制作Web报表 转[未登录]  回复  更多评论   

2008-09-13 12:34 by hehe
请问如果sql语句涉及到多表查询,在ireport中应该怎么处理呢?

只有注册用户登录后才能发表评论。


网站导航: