ireport教程之交叉表


ireport 教程之交叉表 一个 CrossTabs 是一种在设计的时候既不确定行数和也不确定列数的一种 表格,在运行环境下它会像下面显示的不同年份的一个销售报表一样。 水果/年份 2004 2005 2006 草莓 野生樱桃 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 header cell Column group1 header Column group 1 total header Row group 1 header detail Col group 1 total Row group 1 total header Row group1 total Row group 1 total/column group 1 total 当再次添加一个行分组时,这个 crosstab 将会显示出如下效果: Crosstab header cell Column group1 header Column group 1 total header Row group 1 header Row group 2 header detail Col group 1 total Row group 2 total header Row group 2 total Row group 2 total/column group 1 total Row group 1 total header Row group1 total Row group 1 total/column group 1 total 行和列 (Rows and columns) 一个行或列的分组可能通过 crosstab 的属性窗口来对它进行修改(在 crosstab 编辑器右键菜单里选择 Crosstab properties)。 点击“row and column groups”的标签页。在这里我们可以看到已经定 义好的行或列的分组。 添加一个新的分组请点击名为 Add 的按钮。 所有分组必须有一个唯一的名称。当你添加或修改一个行分组时,你可以设 置 row group header 的宽度。 Column group1 Column group 1 ROWGROUP WIDTH header total header Row group 1 header detail Col group 1 total Row group 1 total header Row group1 total Row group 1 total/column group 1 total “bucket”是分组的标准,它通过一个 java 类来定义。在一个 bucket 表 达式里,你可以使用主报表里所有的 fields/variables/parameters。但是,如 果你选择使用 subdataset 来填充 crosstab,那么必须使用 subdataset 里提供 的 fields/variables/parameters。 一个 header 的单元格增长依赖于它所跨越的行数。你可以选择多个元素放 置在 header 里。 top middle bottom stretch 最后,你可以选择是否打印出总计的结果。这些选项是: None : 没有总计行被打印 Start : 总计行打印在 detail 行之前 End : 总计行打印在 detail 行之后 创建 column 的 group 是非常简单的。定义 column group 时你可以定 义 column 的高度来替代行高(看下图) Column group height Column group1 header Column group 1 total header Row group 1 header detail Col group 1 total Row group 1 total header Row group1 total Row group 1 total/column group 1 total 当 Bucket 在行分组里时,header 的单元格内容的定位相似。但是在这个 用例中, details 可以改变 header 宽度而不是高度。 left center right stretch 再一次,如果打印总计列的话,你可以做一些选择。各选项如下: 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.16 MONTH 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 年每个雇员,每月订单金额。 如下制作一张交叉表: 数据列设置如下: 单元 格 数据 集 数据列 属性 A3 ds1 雇员 ID 居中,其余默认,设置数据字典显示对应 的雇员姓名 B2 ds1 月份 居中,从左到右扩展,其余默认 B3 ds1 应付金 额 居中,汇总-求和,不扩展,其余默认 2.2 横向累计 在 C3 单元格中,写入公式:=B3 + C3[;B2:-1]:当前月份的金额加上一月 累计金额。 其中 C3[;B2:-1]表示上父格 B2 扩展出来的上一格(上月)的 C3 的值。 2.3 保存与预览 保存模板,预览效果如上。
还剩30页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

fineiris

贡献于2015-05-04

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf