ireport初级教程之交叉表
1、一个CrossTabs是一种在设计的时候既不确定行数和也不确定列数的一种表格,在运行环境下它会像下面显示的不同年份的一个销售报表一样。

4、在第一步里我们需要选择一个dataset来填充crosstab,我们这里使用主报表里提供的dataset,点击下一步继续。

6、和定义行分组一样,从这里我们可以定义两个列分组,这里我们仅使用一个列分组,使用数据中的DEGREE字段对数据进行分组。该字段的含义是学历,这就表示,我们要做的这个交叉报表是用来计算不同部门员工在学历方面的人数分布情况。

8、最后一步我们可以为crosstab的布局设定一个布局。我们可以设置是否能看到表格线、或者是否包括行和列总数统计之类。我们这里全部选择。点击finish注意当一个crosstab添加到一个报表中后,会自动在设计窗口中添加一个用来编辑当前crosstab的tab页窗口。

10、列,行,单元格 (Columns,rows,cells)一个crosstab至少必须有一个行分组和一个列分组,每一个行和列的分组都有一个可选的行/列的统计。下面图中所示的是一个基本的由一个行列分组构成的crosstab。

12、行和列 (Rows and columns)一个行或列的分组可能通过crosstab的属性窗口来对它进行修改(在crosstab编辑器右键菜单里选择Crosstab properties)。

14、添加一个新的分组请点击名为Add的按钮。

16、“bucket”是分组的标准,它通过一个java类来定义。在一个bucket表达式里,你可以使用主报表里所有的fields/variables/parameters。但是,如果你选择使用subdataset来填充crosstab,那么必须使用subdataset里提供的fields/variables/parameters。一个header的单元格增长依赖于它所跨越的行数。你可以选择多个元素放置在

18、当Bucket在行分组里时,header的单元格内容的定位相似。但是在这个用例中, details可以改变header宽度而不是高度。

20、当一个行或列添加到crosstab里时,一个特殊的用来引用bucket表达式的变量将要被创建。它和新的group有相同的名称。你可以从crosstab objects 标签里通过查找绿色小点的方式来定位这个bucket variable。


23、下图中所示的crosstab就是在图16.14在SEX 的group被向上移后的效果。

25、16.2.3、特殊单元格 (Special cells)如果一个crosstab不能包含一些数据,你可以选择打印别的东西来替代。例如,你可以包含一条消息,方法是,你必须编辑“when-no-颊俄岿髭data”单元格。在crosstab上右键勾选弹出菜单中的“when-no-data default cell”复选框。这个操作完成后将会出现一种很明显的编辑模式,你可以操作“when-no-data”单元格的内容。

28、点击Add按钮,创建一个新的measure。Measure的属性窗口将显示,你最少应该去设置它的n锾攒揉敫ame,class type和expression。在measure里你可以使用fields,variable和parameters一个measure可以存储一个来自你代码中的实际的值(将calculation type设为nothing)或者一个类似于用count,sum等计算出来的值。对于每一个measure 你可以提供一个自定义的incrementer类(一个继承自net.sf.jasperreports.engine.fil.JRIncrementerFactory的类)去实现特定的increment 方法。这里的“percentage of”选项允许你选择表现变量最终值的百分比。你可以提供一个特殊类来计算百分比的值,此时这个类必须实现net.sf.jasperreports.crosstabs.fill.JRPercentageCalculator接口。

30、Repeat column headers : 如果勾选,当crosstab完全添加到页面中时列的header将会被重复打印。Repeat row headers : 如果勾选,当crosstab完全添加到页面中时这个行headers将会被重复打印。Column break offset : 当crosstab超过页面宽度时它指定上一块的数据与下一块之间的空白间隔。

32、对于一个parameter,你必须为其指定name,罕铞泱殳class type,同时你还可以为其指定一个可选的可以包含主报表中任意一个fields,variable,parameters的表达式。警告:使用dataset的过滤查询,你必须用定义在crosstab properties窗口里的dataset 启动parameters,不能用crosstab里的parameters.你可以在crosstab objects窗口里看到crosstab parameters的列表,他们用红色的点标记出来。你可以在启动时用一个MAP来设置crosstab parameters里声明的值。在这个用例中,你需要在element properties窗口里提供一个合法的parameter map expression。

34、如果你的数据是pre-sorted.你可以勾选“Data is presorted”的checkbox以使得填充数据的处理速度加快。Reset type/group和increment type/group选项可以用来定义当集合类型的数据需要重置并且当添加一条记录到你的dataset。关于怎么设置dataset的启动参数请参考subdataset的相关章节。
35、16.2.8、交叉表合计变量 (crosstab total variables)Crosstab variables 是内置的对象,可以结合数据在不同的聚合水平使用在crosstab textfield的表达式里。


39、FineReport天然支持行列对称,设计交叉表的方法也很简单。
40、2.制作步骤2.1新建工作簿,添加数据集新建工作薄,添加数据集ds1,SQL语句为SELECT * FROM [销量]。
41、2.2制作交叉表设计好表样后,将数据列拖入对应单元格:

45、2.示例2.1新建报表,设计表样新建工作薄,添加数据集,SQL语句为select 雇员ID, strftime('%m',订购日期)as 月份, 应付金额 from 订单 where strftime('%Y',订购日期) = '2011',查询出2011年每个雇员,每月订单金额。如下制作一张交叉表:

47、2.2横向累计在C3单元格中,写入公式:=B3 + C3[;B2:-1]:当前月份的金额加上一月累计金额。其中C3[;B2:-1]表示上父格B2扩展出来的上一格(上月)的C3的值。
48、2.3保存与预览保存模板,预览效果如上。