﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-liqiangit-文章分类-Ireport</title><link>http://www.blogjava.net/liqiangit/category/52460.html</link><description>Java</description><language>zh-cn</language><lastBuildDate>Sun, 26 Aug 2012 01:02:41 GMT</lastBuildDate><pubDate>Sun, 26 Aug 2012 01:02:41 GMT</pubDate><ttl>60</ttl><item><title>怎样用iReport制作Web报表 转</title><link>http://www.blogjava.net/liqiangit/articles/386152.html</link><dc:creator>虎在天涯</dc:creator><author>虎在天涯</author><pubDate>Thu, 23 Aug 2012 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/liqiangit/articles/386152.html</guid><wfw:comment>http://www.blogjava.net/liqiangit/comments/386152.html</wfw:comment><comments>http://www.blogjava.net/liqiangit/articles/386152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liqiangit/comments/commentRss/386152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liqiangit/services/trackbacks/386152.html</trackback:ping><description><![CDATA[<p>用iReport开发Web报表功能强大，容易上手使用。由于iReport支持JasperReport，它是纯Java程序，所以用于Web的最佳引擎是JSP，首选Tomcat。报表开发平台使用Windows平台即可。iReport早期在Windows系统上安装只要直接解压即可，而目前最新的版本是1.3.1，可在其官方网站下载<a href="http://ireport.sf.net/">http://ireport.sf.net/</a>，支持安装程序。</p>
<p>安装时需要预先安装java jre，可打开DOS窗口输入java-version看使用的是哪个版本的jre。实用中，安装Oracle10g客户端自带的Java 1.4.2最适合当前的iReport版本，使用Jbuilder2006自带的Java 1.5.0在打开某些交叉报表时可能出现死机现象，建议在Windows系统上安装Java1.4，它支持最新iReport。 </p>
<p>iReport开发文档是收费的，虽然网上可找到较多例子供参考，还有完整的简单报表开发指南，稍加研究即可开发简单报表。但如果要开发中小企业级各类Web报表，就需要深入研究，反复测试了。 </p>
<p>在报表中显示中文 </p>
<p>iReport内部使用Unicode UTF-8编码，设置正确就可支持所有中文报表需求。界面选项支持简体中文。为了在报表中显示中文，在报表字体或较新版本的Style，选择宋体字体。为了正确显示中文，必须安装亚洲语言包，可以从网上下载iTextAsian.jar考入开发机iReport安装目录／lib之下和服务器端WEB-INF/lib目录下。还必须将服务器端的Java汉化，Java1.4比较麻烦，除拷贝宋体字库外，还要修改几个属性文件。Java1.5汉化非常简单，只要在jre/lib/fonts下建立fallback目录，将宋体字库考入该目录即可。为了以PDF格式输出中文，需要在&#8220;PDF Font Name&#8221;选项中选择&#8220;STSong-Light&#8221;，在中文字体定义中勾选&#8220;Default&#8221;、&#8220;PDF Embedded&#8221;，&#8220;PDF Encoding&#8221;选择&#8220;UniGB-UCS2-H (Chinese Simplified)&#8221;。 </p>
<p>在报表中插入图形 </p>
<p>适当的插图在报表中起到画龙点睛作用，可以使枯燥冗长的数据趋势、比例等一目了然。iReport内置基于jfreechart的Chart Tool工具可以方便绘制常用的柱状图、饼图、曲线图等，可满足一般报表的需求。 </p>
<p>如果需要插入静态图片，则要用image工具，要在图片的&#8220;Image Expression&#8221;中写图片文件的绝对路径。为了便于在PC上调试并可用于服务器，文件路径应写成&#8220;$P{imagePath}+文件名&#8221;的形式，参数$P{imagePath}在PC上设为PC机上的DOS路径，注意因为&#8220;\&#8221;是转义符号，DOS路径的&#8220;\&#8221;要写成&#8220;\\&#8221;。在Web输出图片时将服务器上的文件路径作为参数$P{imagePath}传递给输出程序，就可输出正确图片。在以下设定子报表绝对路径等场合，为了增加灵活性，都需要这样做。 </p>
<p>iReport内置的Chart工具并没有支持jfreechart的全部功能，绘图存在局限性，例如，1.2.7之后的版本才实现标记label的旋转，旋转90度可使标记字符垂直显示，以免水平项目过多时标记显示重叠在一起而显示不出来。又如图片中的category各个项目只能是查询结果集各个记录垂直方向的项目，如果要显示同一记录中水平方向各个项目就无法绘图。另外，至今最新版本饼图还不能显示百分比。为了显示更为灵活的图片，应该使用第三方绘图工具。自行开发jfteechart绘图程序可解决这些问题。jfreeChart也是纯Java工具，一般设计Servlet用于绘图，使用image工具，在&#8220;Image Expression&#8221;中用URL表示对绘图程序Servlet的调用，new java.net.URL(URL?参数)，其中URL绘图Servlet的调用路径，问号后用于传递各种绘图参数。其中为了正确传递中文参数，中文字符串应该使用标准的URL编码，即定义一个变量值为java.net.URLEncoder.encode("中文字符串"，"GB2312")，在image的URL中使用变量名传递中文。 </p>
<p>对数据源的支持 </p>
<p>iReport报表引擎需要从数据源获取报表中的数据。而最基本的查询数据源的方法就是SQL查询语句，一个报表只支持一个查询结果集，设计一个报表的核心内容就是设计SQL语句。如果一个报表在不同条件使用完全不同的数据库表查询语句，一般在报表程序中形成SQL语句，并查询得到结果集，再将所得结果集传递给报表引擎形成报表。这样虽然很灵活，但使报表程序冗长复杂，不便维护。最好是将SQL写在报表数据源内，运行时将数据库连接和其他必要参数传递给报表引擎，由报表引擎执行SQL语句并生成报表。 </p>
<p>由于报表只支持单一结果集，对较为复杂的报表，SQL语句的设计就需要较高技巧。简单的参数如数字可直接传递，在报表的SQL语句中用参数表示，如查询条件where x=$P{y}，实际使用时程序中直接将参数值如&#8220;10&#8221;传递给报表引擎，执行时就可以当做where x=10执行。较为复杂的参数可用$P!{param}，可用于替代SQL语句的任何部分，如在不同条件下使用不同的字段排序，可在报表SQL中写order by $P!{y}，实际使用报表时可将实际的值如&#8220;a，b&#8221;或&#8220;b desc&#8221;传递给报表引擎，实际执行时就当做&#8220;order by a,b&#8221;或&#8220;order by b desc&#8221;排序子句执行，参数使用是SQL语句灵活支持多种需要的最重要手段。 </p>
<p>绝大部分参数是字符串格式，偶然需要日期格式的参数，iReport中设缺省值比较复杂，如&#8220;2007年2月28日&#8221;要写成&#8220;(new SimpleDateFormat("yyyy-MM-dd")).parse("2003-01-01")&#8221;，要使用Java函数形式，实际上iReport中所有设定表达式都要显式使用Java函数。 </p>
<p>对于涉及多个表查询的情况，需要使用联合查询语句join和union，join用语横向联结多个表，而union用于纵向合并相同结构表的结果集。可以使用子查询技术，即将一个查询语句当做临时表再进行查询，或与其他表联合查询。 </p>
<p>通过以上各种技术，在各种条件下，最终形成一个单一数据结果集，形成报表。对于报表各个记录来自完全不同来源的情况，可考虑使用非SQL基本数据源，如可用&#8220;JavaBean Data Source&#8221;。定义一个基本类，声明各个字段类型及getXXX（）、setXXX（）方法。测试报表时，建一个数据类，用JRBeanCollectionDataSource(list)封装，其中用list加入测试数据。将class打包考入iReport/lib目录下，在iReport新建数据源，类型为JRDataSourceProvider，类名为刚才定义的类，就可用该类提供测试数据测试报表。打包时注意两点，编译和打包使用的jar的Java版本要与安装iReport时Java版本一致，特别在电脑上装有多个版本的Java时。实际使用报表时，也是使用list先动态填充数据，fill报表时传递数据源为new JRBeanCollectionDataSource(list)即可生成动态报表。 </p>
<p><br />&nbsp;</p>
<p>&nbsp;</p> <img src ="http://www.blogjava.net/liqiangit/aggbug/386152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liqiangit/" target="_blank">虎在天涯</a> 2012-08-23 22:24 <a href="http://www.blogjava.net/liqiangit/articles/386152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>