6.1、需求
前面我们已经介绍了IReport的开始,现在我们做一个例子。假设我们要做一个会议通讯录的报表,要求按照参会人的单位分组显示,即同一个单位的参会人员显示在一起,而且每个人占用一行,相邻两个人之间用不同的背景进行间隔。要求在标题下面打印会议名称,会议名称通过参数传入。
6.2、绘制
首先你需要获得Javabean中的属性。通过在主界面中选择如下图所示图标,图中用红圈圈住,并用红色箭头指向。
此时弹出Report Query窗口(如下图所示)。
选择”JavaBean Datasource“标签,在”Class name“中输入作为数据源的Java类,要求输入完整的类名,要包含包名。因为我建了一个叫做report.CAddressList的Java类(建立方法请看后篇),并且此类里面定义了id、name、nationality、phone、post、sex、unit属性,因此输入完类名后直接点击”Read attributes“按钮就可以获得类里面的这些属性了,选择需要加入报表的字段,然后点击”Add selected field(s)“按钮,将它们加入到窗口最下面列表中,最后选择”OK“按钮,这些Javabean中的属性就加入到”Report Inspector“中的”Fields“节点下,如下图所示:
要使在”Report Query“窗口中能够读取你自己定义的Javabean的属性,必须将你定义的Javabean放置在IReport的Classpath路径可以寻找的目录中。
下面来讲一下如何让IReport支持自己定义的类。
选择主菜单“工具”下面的“选项”子菜单,如下图所示:
出现“选项”对话窗口,如下图所示:
在“选项”窗口中选择“Classpath”标签,将要添加的自己的类所在的目录添加进来即可。然后选择“确定”按钮。
配置好数据源字段后,我们就来开始绘制报表,先要调出组件面板,在组件面板上有很多用来绘制报表的控件,默认情况下组件面板是显示的,如果你的组件面板没有显示,可以通过如下方法调出:
在主菜单”窗口“下选择”组件面板“(如下图所示),或者使用快捷键”ctrl+shift+8“。
这时在屏幕右边(一般在这边)会出现如下图的面板区域。
在组件面板中可以选择绘制报表时需要的任何控件,例如线条、矩形框、静态文本标题、图片等等。
下面我们首先绘制一个报表标题,在组件面板中选择”Static Text“,然后拖拽它到报表设计器的Page Header Band,并双击它编辑文字为”会 议 通 讯 录“,每个汉字自己使用空格做了一点间隔,好看而已,不是必须的。这样在报表的每一页都将出现报表名称。如果你只是想在报表第一页显示报表名称,其它页面上不显示,想想看如何处理?对了,将其放置在Title Band中就可以了。
我们将一个控件拖入报表设计器后,就可以在其中拖动位置来布局将来的显示位置,IReport是即看即所得的设计器,因此设计时你如何放置,显示时就是如何显示的。
仅仅将控件拖入报表设计器还不能完全达到我们的目的,我们还需要设置其属性,特别是对于显示的内容是中文的,而且将来要生成PDF文件的,设置相关的属性就更加重要了。我们选中拖入的控件“Static Text”,这是打开其属性面板。属性面板如果没有出现在主窗口中,可以同样在主菜单”窗口“中选择”属性“菜单来打开,属性面板的界面如图:
这里对于一个”Static Text“控件关键要设置如下几个属性:
1)Font name:在其中选中”宋体“,为了保证报表将来在任何计算机上都可以正常显示,最好使用统一的”宋体“,否则将来客户机器上没有这个特殊字体就会很难看了。
2)Size:设置字体大小。因为此处是报表标题,因此我选用了大字体,选择24。
3)Bold:设置字体为粗体。
4)Pdf Font name is now deprecated:在此选择”STSong-Light“。为了将来导出成PDF可以正常显示汉字。
5)Pdf Embedded:选中它。为了将来导出成PDF可以正常显示汉字。
6)Pdf Encoding:选择”UniGB-UCS2-H (Chinese Simplified)“。为了将来导出成PDF可以正常显示汉字。
7)Horizontal Alignment:选择”Center“。因为我将此"Static Text"的大小拖拽成合页面一样宽。
8)Vertical Aligment:选择”Middle“。
最好效果如下图所示:
只要是涉及汉字的都要做如上设置,否则无法显示
再选择四个”Static Text“控件放置在Page Header Band中,分别设置其文本内容为”会议名称“、”第 “、”页 总“、”页“。并参考上面一样设置相关属性(这里略)。
打开”Report Inspector“面板。如果主窗口中没有此面板,还是到主菜单”窗口“下选择”Report Inspector“菜单即可。“Report Inspector“面板如下图所示:
在这个面板中会分类列出”Style“、”Parameters“、”Fields“、”Variables“、”Scriptlets“、”Table Dataset“、”Title“、”Page Header“、”Column Header“、”XXX Group Header“(如果建立了分组就会出现它)、”Detail“、”XXXX Group Footer“(如果建立了分组就会出现它)、”Column Footer“、”Page Footer“、”Last Page Footer“、”Summary“、”No Data“、”Background“等节点。
因为按照需要,会议名称是通过参数传入的,因此我们需要在”Parameters“节点下面建立一个名为”meeting_name“的参数。建立方法如下:
1)选中”Parameters“节点,鼠标右键,选择”添加 Parameter“菜单,系统将建立一个”Parameter1“的参数。如下图:
2)选中”Parameter1“(默认情况下自动选中的),查看其属性面板。修改”name“属性为”meeting_name"。修改“Parameter Class”属性为“java.lang.String”,“Parameter Class”属性就是用来指定参数的数据类型,在IReport中,属性的类型都是Java的类。通过下列选择你需要的类型,也可以点击后面的“...”按钮直接输入java类。可以输入的java类是任意的,可以是Java JDK中包含的任何类,也可以是你定义的类。要使用自己定义的类,就必须将这些类所在的路径配置在Classpath中,配置方法参考前面描述。
现在我们回到“Parameters”的属性面板,在“Default Value Expression”属性中可以填入此参数默认的初始值,因为此参数的数据类型都是Java的类,因此此处要求如下这样写“new java.lang.String("江西省XXX公司年度大会")",就是说要new一个对象出来,不管是String类型还是Interger类型或者其它什么类型。
在”Description“属性中填入的是对参数的描述,如填写成”会议名称“,这样下次看到此参数时就可以指定此参数的用途了。
填写好的”meeting_name“的属性面板如下图所示:
3)添加页码和总页数。
页码和总页数通过展开”Report Inspector“面板中的“Variables”节点,并从中拖拽就可以了。页码对应的变量是“PAGE_NUMBER”,其”Expression Class“是”java.lang.Integer“,”Evaluation Time“的值是”now“。总页数对应的变量是“PAGE_NUMBER”,其”Expression Class“是”java.lang.Integer“,”Evaluation Time“的值是”report“。“PAGE_NUMBER”是系统默认提供的,不需要我们手工建立。
到此我们的报表头已经绘制结束了,其布局如下图所示:
接下来我们来绘制报表体,因为需求中要求按照参会人所在单位进行分组,将同一单位的参会人放在一起,因此我们先来建立一个分组。建立分组的方法如下:
1)选中”会议通讯录“,鼠标右键,选择”Add Report Group“菜单。如下图所示:
2)出现”New Group Wizard“向导窗口(如下图所示),在”Group name“中输入一个用于表示本分组的名字,没有限制,我们这里输入”Unit Group“。选择”Group by the following report object“,并在下面的下列选择框中选择”unit“字段。”unit“字段就是Fields中的。
建立好分组后在”Report Inspector“面板中就会多出”unit group Group Header 1“和”Unit Group Group Footer 1“两个节点。其中”unit group Group Header 1“是分组的头,而”Unit Group Group Footer 1“分组的脚。它们中间就是”Detail Band“。
我们在”unit group Group Header 1“中放入矩形控件,放置方法是从组件面板中选择矩形控件,然后拖入放置在适当的位置。放置矩形控件是为了制做报表的边框、网格等。并放置一些静态文本”Static Text“控件和字段unit。字段unit从”Report Inspector“面板中的Fields中拖入。具体布局界面如下:
还为矩形控件设置了背景颜色。矩形控件设置背景颜色的方法是,选中矩形控件,在其属性面板中修改”Backcolor“属性值。在字段unit外面也放置了一个矩形控件,但没有设置它的背景颜色,因为默认的背景颜色是白色。
另外,为了当数据在换页后不重新显示本表头,因此我们需要做个设置,在”Report Inspector“面板中选中”unit group Group Header 1“,在其属性面板中找到”Reprint Header“,并设置其值为选中,这样当分组数据跨页时,在第二页会重新打印表头。
下面将需要显示的字段如id、name、post、sex、nationality、phone,依次从”Report Inspector“面板中的Fields中拖入并对应放置在相应的表头下面。同时也为每个字段都配置一个矩形用于描绘网格线。其配置效果如下图所示:
其中姓名对应的是$F{name},职务对应的是$F{post},性别对应的是$F{sex},民族对应的是$F{nationality},联系电话对应的是$F{phone},签名下面对应的只有一个矩形框。
序号的设想是每组的序号都会从1开始,因此我通过定义一个变量来实现。选中”Report Inspector“面板中的”Variables“节点,鼠标右键,选择“添加 Variables”菜单,如下图所示:
系统将在”Variables“节点新增一个“Variable1”,选中它,在属性面板中修改相应属性。
修改Name属性值为“group inner number”;
修改Variable Class属性值为“java.lang.Integer”,此处的内容也必须是Java类,可以是系统的类,也可以是自己定义的类;
修改Calculation属性值为“Nothing”,就是表明此字段不会自己增加。其可选的值有“Count”、“Distinct Count”、“Sum”、“Average”、“Lowest”、“Highest”、”Standard Deviation“、”Variance“、”System“、”First“;其中每种值的含义如下:
值 | 含义 |
Nothing | 不做任何计算 |
Count | 对记录集数进行循环累加,计算有多少条记录。 |
Distinct Count | 对记录集数进行循环累加,计算有多少条记录。但忽略重复记录,即某个值已经统计过此处就不再统计 |
Sum | 累加某字段(必须是数字类型)的总和 |
Average | 计算某字段(必须是数字类型)总和的平均值 |
Lowest | 返回某字段的最小值 |
Highest | 返回某字段的最大值 |
Standard Deviation | 返回表达式的所有值的标准方差 |
Variance | 返回表达式收到值的变化 |
System | 不做任何计算也没有任何价值 |
First |
修改Reset type属性值为”Group“。Reset type属性可选的值有如下几种:
值 | 说明 |
none | 任何时候不做重置操作 |
report | 在报表创建时才进行变量初始化 |
page | 在报表每页对变量进行初始化 |
column | 在报表处理每个Column时就对变量进行初始化 |
group | 报表每个分组对变量进行初始化 |
修改Increment type属性值为“Group”。其值可选同Reset type属性。
修改Increment Group属性值为“Unit Group”。
修改Variable Expression属性值为“$V{group inner number}。
修改Initial Value Expression属性值为”new Integer(0)"。
最终效果如下图所示:
接下来来建立一个Scriptlets。选中”Report Inspector“面板中的”Scriptlets“节点,鼠标右键,选择“添加 Scriptlet”菜单,如下图所示:
系统自动建立“scriptlet1”,通过其属性面板修改相关的属性值。
修改name属性值为“group inner number”。
修改Scriptlet Class属性值为“report.CIntegerIncrement"。report.CIntegerIncrement是我自己定义的一个Java类,具体定义请参考后续文档。
在unit Group Group Footer Band中放入二个静态文本,并从”Report Inspector“面板中的"Variables”节点中拖入一个“Unit Group_Count”的字段。这个字段是建立分组后由系统自动建立的,用于统计各个分组中记录数。其界面布局如下图所示:
到此,报表的设计工作结束,我们来预览一下,点击设计界面中的”Preview“,如图中红色圈中的部分:
就可以预览报表效果了。
报表设计完毕,通过点击编译图标来生产可分发的jasper文件,其操作如图红色圈中部分: