奴隶幽灵 阅读:137次 时间:2024-01-10 16:54:46ireport 4,5初级教程之交叉表,本文介绍ireport中交叉表的具体实现方法,以下内容是由微蓝经验网用户发布ireport 4,5初级教程之交叉表,收藏起来了解,希望对于用户有一定帮助,为朋友进行解决疑惑,如若想了解更多相关内容,可以向底部移动了解更多与本教程文章相关解决经验方法!
ireport
一个CrossTabs是一种在设计的时候既不确定行数和也不确定列数的一种表格,在运行环境下它会像下面显示的不同年份的一个销售报表一样。

CrossTabs在jasperresports中从1,1,0版本时开始提供,同时iReport也从1,1,0开始支持CrossTabs,Jasperreports的CrossTabs工具允许对行和列的数据进行分组、汇总和自定义每一个cell里的内容,填充CrossTab的数据可以来自主报表里的dataset或来自subDataset,使用iReport里提供的向导我们可以简单快速的创建功能强大的交叉报表组件,一个CrossTabs本质上是一个表格,行和列的数量取决于填充这个表格的数据,行和列也可以在groups里做聚合操作,对于每一个行或列的group我们都可以得到一个细节信息和一个可选的行列数据的汇总。
交叉表向导 (Crosstab wizard)
为了说明怎么让一个crosstab工作起来,我们将使用向导创建一个crosstab,当我们在工具条里选择crosstab元素并将其添加到报表中时crosstab的向导会自动启动,还是以DoradoSample里提供的hsql数据里的employee报为例,我们使用包含下面查询语句的空报表开始:
Select * from employee
我们把crosstab放在报表的底部:summary band

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

在第二步里我们需要定义至少一个行分组,我们这里选择对所有记录使用DEPT_ID进行分组,这样就意味着crosstab的每一行将会采用一个明确的部门编号,这样JasperReports将会使用部门编号对数据集里的数据进行重新整理计算,使用向导,我们可以定义两个行分组,这是使用向导的局限性所在,事实上,如果你需要的话你可以通过Crosstab的属性设置窗口定义若干个行和列的分组,点击下一步继续。

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

是时候定义detail 数据了,一般的,这个detail是使用类似根据country,year得到orders总数或者是相同组合的物品总数的一个聚合函数的计算出来的结果值,我们这里选择打印员工的数量(Detail field:ordered,function:count),点击下一步继续。

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

当点击crosstab的tab页,两个新的属性窗口将会被添加在窗口的左边和右边:一个crosstab的结构树,用来显示crosstab的当前选中单元格和帮助相关信息,一个是crossstab对象列表用来显示和该CrossTab相关的一些variables或fields等,当点击工具条上的启动按钮后,我们将可以看到引擎生成的如下效果的报表:
最后一列包含每一行交叉所有列的总计,最后一行包含每一列交叉所有行的总计。

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

当再次添加一个行分组时,这个crosstab 将会显示出如下效果:

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

点击“row and column groups”的标签页,在这里我们可以看到已经定义好的行或列的分组。

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

所有分组必须有一个唯一的名称,当你添加或修改一个行分组时,你可以设置row group header的宽度。

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

最后,你可以选择是否打印出总计的结果,这些选项是:
None : 没有总计行被打印
Start : 总计行打印在detail行之前
End : 总计行打印在detail行之后
创建column的group 是非常简单的,定义column group 时你可以定义column的高度来替代行高(看下图)

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

再一次,如果打印总计列的话,你可以做一些选择,各选项如下:
None : 没有总计列被打印
Start : 总计列在detail列之前打印
End : 总计列在detail列之后打印
列和行的高度可以很容易的在crosstab编辑器里通过鼠标拖曳表格线的方式改变。

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

iReport为group创建新的header cells是很简单的,这个操作不需要添加任何新的额外元素到crosstab里,你可以根据你的喜好来填充cells,最好的方式是通过拖曳把bucket从crosstab objects列表拖到新的单元格里。


在上图中,你可以看到加在一个新加的嵌套在column group里四个新添加到crosstab里的单元格,group header单元格,group total header单元格,你可以使用”up”和”down”按钮来更改你的group的嵌套顺序。

