ireport 5.6教程之交叉表

2025-05-08 10:14:52

1、一个CrossTabs是一种在设计的时候既不确定行数和也不确定列数的一种表格,在运行环境下它会像下面显示的不同年份的一个销售报表一样。CrossTabs在jasperresports中从1.1.0版本时开始提供,同时iReport也从1.1.0开始支持CrossTabs。Jasperreports的CrossTabs工具允许对行和列的数据进行分组、汇总和自定义每一个cell里的内容。填充CrossTab的数据可以来自主报表里的dataset或来自subDataset。使用iReport里提供的向导我们可以简单快速的创建功能强大的交叉报表组件。一个CrossTabs本质上是一个表格,行和列的数量取决于填充这个表格的数据。行和列也可以在groups里做聚合操作。对于每一个行或列的group我们都可以得到一个细节信息和一个可选的行列数据的汇总。

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

27、点击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接口。

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

31、对于一个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。

ireport 5.6教程之交叉表

33、如果你的数据是pre-sorted.你可以勾选“Data is presorted”的checkbox以使得填充数据的处理速度加快。Reset type/group和increment type/group选项可以用来定义当集合类型的数据需要重置并且当添加一条记录到你的dataset。关于怎么设置dataset的启动参数请参考subdataset的相关章节。

34、16.2.8、交叉表合计变量 (crosstab total variables)Crosstab variables 是内置的对象,可以结合数据在不同的聚合水平使用在crosstab textfield的表达式里。

ireport 5.6教程之交叉表ireport 5.6教程之交叉表

38、2.制作步骤2.1新建工作簿,添加数据集新建工作薄,添加数据集ds1,SQL语句为SELECT * FROM [销量]。

39、2.2制作交叉表设计好表样后,将数据列拖入对应单元格:纵表头:地区与销售员默认纵向扩展实现从上到下分组;横表头:将产品类型与产品设置为从左到右罩煺渥王扩展,让产品横向分组,实现横表头;数据:根据父子格的概念,销量会以销售员为左父格,产品为上父格,自动匹配出销售员与产品对应的销量。预览即可看到上图交叉表。注:此处销售员与产品对应的销量是唯一的,因此,直接将销量拖入单元格即可。另:若销售员与产品对应的销量不唯一,则将销量数据列的显示方式设为汇总-求和,详细请查看数据显示方式。

ireport 5.6教程之交叉表

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

ireport 5.6教程之交叉表

44、2.2横向累计在C3单元格中,写入公式:=B3 + C3[;B2:-1]:当前月份的金额加上一月累计金额。其中C3[;B2:-1]表示上父格B2扩展出来的上一格(上月)的C3的值。

45、2.3保存与预览保存模板,预览效果如上。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