相信很多java程序员们,在开发报表的时候都使用过ireport, ireport功能确实很强大,可以开发出各式各样的报表来。(如:)是java应用中做报表的一款很好的利器。这也是之所以很多的java程序员们热衷于它的原因,而且因为ireport本身也是用java语言开发的,这更令我们java程序员们感觉亲切。事实上在网上找ireport的资料并不是很多,在我们使用的时候出现的很多问题大多数甚至在网上都很难找到其原型,因此而困恼着许许多多的ireport的使用者。本人使用ireport也有一段时间了(从2010年12月份至今),多多少少积累了一些使用的经验,在此做一下总结,并想和大家一起分享,就当是抛砖引玉吧。
Ireport能做的事情很多,可以生成Excel,PDF;可以做柱状图、饼状图等等。而今天我要总结的不会面面俱到,因为其中的很多功能我至今都尚未使用过,恐怕只有等到需要到了的时候我才会去关心哪些未曾使用过功能吧。好吧,废话不多说了,下面我将用一个实例来开始我对ireport使用的总结吧。
这个实例的需求是要做一个电子保单(客户通常在保险公司投保的时候会有一张保单产生)。对,我们现在就开始采用ireport来开发一张保险公司的电子保单.
我使用的ireport版本是:
第一步、当然是下载ireport啦:(如果你电脑里有就跳过这一步了)
下载地址:http://sourceforge.jp/projects/sfnet_ireport/releases/
也可以到网上google下可以很轻易的下载到。
第二步、创建模版
由于要开发的是一个电子保单所以我选择了BlankA4。 如下图:
第三步、填写报表名称,点击下一步(我们选择“Launch Report Wizard”需要配置数据源)
将你要开发的报表名称天上就OK啦
默认是空数据源,可以点击“New”按钮进行配置新数据源
这里我们选择 JDBC链接,点击Next,就可以配置数据源啦
将你的数据源信息填上,测试成功就OK啦
填写该报表需要使用的查询SQL语句
选择报表中需要用到的字段,可选择全部
选择分组
创建完毕
第四步、模版设计
① Title:只在整个报表的第一页的最上面部分显示,除了第一页,不管报表中有多少个页面也不会再出现Title band 中的内容。就是报表的标题:
② Page Header:中的内容将会在整个报表中的每一个页面中都会出现,显示的位置在页面的上部。如果是报表的第一页,pageHeader 中的内容将显示在Title Band 下面,除了第一页以外的其他所有页面中,pageHeader 中的内容将显示在页面的最上端,即页眉
③ Column Header:显示在所在页面的最下端,即页脚。
④ Detail:报表内容段,在这个Band 中设计报表中需要重复出现的内容,Detail 段中的内容每页都会出现。
⑤ Column footer:针对Detail Band 的表头段,一般情况下在这个段中画报表的表头。
⑥ Page footer:针对Detail Band 的表尾段。
⑦ Summary:表格的合计段,出现在整个报表的最后一页中的Detail band 的后面,一般用来统计报表中某一个或某几个字段的合计值。
⑧ Background:可以用于加入报表的水印。(mode="Transparent"必须加上这个,背影才可用)
|
对背景图片的控制
|
下面介绍一下相关的组件面板:
我就介绍几个比较常用的吧,如Static Text、Text Field、Subreport …
Static Text : 字面意思就是静态文本,可以在上面任意的写文本字符等,需要特别注意的是中文不显示的问题。
解决方法:选中某一个带中文的 Static Text或TextField,查看“属性”
1:Font name:属性设置为“宋体”或其他中文字体;
2:Pdf Font name is now…:这个属性也得设置为STSong-Light,我特意试了其他的好几个值结果都是不能正常显示,除了设成该值外。
3:Pdf Encoding: 这个属性也得设置为UniGB-UCS2-H (ChineseSimplified),若设置为UniGB-UCS2-V(Chinese Simplified)这个属性则该域将会竖着排列了。
Text Field:文本字段,这个就是从库里读出来的字段啦。该组件若出现中文问题跟StaticText处理方法一样。这个组件特别值得一提的属性是Text Field Expression: 文本域表达式,可以写表达式。我们右键某一个TextField选择Edit Expression,将弹出下图:
另外还需要提的一个属性是“Blank when null”当选中该属性时则表示若库里没有值为null的时候ireport将会进行设空处理,以至于出来的报表中不会出现null字符串。
Subreport: 子模版,为什么需要它呢?我的理解是当我们有一个比较大的报表的时候,可能就需要分多个模块,为了层次分明一点,每一个模块就可以做成一个个的子模版了。
在你使用该属性的时候,需要最好先建好一个子模版(就是另外一个子报表)。
这个组件需要注意的几个属性分别是Subreport Expression 子报表表达式,
另外一个属性是Parameters 词义是参数,就是这个子模版需要哪些参数?
我认为这3个组件是最重要的组件,就重点的讲了一下,包括需要注意的点,另外ireport其实还提供了很丰富的组件如Chart、Crosstab、Image、List、Frame等等 ,就不一一介绍啦,大家可以自己设计一个报表将这些组件都用上一遍就大概明白了,其实很多的属性都是一样的比如Left、Top、Width、Height等基本上都有这些属性,ireport是可视化的可以拖拽这些组件,直到你满意位置,具体的设计还是得看大家自己啦,当然一般报表都是很严格的,客户都会提供模版,所以我们只需要照着模版去画就OK啦。
下图是我做的一个简单报表设计:
上面我们介绍了模版中的Title、Page Header、Column Header 等Bands栏,而并没有提及styles、Parameters、Fields、Variables、Scriptlets这几个。
Styles :
可以定义样式
可以设置该样式的条件…
而且只要定义,则其他组件也可以调用,调用方式只需要在当前组件的Style属性选中刚定义的style就OK啦。
Parameters:
Parameters通常是用来在打印的时候从程序里传值到报表里。也就是说parameters通常的是起参数传递的作用。他们可以被用在一些特定的场合(比如应用中SQL 查询的条件),如report中任何一个需要从外部传入的变量等(如一个Image对象所包括的char或报表title的字符串)。
和使用Fields一样,parameters也需要在创建的时候定义它的数据类型。parameters的数据类型是标准的java的Object。
Variables: 定义变量:在此只举个例子,比方想计算报表中人员列的总额。点快捷方式***----Variables---新增,Variable name处填写personTotal,变量类型选Integer,计算类型选Sum,Reset type处选报表,变量表达试写$F{person_num}(对此列进行总数统计),初始值添new Integer(0),最后再引用这个变量$V{personTotal},这样就完成对人员列的统计
Scriptlets: 可以参考 http://www.blogjava.net/bulktree/archive/2008/12/17/246786.html
刚刚我设计的那张报表是带有参数的,所以当我点击预览的时候就会出现:
文本框中需要填写该参数的值
出现的结果如下图:
图中出现的哪个是个背景图片,这个其实可以用来做水印的,记得当时我们客户提出要让我们做个水印,由于当时不会,以为ireport不支持这种功能呢,结果发现其实是可以的。只需要注意在设置背景的时候在给reportElement设置mode="Transparent"必须加上这个,背影才可用上文也都提及啦,这里再强调一下。
另外最近才发现的一个问题,而且也是大家可能很容易忽视的一个问题。就是传动态SQL的问题,原本我以为ireport中只能传递参数条件的SQL,(如:SELECT * FROM TEXT WHERE COLOUM = ‘这里传参数’)。
其实不然,ireport的其实是可以将整个SQL语句作为一个参数进行传递的。只是需要注意一个细节,就是$P{PARAM} 和$P!{PARAM}的区别问题啦。当你使用前者的时候,那么就只能传递某一SQL的条件值参数了,而只用当参数设置为$P!{PARAM}这种带有!的参数的时候才可以传递SQL. 这就给我们的应用带来更便利、更灵活的实现啦。
以上这些内容都是我在实际应用ireport中所总结出来的一些经验,不一定所有的都是对的,大家可以积极指出,在下定当谦虚心接受。
当然ireport远远不知这么些功能,在我以后的路上可能还会遇到更多的麻烦,所以希望大家可以一起分享我们的使用经验,以至于我们可以在实际开发的时候更高效的完成任务。
很愿意和大家一起交流
本人Email地址:[email protected], [email protected]
有任何疑问都可以随时联系。