下图中所示的crosstab就是在图16,14在SEX 的group被向上移后的效果。

16,2,2、单元格 (cells)
每一个行和列的交叉处定义一个单元格,我们有header单元格,total单元格,detail单元格和一个可选的“when-no-data”单元格,单元格可以包含一个类似于textfields,static texts,rectangle,images之类元素的集合,但是他们不能包含一个SubReport, 一个chart,或者一个crosstab,你可以去修改每一个单元格的背景色和单元格的borders:移动鼠标在一个单元格上并且按右键在弹出的菜单中选择“cell properties”打开单元格属性编辑窗口,从这个对话框中你可以修改单元格的外观。

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

“when-no-data”单元格和crosstab元素有相同的尺寸,如果没有数据展示的话它将替代crosstab打印,单元格橙色的边框标志出你可以编辑的单元格区域,可以在这个单元格里添加一个或多个元素,在一个crosstab里,所有的元素关联一个单元格,如果一个元素在单元格外面或部分在单元格外面,这是不正确的放置方式并且当编译的时候jasperreports将会抛出异常,iReport在界面中标识这个错误会以红色的框显示。
16,2,4、度量 (Measures)
在crosstab里每一个元素的表达式(如textfield 表达式)可以包含唯一的measure,在这种情况下,你可以直接使用fields,variables或parameters,一个measure和variable一样是一个对象,要建立一个measure,请打开crosstab属性窗口(在crosstab编辑器上右击,选择crosstab properties)并且到measure标签页。

点击Add按钮,创建一个新的measure,Measure的属性窗口将显示,你最少应该去设置它的name,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接口。

16,2,5、Crosstab element properties
在主设计窗口中双击crosstab元素将打开element properties窗口,点击crosstab标签。

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

16,2,6、交叉表参数 (Crosstab parameters)
你可以使用元素属性窗口里的crosstab parameter表格建立一个crosstab parameter并且设置一个crosstab的parameter同时为其设置一个默认的表达式(图16,22),要添加一个parameter,请点击Add按钮,这个crosstab parameter 窗口将会出现。

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

16,2,7、交叉表数据 (Crosstab data)
你可以用主报表或一个subdataset来填充一个crosstab,在后面的例子中,在crosstab properties窗口“crosstab data”标签里你必须指定要启动的dataset。

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

对于每一个尺寸,jasperreports创建variables根据每一行或列存储measure的合计值,下面的例子是一个用来显示不同学历不同部门的员工数的报表.


同为比较常用的java报表生成工具,FineReport对交叉表的解决方案和实现方法与ireport有所不同,因为本身工具的区别,ireport实现每个功能都需要大量的编码,而finereport则对代码需求量较少,具体实现思路和步骤如下,供ireport使用者借鉴:
交叉报表—数据横向扩展
1, 概述
交叉表,也是常见的基本报表类型,分组报表只是从上到下将数据分组显示,而交叉表则是从上到下、从左到右都将数据分组的报表,如下图:

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

纵表头:地区与销售员默认纵向扩展实现从上到下分组;
横表头:将产品类型与产品设置为从左到右扩展,让产品横向分组,实现横表头;
数据:根据父子格的概念,销量会以销售员为左父格,产品为上父格,自动匹配出销售员与产品对应的销量,预览即可看到上图交叉表,注:此处销售员与产品对应的销量是唯一的,因此,直接将销量拖入单元格即可,另:若销售员与产品对应的销量不唯一,则将销量数据列的显示方式设为汇总-求和,详细请查看数据显示方式。
2,3 保存并发布
保存模板,预览效果如上。
交叉表的累计
1, 问题描述
逐层累计与跨层累计都是纵方向上的累计,也可以横向进行累计,如下图各个销售员每个月订单金额的累计:

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

数据列设置如下:

2,2 横向累计
在C3单元格中,写入公式:=B3 + C3[;B2:-1]:当前月份的金额加上一月累计金额,其中C3[;B2:-1]表示上父格B2扩展出来的上一格(上月)的C3的值。
2,3 保存与预览
保存模板,预览效果如上。
声明 未经许可,请勿转载。
© 2025 VLPOS.com 版权所有 微蓝网 ICP备案号:黑ICP备20003952号-1