156
iReport 用户手册 www.CubeBI.com 立方开源商业智能 1 iReport 用户手册 Cube 立方 — 开源商业智能(BI) www.CubeBI.com

iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

Embed Size (px)

Citation preview

Page 1: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

1

iReport 用户手册

Cube 立方 — 开源商业智能(BI)

www.CubeBI.com

Page 2: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

2

本手册是一本 iReport 的入门教程,从前往后的顺序阅读,您能

一步一步从零开始到学会制作出复杂的报表。

本手册是一本 iReport 使用进阶书,从示例和理论两个方面,讲

解了 iReport 中几乎所有的功能。

本手册是一本 iReport 的工具书,里面包含有许多概念上的详细

参数定义,您可以在需要时查阅它。

立方开源商业智能 http://www.cubebi.com 这里有最流行,最

热门的开源商业智能产品,和详细的教程。

全国最专业的开源商业智能社区,http://bbs.cubebi.com/

如果你是 iReport 的新手,你可以来此提问,找寻答案。

如果你是 iReport 的爱好者,你可以来此交流,与大家一起分享

开源给您带来的快乐。

Page 3: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

3

目 录

1 介绍 (Introduction)...............................................5

2 开始(Getting started).............................................6

2.1 环境要求(Requirements) ......................................6

2.3 下载(Download) ..............................................6

2.4 运行(Run) ...................................................6

3 JasperReports 的基础概念(Basic notions of JasperReports)..........8

3.1 Jasperreorts ................................................8

3.2 报表生命周期(The report life cycle) ........................8

4 报表结构(Report Structure)........................................9

4.1 栏(Bands) ...................................................9

5 报表元素(Report elements)........................................14

6 字体和样式(Fonts and Styles).....................................16

6.1 字体(font) .................................................16

6.2 样式(Styles) ...............................................18

7. 字段,参数,变量(Fields,Parameters,Variable)......................23

7.1 字段(Fields) ...............................................24

7.2 参数(Parameters) ...........................................29

7.3 变量(Variables) ............................................35

8 栏和组(Bands and groups).........................................38

8.1 栏(Bands) ..................................................39

8.2 组(Groups) .................................................40

9 子报表(SubReport)...............................................47

9.1 创建一个子报表(create a SubReport) .........................48

9.2 传递参数(Passage of the parameters) ........................49

9.3 子报表示例(SubReport sample) ..............................51

10 数据源(DataSource)..............................................60

10.1 iReport 中的数据源(DataSource in iReport)..................61

10.2 JDBC 连接(JDBC Connection).................................64

10.3 JRDataSource 接口(The JRDataSource Interface)..............67

10.4 使用 JavaBean 作为数据源(JavaBean set datasource) ..........68

10.5 JREmptyDataSource .........................................73

10.6 HQL 查询和 Hibernate 连接(HQL and Hibernate connection).....74

10.7 如何实现一个新的 JR 数据源(How to implement a new JRDataSource)

...............................................................75

11 国际化(Internationalication)....................................83

11.1 资源文件 (Resource Bundle Base Name) ......................83

11.2 获取本地化字符串 (Retrieval of localized strings) .........86

12 脚本(Scriptlet).................................................87

12.1 JRAbstractScriptlet .......................................87

13 模板 (Template).................................................90

13.1 模板结构 (Template structure) .............................90

Page 4: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

4

13.2 使用自定义模板 (Using a custom template) ..................93

13.3 将模板放置在 jar 文件中 (Put templates in jar files) .......96

14 图表 (Chart)....................................................98

14.1 第一个图表 (First chart) ..................................98

14.2 数据集 (Datasets) ........................................105

14.3 图表属性 (Properties of the charts ) .....................106

15 子数据集 (SubDataset)..........................................107

15.1 创建一个数据集 (Creating a subdataset) ...................107

15.2 运行数据集 (Dataset runs) ................................109

16 CrossTabs......................................................118

16.1 交叉表向导 (Crosstab wizard) .............................118

16.2 列,行,单元格 (Columns,rows,cells) ......................123

16.2.1 行和列 (Rows and columns)...........................124

16.2.2 单元格 (cells)......................................132

16.2.3 特殊单元格 (Special cells)..........................133

16.2.4 度量 (Measures).....................................134

16.2.5 Crosstab element properties.........................135

16.2.6 交叉表参数 (Crosstab parameters)....................137

16.2.7 交叉表数据 (Crosstab data)..........................139

16.2.8 交叉表合计变量 (crosstab total variables)...........140

17 jrxm 文档介绍 (jrxml file introduce) ...........................142

Page 5: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

5

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】

1 介绍 (Introduction)

iReport是一个能够创建复杂报表的开源项目。它100%使用 Java语言编写。

是目前全球最为流行的开源报表设计器。

由于它丰富的图形界面,你能够很快的创建出任何一种你想要的报表。

iReport 是开源报表引擎 JasperReport 的可视化设计工具,Jasperreports 是

用 LGPL license 提交的,因此使用 Jasperreports 时的局限性较小,这就意味

着我们可以在我们的商业软件中不用去购买它的 license 而使用它。

以下是 iReport 一些比较突出的功能:

• 拖拽式,所见即所得的报表编辑器。

• 多样的向导来简化复杂的报表设计任务。

• 超过 30 个排版和格式化工具。

• 报表可转换为 PDF HTML EXCEL FLASH CSV RTF TXT OpenOffice Java2D

JRViewer 等格式。

• 支持所有有效的数据源。如:JDBC,CVS,Hibernate,JavaBean 等

• 用户自定义数据源。

• 无限次数的 撤消/重做。

• 集成脚本(scriptlet)支持。

• 内置图表支持:超过 20 种的图表支持。并可扩展。

• 国际化:集成超过 15 种语言。

• 报表模板与报表库样式管理。

• 源文件的备份

• 文档结构浏览器

Page 6: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

6

2 开始(Getting started)

在本章中我们介绍 iReport 运行时所需要的环境、如何获得 iReport 源码/

安装文件及如何在我们的系统中安装使用它。

2.1 环境要求(Requirements)

iReport 运行时需要 sun java2 SDK 1.5 及以上版本,为了能编译我们的报

表文件我们需要完整的安装 JDK。

2.2 下载(Download)

我们可以从立方开源商业智能(www.CubeBI.com)的网站下载到 iReport 的

最新版本,以及相应的源码。

http://www.cubebi.com/ireport/download/

2.3 运行(Run)

将文件下载到本地解压后,您可以直接双击 iReport.exe 或者 iReport.bat

来运行程序。

Page 7: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

7

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】

Page 8: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

8

3 JasperReports 的基础概念(Basic notions of JasperReports)

3.1 Jasperreorts

iReport 是开源报表软件 JasperReport 的可视化设计工具,Jasperreports

是用 LGPL license 提交的,因此使用 Jasperreports 时的局限性较小,这就意

味着我们可以在我们的商业软件中不用去购买它的 license 而使用它。

【 更多开源商业智能项目 www.CubeBI.com 】

3.2 报表生命周期(The report life cycle)

Jasperreports生成的报表文件的生命周期和一个普通的java类非常相似。

在 java 当中,有一个以.java 为扩展名的源文件,内容按 java 语言的规则去

写,源文件通过编译器编译生成一个.class 文件,当 class 使用的时候,它以

一个实例的形式通过 java 的解释器加载到内存当中。

同样,一个 Jasperreports 报表文件也有一个通过 DTD 定义的 xml 格式的

源文件,当报表生成的时候会把这个 xml 格式的源文件编译成一个 jasper 类型

的文件, jasper 文件可以在我们的应用程序中被加载生成最终的报表。

Page 9: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

9

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】

4 报表结构(Report Structure)

在本章中我们将一起来分析一下报表的结构,看一下报表中每一部分的作

用是什么,以及在生成报表的时候每一部分将产生什么样的效果。

4.1 栏(Bands)

Jasperreports 被垂直分成若干个部分,每一个部分我们叫它为“band”。

每一个 band 在都有自己的特性,在报表生成的时候有些会打印一次,有些会打

印多次。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

图 4.1

接下来我们就对每一种类型的 band 分别进行介绍。

Page 10: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

10

Title Band:title 段只在整个报表的第一页的最上面部分显示,除了第一

页以外,不管报表中共有多少个页面也不会再出现Title band 中的内容。

pageHeader Band:顾名思义,pageHeader 段中的内容将会在整个报表中的

每一个页面中都会出现,显示在位置在页面的上部,如果是报表的第一页,

pageHeader 中的内容将显示在

Title Band 下面,除了第一页以外的其他所有页面中pageHeader 中的内容

将在显示在页面的最上端。

pageFooter Band:显示在所在页面的最下端。

Detail Band: 报表内容段,在这个Band 中设计报表中需要重复出现的内

容,Detail 段中的内容每页都会出现。

columnHeader Band:针对Detail Band 的表头段,一般情况下在这个段中

画报表的表头。

columnFooter Band:针对Detail Band 的表尾段。

Summary Band:表格的合计段,出现在整个报表的最后一页中的Detail band

的后面,一般用来统计报表中某一个或某几个字段的合计值。

为了实际演示各个 band 的生成效果,我们可以在报表中的各个 band 里添

加不同的对象,以测试各个 band 的作用。

从 DoradoSample 里的 hsql 数据库的 employee 里的数据,在 query editor

里输入下面的语句:select top 10 * from employee

Page 11: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

11

图 4.2

在报表中的各个 band 分别放置如下内容:

图 4.3

启动报表,生成的效果如下:

Page 12: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

12

图 4.4 生成的报表第一页

Page 13: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

13

图 4.5 生成的报表第二页,也是最后一页

Page 14: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

14

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】

5 报表元素(Report elements)

在本章中我们将要解释可以在报表中使用的对象及他们的相关属性。

我们所说的元素主要是一些图形对象,比如 text,rectangle 等。在 iReport

中没有段落,表格或分页的概念,在 JasperReports 中最基本的对象主要有七

个:

【 更多开源商业智能项目 www.CubeBI.com 】

-Line

-Rectangle

-Ellipse

-Static text

-Text field

-Image

-Subreport

-Crosstab

-Chart

通过以上这些组件的组合我们可以做出各种各样复杂的报表样式。iReport

提供两种特殊的图形对象:chart 和 barcode。

每一种类型的对象都有一些通用的属性,如高度、宽度、位置、所在的 band

等。除此之外还有一些针对不同元素的特殊属性。

每一个元素都必须在一个 band 内部,如果一个元素跨了一个以上的 band,

那么在编译的时候将会抛出元素位置错误的异常。

要添加一个元素到报表中,我们可以从主工具栏中选择相应的工具,然后

添加到报表区域中即可。

Page 15: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

15

图 5.1

我们可以通过双击对象或右键菜单打开元素的属性设置窗口。

图 5.2

属性窗口由若干个标签页构成,“Common”标签里包含每一个组件都具有的

通用属性,其它的标签页是针对不同元素的属性设置。在下面的章节中,我们

将对每一个对象的使用做详细的介绍。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

Page 16: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

16

6 字体和样式(Fonts and Styles)

一个 style 是一个预定义的属性的集合用来控制元素的外观(比如背景色、

边框线、字体等)。我们可以为我们的报表定义一个默认的 style。

要为一个元素应用一个 style,我们可以选择该元素并从元素的属性窗口

common 标签里的 style 列表选择你需要的 style。

Fonts 是用来描述 text 的外观特征。在 JasperReports 里你可以为每一个

元素指定字体属性。此外,你可以定义一个名为“Report font”的全局字体。

【 开源商业智能社区 http://bbs.CubeBI.com 】

6.1 字体(font)

通常定义一个字体,我们需要做下面几件事情:

-Font name(字体名称)

-Font dimension(字体大小)

-Attribute(属性,诸如 bold-faced,italics,underlined,barred)

如果我们需要导出 PDF 格式的报表,JasperReports 需要为字体添加下面的

信息:

PDF Font Name:PDF 字体名称(预先定义 PDF 字体或一个在 classpath 里

的 TIF 文件的名称)。

PDF Embedded:当使用一个外部的 TTF 类别的字体文件生成报表时是否把

它包含在 PDF 文件里的一个标志。

PDF Encoding:指定一个字体编码名称。

如果我们需要将报表导出成 PDF 格式,将会使用指定的 PDF 字体,其它属

性将会被忽略掉。

如果我们使用扩展的 TTF(True Type Font),那么扩展的字体文件(以.ttf

结尾的文件名)必须放置在 classpath 当中。

Page 17: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

17

图 6.1

在“Font name”下拉框中,仅显示的是 java 虚拟机管理的系统默认字体,因

此,如果要选择一个扩展的 TTF 字体在非 PDF 格式报表中,那么我们首先需要

在使用之前在系统中把这些字体安装好。

图 6.2

Page 18: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

18

上面的字体列表中显示是的内置的 PDF 字体集合,如果直接去编辑下拉框

里的字体但这些字体在设计时候不可用,如果字体文件在启动的时候找不到,

那将会产生一些错误。

如果我们选择的字体是一个扩展的 TTF 格式字体,要保证在导出 PDF 格式

时显示正确,请勾选“PDF Embedded”复选框。

在JasperReport中如果要导出PDF格式报表选择正确的字体编码至关重要。

Encoding指定字体如何被编译。举个例子,如果使用意大利语,要打印正确的重

音符(比如:è, ò, a, ù)我们必须使用CP1252编码格式。

iReport 在下拉框里有一些预定义的编码格式。当报表导出 PDF 时包含一些

非标准的字符时,要保证所有的 fields 都有相同的编码格式并且检查从数据库

里读出的数据采用的字符集格式。

【更多开源商业智能教程 www.CubeBI.com】

6.2 样式(Styles)

我们可以选择主菜单的“FormatStyles” 来定义一个 style。如下图所

示:

图 6.3

点击“New”按钮添加一个新的 style。在弹出的窗口中我们可以定义一些

属性,如果我们需要某个属性的值,我们可以点击 按钮来实现。

Page 19: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

19

图 6.4

在每个元素属性窗口的“Common”标签里有一个 style 属性下拉框,如果

我们需要为一个元素设置一个 style,我们可以在这个下拉框里选择我们定义

好的 style,这样就可以把一个 style 应用到一个元素上面啦。

Page 20: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

20

图 6.5

从 JasperReports1.2 开始,我们可以为一个 Style 加一个动态的条件,当

条件满足的时候采用某个 style,否则就采用默认的 style。举个例子,还是以

doradosample 里的 hsql 数据库里的 employee 表为例,如果员工的薪水大于

3500,我们让薪水以红色加粗的字体显示。

打开 Query 窗口,输入下面的查询 SQL:

Select * from employee

【 开源商业智能社区 http://bbs.CubeBI.com 】

Page 21: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

21

图 6.6

新建一个 style,在弹出窗口的 style conditions 里新建一个 conditions,

在表达式窗口里输入下面的表达式:

($F{SALARY}.intValue()>3500?new Boolean(true):new Boolean(false))

如下图:

Page 22: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

22

图 6.7

【 更多开源商业智能项目 www.CubeBI.com 】

新建的 style 如下图:

图 6.8

接下来把员工姓名和员工薪水拖到报表当中,并将我们新建的 style 应用

到薪水这个 field 上,如下图:

图 6.9

Page 23: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

23

启动查看运行效果如下:

图 6.10

7. 字段,参数,变量(Fields,Parameters,Variable)

在 jasperreport 中 有 三 种 类 型 的 对 像 可 以 用 来 保 存 数

据 :Fields/Parameters/Variables. 这 三 种 对 象 可 以 用 在 某 些 地 方 的

Expression 中,通过一定的逻辑在报表生成的时候动态的更改某些值。

Fields/Parameters/Variables 有类型的概念,它们的类型就是一个标准的

Java 的 Object。要使用这三种类型的对象我们必须首先创建它,创建的方法是

点击“View”主菜单中,选择其中的子菜单 Fields,Variables,Parameters 我

们可以创建不同的对象。通过这三个子菜单我们可以查看并管理

Fields,Variables,Parameters 对象。

Page 24: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

24

图 1.1

通过该窗口,我们可以创建,修改,删除这三种类型对象。

【 开源商业智能社区 http://bbs.CubeBI.com 】

7.1 字段(Fields)

Field 在 JasperReports 是专门用来组织记录。Field 的创建有多种途径可

以实现,我们可以根据在 jasperreports 中各种类型的数据源来创建我们所需

要的 Field。

在图 1.1 中的 Fields 标签页中,我们可以点击 new 按钮来创建一个新的

Field。

Page 25: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

25

图 1.2

一个 Field 有两个必填的属性: name、type 和一个可选项的 description。

从 JasperReports1.0.0 开始,fields 可以是任何 Java 数据类型。这样当我们

使用 JavaBean 作为数据源时我们可以很方便的从 java.lang.Object 向报表中

的 Field 的转换工作。在对象的 Expression 里你可以使用下面的语法来引用一

个 field:

${field name}

例如如果你想处理 com.bstek.test.domain.Person Bean 里的 username 字段,

可以这样去写:

((com.bstek.test.domain.Person)${username})

【 更多开源商业智能项目 www.CubeBI.com 】

用一个 SQL query 来创建 Field

在 jasperreports 的设计中使用 SQL query 的方式来创建或记录字段的是

使用最广泛的也是最直接最简单的一种方式。做此操作我们需要首先打开

ReportQueryDialog窗口(点击主工具栏的 按钮), ReportQueryDialog窗口出

现后,我们可以输入合适的 SQL 检索并创建 Fields。

Page 26: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

26

图 1.3

在打开 ReportQueryDialog 窗口之前请先确认我们已经有一个数据源连接

处于激活状态(激活方式请查看相关章节),插入一条查询语句,如:select *

form employee

iReport 将启动 SQL 查询引擎,根据输入的 SQL 将分析结果用 fields 的形式展

示出来。在下面的窗口中选择你要的 fields(可以多选)然后点击 OK 按钮,

fields 就被创建出来了。

在这个例子当中所有字段有多程类型,一般地说,fields 的数据类型是构建在

原始 SQL 类型基础之上的,如 String,Integer…

【 中文 iReport 首页 http://ireport.CubeBI.com 】

用 JavaBean 生成 Fields

JasperReports的高级特性之一是它的数据源除了可以构建在SQL query基

础之上外,还可以使用含有 getter 和 setter 方法的 JavaBean(或者叫 POJO)

对象来创建。在这个例子中 fields 就是 POJO 类里的属性(或者是属性的属性,

即子对象的属性)。

Page 27: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

27

选择 JavaBean Datasource 标签,通过该窗口你可以指定 POJO 来创建

fields。如下图:

Page 28: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

28

图 1.4

点击“Read attributes”按钮,你可以浏览这个对象,可以看到这个对象

的直接属性嵌套的对象(子对象),双击里面的子对象你可以查看子对象的属

性。

要把一个属性添加到 field 列表,只需选中需要的属性然后点击“Add

field(s)”按钮。如果要把一个field作为一个文本打印,可以直接把一个field

拖到 report 的 band 里或者在 report 的 band 里添加一个 textfield 然后设置

它的 expression(把一个 field 放在 expression 里)和 textfield 的类型,如

果需要还可以为一个要打印的 field 定义一个 pattern(模式)用来对 field 内

容进行格式化。

Page 29: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

29

图 1.5

7.2 参数(Parameters)

Parameters 通常是用来在打印的时候从程序里传值到报表里.也就是说

parameters 通常的是起参数传递的作用。他们可以被用在一些特定的场合(比

如应用中SQL 查询的条件),和 report中任何一个需要从外部传入的变量等(如

一个 Image 对象所包括的 char 或报表 title 的字符串)。

【 开源商业智能社区 http://bbs.CubeBI.com 】

和使用 Fields 一样,parameters 也需要在创建的时候定义它的数据类

型.parameters 的数据类型是标准的 java 的 Object。

Page 30: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

30

图 1.6

在 JasperReports中 Parameters的机制是允许用户通过应用程序传递参数

致报表当中。在 jasperreort 中的某个对象中的 expression 可以通过下面的语

法来访问一个当前 report 中存在的 parameter:

$P{parameter name}

如果应用程序没有为报表中定义的 parameter 赋值,那么 parameter 将会取我

们在定义它的时候设置的default value的值。parameters是一个Java Object,

所以如果它的类型是 Object 类型,我们在其 default value 里写下面的表达式

就是错误的:

0.123

你必须要创建一个 Object,如:

New Double(0.123)

这种写法就是正确的。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

在查询中使用 Parameters

Parameters可以用来做SQL查询的条件参数的传递.如果你想根据部门编号

(dept_id)得到客户的详细信息 (设计的时候我们是不知道这个部门编号的具

Page 31: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

31

体值是多少的).此时我们可以这样组织查询语句:

select * from employee where dept_id=$P{deptId}

此时 SQL查询引擎将会采用 PreparedStatement 来处理传入的 deptId 值以

此作为查询条件参数。

如果你想直接通过parameter 值来作为SQL语句的一部门,那么你可以使用

下面的特殊语法:$P!{parameter name}。这种写法允许你在查询时用 parameter

的值来替换 parameter name。例如,如果我们有一个参数名为 MyWhere 其值

为:where dept_id=D11 ,查询写法如下:

Select * from employee $P!{MyWhere}

查询时实际提交的字符串是:

Select * from employee where dept_id=D11

在程序里使用 Parameters

在应用程序里如果想把某个值传递到我们的报表中 parameters 时,我们可

以把相关的值放入一个扩展 java.util.Map 接头类里,然后传入到 report 里。

如下面的代码:

...

Map hm = new HashMap();

...

JasperPrint print = JasperFillManager.fillReport(fileName,hm,new

JREmptyDataSource());

fillReport 是一个关键的方法,它允许你通过一个文件名,一个参数集来传

递到我们要调用的报表当中。例如通过下面的处理方法我们可以让一个处部的

传入值作为我们报表的 title。

a).声明一个 parameter.这个 parameter 是 java.lang.String 类型,名字

为:name_report:

Page 32: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

32

图 1.6

b.将这个 parameter 拖到 page 中的 title band.修改上面的程序代码如下:

HashMap hm = new HashMap();

hm.put(“name_report”,”report title”);

...

JasperPrint print = JasperFillManager.fillReport(fileName,hm,

new JREmptyDataSource());

Page 33: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

33

图 1.7

运行时效果如下:

图 1.8

一般情况下,我们不需要为报表中的每一个 parameters 传递一个值,除非

Page 34: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

34

某一个 parameter 一定要从处部程序传入时我们才需为一个 parameter 设置一

个值。如果一个 parameter 外部门程序没有为其赋值那么 JasperReports 将使

用 Default Value Expression 来对一个 parameter 进行初始化,如果连 Default

Value Expression 没有设置那么它的值就是 null。

事 实 上 , 对 于 一 个 parameters 我 们 不 仅 仅 可 以 传 递 一 个

String,Integer,Boolean等java中小的对象,同时我们还可以利用parameters

来传递一些足够大足够复杂的对象,比如一个图像(java.awt.Image),或者通

过一个 parameters 来为一个为子报表提供的 datasource 连接等。在用 Map 类

型传递参数时我们要注意传递的参数要与 report 里的 parameters 类型保持一

致,否则会抛出 ClassCastException。

【 开源商业智能社区 http://bbs.CubeBI.com 】

JasperReports 内嵌的 Parameters

JasperReports 提供了一些内建的 parameters,这些 parameters 对于用户

来说是只读的。内嵌的 parameters 列表如下:

参数名 说明

REPORT_PARAMETERS_MAP 它是一个 java.util.Map 类型的对象,可以通过它来

传给填充报表去填充报表里所有的 parameters,在

这个参数里还包含用户定义的 parameters.

REPORT_CONNECTION 一个 JDBC 的 Connection 参数,报表可以根据传入的

JDBC Connection 来获到相应的数据

REPORT_DATASOURCE 为报表中的 Connection 提供一个 DataSource。外部

传入的时候类型也要是 DataSource 类型

REPORT_SCRIPTLET 报表生成时使用的 Scriptlet 实例,如果没有指定

ScriptLet , 那 么 这 个 parameters 将 使 用

net.sf.jasperreports.engine.JRDefaultScriptle

t.

IS_IGNORE_PAGINATION 通过这个参数你可以控制分页功能是打开还是关闭。

默认情况下,分页是打开的。但是如果导出为 HTML

Page 35: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

35

或 EXCEL 时不进行分页处理。

REPORT_LOCALE 它被用来设置报表所处的地区。如果没有提供地区,

那么将采用系统默认的地区。

REPORT_TIME_ZONE 设置报表的时区,如果没提供的话采用系统默认的。

REPORT_RESOURCE_BOUNDL

E

为报表指定要加载的资源文件,在国际化一章中介绍

了如何使用资源文件来构建报表。

7.3 变量(Variables)

Variables 是用来存储对某些字段计算后的结果,比如 sum 等。

图 1.9

Page 36: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

36

和 fields,parameters 一样,Variables 也是有数据类型的。你必须为一个

Variable 实例声明一个 java 类型。图 1.9 显示了如何创建一个新的 Variable。

看一下每个字段的意思:

Variable name: variable 的名称,我们可以在表达式中通过下面的方法来引

用一个 Variable:

$V{variable name}

Variable Class Type : variable 也可以是任意一个 Java 类型,在下拉框里

你可以看到大多数常用的类型,如 java.lang.String 等。

Calculation Type : 一个计算类型可以用来计算结果。当一个预先定义的值是

“nothing”时,那它的意思是不做任何计算。Jasperreports 会根据指定的计

算类型和从数据源中获取的每一条记录计算出结果,然后去更改 variables 的

值。做一个变量的计算意为着去执行一个表达式,如果计算类型为 nothing,

那么 jasperreports 将会根据 variable expression 为 variable 赋值。计算类

型列举如下:

类型 说明

Nothing 不做任何计算

Count 对记录集数量进行循环累加(计算有多

少条记录),这和 sum 不一样,sum 的计

算是针对数字的,会对数字进行累加操

作。

Distinct Count 也是对计算有多少条记录的累加操作,

只是在累加过程中会忽略已经出现的

记录(比如某个字段的值已经出现后就

不会再记录)

Sum 添加每一次表达式(这里的表达式只能

Page 37: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

37

是数字类型)迭代的结果到变量中

Average 它用算术的方法来计算表达式累加结

果的平均值

Lowest 返回表达式最小值

Highest 返回表达式最大值

StandardDeviation 根据表达式所有值返回标准方差

Variance 返回表达式接收到的值的变化

System 不做任何计算并且表达式也是没有价

值的,在这样的用例中,报表引擎仅仅

保存内存中 variable 的最后的值。

Reset Type : 重置类型。表示一个变量在什么时候做重置操作。reset 类型如

下:

类型名称 说明

None 任何时候都不做重置操作

Report 在报表创建的时候 Variable 才会对表

达式进行初始化

Page Variable 的初始化在每一页都做一次

reset 操作

Column Variable 的初始化在每一列都做一次

reset 操作(这里的 Column 指的是

report 里的 page 的 column,每个报表

的 column 可 以 通 过 报 表 的

Editreport properties 窗口进行修

改)

Group Variable 的初始化在每一个组都做一

次 reset 操作

Page 38: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

38

Reset Group :如果 group reset type 被勾选,这里就要选择 group 名称(关于

group 可以参考后面的章节)。

Increment : 它指定当一个 variable 值被评估或当你想要这个组采用类似于

subtotals 或 averages 来计算,increment 类型可以参考下面的表。

Increment Group : 如果这个 group 的 increment type 被勾选它将指定这个

组决定 variable 的 increment。

Custom Incrementer Factory Class : 指定一个实现了 JRIncrementerFactory

接口的 java 类名称,通常用来定义一些诸如 sum 之类的非数字类型的操作。

Variable Expression : 它是一个 java 的 expression,用来标识 variable 每

一次迭代的值。

Initial Value Expression : 它是一个为 variable 初始化时采用的

expression.

【 开源商业智能社区 http://bbs.CubeBI.com 】

内置的 variables

和 parameters 一样,JasperReports 提供了一些内置的 variables(这些由报表

引擎直接管理),这些变量是只读的,不能被用户修改,如下表所示:

Variable 名称 说明

PAGE_NUMBER 它包含当前页的页。

COLUMN_NUMBER 它包含当前的列数。

REPORT_COUNT 当前的记录数目

PAGE_COUNT 当前的页号

COLUMN_COUNT 当前的列号

<group name>_COUNT 在<group name>里的记录总数

8 栏和组(Bands and groups)

在本章中,我们将解释如何用 iReports 去管理 bands 和 groups,在第四章中

我们介绍了报表的结构,在本章中我们将要看到如何使用 bands 来划分报表。

Page 39: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

39

同时我们还将看到如何使用 groups,如何创建 report 中的 breaks,如何管理

subtotals 等等。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

8.1 栏(Bands)

JasperReports 把一个报表划分成七个主要的 bands 和一个名为 backgroup 的

band(一共是八个 bands),每当我们添加一个 group 时就会有两个新的 band 添

加到报表当中:group footer bands 和 group header bands。

点击 按钮在弹出的窗口中我们可以对当前报表所具有的bands的进行相关属

性的修改。

图 8.1

通过上图中的窗口,我们可以修改左边列表窗口中的任何一个band的属性,

比如它的高(以像素为单位)。Print When expression 表示我们可以在这里输

入一个表达式,这样我们可以根据表达式的值来控制当前的这个 band 是否输

出 。 这 里 需 要 注 意 的 是 Print When expression 里 必 须 返 回 一 个

java.lang.Boolean 类型的对象,如:

Page 40: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

40

New Boolean(true)

上面的表达式说明这个bands总会被打印(如果我们什么都不输入这个就是

默认值),在表达式里可以使用 fields,variables,parameters。根据这个特性

我们可以通过相关的fields,variables,parameters来灵活的控制当前的band

是否可以输出,比如下面的代码:

($F{SALARY}.intValue()>4000?new Boolean(true):new Boolean(false))

上面的代码说明当 salary 的值如果大于 4000 就输出当前的 band 否则就不

输出当前的 band。

把鼠标移到bands的边上我们可以鼠标拖拉的方式改变band的大小以此来

适配 band 里的内容。

图 8.2

8.2 组(Groups)

Groups 允许我们对报表里的数据进行全新的切割分组组合。分组是通过一

个表达式来定义的,Jasperreports 会通过这个表达式进行计算分组情况,每一

个新的组都是从我们在expression value里输入的表达式发生变化的时候开始

的。接下来我们将通过一个例子的演示一步一步说明如何使用 groups。

假设我们有一个员工的列表,我们想要创建一个根据员工所在的部门进行

分组的报表。

a)首先我们打开一个新的报表文件,然后点击 DataConnection/Data

Page 41: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

41

Sources,选择 JDBC Connection,我们创建一个 JDBC 的 Connection,如下图:

【 更多开源商业智能项目 www.CubeBI.com 】

图 8.3

注:该数据库为 dorado(dorado 为 bstek 公司的 j2ee 表现层中间件产品,其网

址:http://www.bstek.com)里的 doradosample 工程里的 hsql 数据库。

b)点击和工具栏里的 按钮,输入查询语句,如下图

Page 42: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

42

图 8.4

c)把Employee_name和dept_id两个field拖到report 中的detail的band

里,同时调整 detail band 的高度,如下图:

Page 43: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

43

图 8.5

d)保存报表文件,并按 浏览报表生成后的效果,如下图:

图 8.6

到这里,我们看到员工的数据已经可以在报表里显示,接下来我们就对员

工信息按 dept_id 字段进行分组显示。

e)点击主工具栏里的 按钮,打开 groups 定义窗口,并添加一个新的名为

dept 的 group,如下图:

Page 44: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

44

图 8.7

一个 group 有下面几个属性需要我们去定义:

Group name:为这个 group 指定一个名称,group 创建完成后会产生两个新

的 band : header 和 footer band,这两个 band 的名称采用 group 的名称来定

义。

Start on a new column:如果此选项勾选,那么分组只会在报表中的新的

column 产生,也就是说在一页中报表分组在一个 column 里只会做一次。

Start on a new page:与上面的选项类似,如果该选项勾选,那么分组只

会在每一页做一次,也就是说每一页最多只会有一个分组数据。

Reset page number:该选项允许在一个新组开始的时候重设页号。

Print header on each page:如果该选项勾选,那么如果当前页没能显示

完组里的所有数据时,到一页显示该数据时会把该组的 header 打印出来,否则

将不会打印。

Min height to start new page:该选项用来设置当前报表中页面所余下的

高度的最小值分组的最小值,默认值是 0,如果我们设置为 100,表示如果当前

页面余下的高度小于 100 就不再继续显示分组的数据,而是在下一页显示分组

的数据。

Group expression : 分组时采用的表达式规则,如上图中我们在定义 dept

Page 45: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

45

这个 group 时我们在 Group Expression 里输入了$F{DEPT_ID},表示将该组按

员工的 DEPT_ID 字段进行分组显示。

Group header band height:新产生的 header band 的高度。

Group footer band height:新产生的 footer band 的高度。

【 开源商业智能社区 http://bbs.CubeBI.com 】

f)接下来我们把在 detail band 里的 dept_id 的 field 移到 report 里新产

生的 deptHeader 的 band 里,

图 8.8

g)点击 按钮,报表的生成效果如下:

Page 46: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

46

图 8.9

在 jasperreport 里 group 的数量是没有限制的,一个 group 可以有一个父

group 同时也可以有若干个子 group。通过 group 定义列表,我们可以通过”move

up”和”move down”来设置 group 的顺序。

Group 向导

在 iReport 中还有一种简单的方法创建一个 group,那就是向导,通过向导

我们可以快速的创建一个 group,我们可以通过主菜单中的 Editnew report

group wizard 来启动创建 group 的向导。

Page 47: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

47

图 8.10

向导允许用户创建最多有四个 group 的报表(group header,group footer

和每一个 group 关联)。

Groups 和 records 的排序

默认情况下,jasperreport 不能对来自数据源的数据进行排序,因此我们

在创建一个 group 时要对分组的字段做好正确的排序工作。比如在 sql 中我们

可以添加“order by ”来对要分组的字段进行排序。

9 子报表(SubReport)

SubReport 是 jasperreports 提供的高级功能,通过 SubReport 我们可以创

建复杂的报表。通过 SubReport 我们可以创建一个包含若干个子报表的报表。

创建一个包含子报表的报表我们需要三个对象:一个 jasper 文件,一个包含参

数 map(当然可以为空)和一个 DataSource(数据源,或者是一个 JDBC 的

Page 48: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

48

Connection)。在本章中我们将解释如何通过这三个对象创建一个 SubReport 并

实现在子报表中数据过滤显示的目的。

【 开源商业智能社区 http://bbs.CubeBI.com 】

9.1 创建一个子报表(create a SubReport)

一个 SubReport 是一个真正的包含它自己 xml 文件并且是一个已经编译好

的 jasper 文件。创建一个 SubReport 就是创建一个普通的报表文件,创建过程

中唯一需要注意的是设置 SubReport 的宽度、高度及一些不需要显示的 band,

一般情况下对于不显示的 band 我们把它们的高度都设置为 0。在设置子报表的

宽度时我们应该考虑到它在父报表中显示时的效果,然后针对这一特性有针对

性的去设置。

在父报表中我们要添加一个子报表可以通过 iReport 中的 SubReport 工具

来实现。子报表的形状和一个距形类似,我们可以调整 SubReport 的尺寸和

位置以控制子报表的显示。

将一个子报表链接到父报表中需要做三件事情:获得 SubReport 所对应的

jasper 报表对象、如何为它提供数据及如何为子报表的 parameters 设置具体

的值。所有这些信息的定义我们可以通过 SubReport properties 窗口来实现。

图 9.1

Page 49: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

49

图 9.2

9.2 传递参数(Passage of the parameters)

当我们在应用程序里通过 fillReport 方法来生成一个报表的时候,我们会

提供一个包含参数值的 Map 一起传递到报表中,包含参数的 Map 对象是由报表

引擎直接管理的。在子报表属性窗口的里的“SubReport”标签里的“Parameters

Map Expression”属性就是提供给我们的最简单的方法来为子报表设置

parameters 的值,它允许我们定义一个最终可以返回 java.util.Map 对象的表

达式,使用这种方法我们可以把从外部应用程序传到父报表里的 parameter 对

象,当然这个 parameter 的实际值是一个 java.util.Map 对象传递给子报表使

用 ( 比 如 $P{TestMap} ), 这 里 我 们 也 可 以 使 用 内 建 的 报 表

parameters:$P{REPORT_PARAMETES_MAP}把子报表中的 java.util.Map 对象传

递到父报表中供使用。如果该属性我们空着不填那么一个不包含任何值的空的

java.util.Map 将会被传到子报表中。这种机制的局限性是 parameters 里所对

应的 java.util.Map 值是死的、不会变的。为了克服这种局限性 jasperreport

允许我们定义 parameter 键值对的时候每个对象的值通过一个表达式来创建,

如在图 9.2 中的“SubReport Parameter”表中通过添加个参数 java.util.Map

来填充子报表。

Page 50: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

50

图 9.3

deptId 是子报表中一个 parameter 的名称,如果设置值时也要与子报表中

deptId 的数据类型保持一致。

指定数据源

为子报表指定数据源就是告诉 jasperreport 引擎如何获到数据来填充

SubReport。我们可以指定两种类型的数据源:JDBC Connection 和 DataSource。

使用 JDBC 来填充报表是很简单的,在 Connection Expression 里定义一个

已经连接到数据库的 java.sql.Connection 对象。要把一个已经处于打开状态

下的连接传到 SubReport 中我们只需使用一个预定义的包含一个基于从应用程

序里调用 fillReport 方法时的传入的连接 REPORT_CONNECTION 参数

如果使用一个 DataSource 就稍微复杂一点,事实上它是一个简单的记录的

集合,记录集合的概念和 JDBC Connection 不同,既然如此我们可以通过一个

parameter 来传递一个 DataSource 来填充 SubReport,此时采用这种机制内建

的 parameter REPORT_CONNECTION 就不再起作用了。

一个 DataSource 是一个普通的“消费品”对象仅仅可用来填充一次报表。

所以一个作 parameter 传递的 DataSource 可以满足一个 SubReport 的需要。因

此 parameter 的方式不能满足当父报表的每一行记录都有一些子报表的数据与

之对应(除非主报表中只有一条记录)。当我们解释 DataSource 时我们可以看

到这个问题可以通过自定义 DataSource 方式解决。

指定 SubReport

Page 51: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

51

创建一个 SubReport 我们需要指定一个扩展名为.jasper 文件,我们需要在

SubReport 属性窗口中设置 SubReport Expression 属性。表达式返回的类型必

须与我们在下拉框里选择的类似保持一致,类型列表如下:

类型名称 含义

net.sf.jasperreports.engine.JasperReport 在一个 JasperReport 对象里预

加载一个 jasper 文件

Java.io.InputStream 一个 jasper 文件的流

Java.net URL 一个用来定义 jasper 文件的

URL

Java.io.File 一个 jasper 文件的 File 对象

Java.lang.String Jasper 文件的文件名

如果表达式是一个 String 类型,那么引擎将通过 JRLoad 来加载指定位置

的 jasper 文件。

9.3 子报表示例(SubReport sample)

在这个例子中我们将采用 doradosample 里的数据库来创建一个简单的包

含子报表的报表。我们要从两张表里取数据:dept(部门表)、employee(员工表),

要达到的效果是根据部门表的部门 ID 取出该部门下的所有员工。类似的效果的

报表我们在 groups 一章中使用 group 也实现了一次,这里我们将用 SubReport

来实现相同的效果。

新建一个空报表,新建一个名为 deptId 的 parameter 对象,如下图:

Page 52: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

52

图 9.4

在这里我们在 Default Value Expression 里赋予了一个空的字符串,为什

么要这样做呢,因为接下来我们要使用该 parameter 来作为 SQL 的查询条件的

输入值,所以我们要对这个参数赋予一个初始化的值。

点击 打开 SQL 查询引擎窗口,输入下面的查询语句:

Select * from employee where dept_id=$P{deptId}

在这里,我们在查询员工信息的时候加了一个部门的条件,如下图:

Page 53: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

53

图 9.5

此时如果我们把相关的 field 拖到 detail band 里,然后点击 我们发现

没有任何记录,原因是因为我们并没有为 deptId 赋值。

保存报表文件,我们命名为 emp.jrxml,我们把这个报表文件作为下面将要

引用的子报表文件。因为它将作为子报表被引用,所以我们需要调整该报表的

不用显示的 band 的高度及 detail band 的高度,如下图:

图 9.10

在 detail band 里我们放置了三个字段:employee_name(员工姓名)、sex(性

别)、birthday(出生日期)。

接下来我们需要建立一个父报表,关闭 emp.jrxml 文件,新建一个空的报

表文件,命名为 dept.jrxml。点击主工具栏里 打开 SQL 查询窗口,输入下面

的语句:

Select * from dept

Page 54: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

54

如下图:

图 9.11

把 dept_name这个field拖动到报表的detail band里,同时在detail band

里添加一个了报表,在弹出的子报表向导中我们选择“Cancel”按钮,这里我

们不采用向导来创建 SubReport。如下图

图 9.12

双击子报表图标打开子报表属性设置窗口,在弹出的窗口中我们选择

“SubReport”标签,在“Connection/DataSource Expression”属性里我们选

Page 55: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

55

择 “ Use Connection Expression ” 并 且 指 定 内 建 的 parameter :

REPORT_CONNECTION 作为表达式用来存储 JDBC 连接,如下图:

图 9.13

【 开源商业智能社区 http://bbs.CubeBI.com 】

切换到“Subreport(other)”标签窗口,指定如何找到子报表文件

“emp.jasper”以及如何创建和修改在子报表与父报表之间的参数传递。

使用绝对路径在 iReport 里我们不用去考虑子报表文件是否可以被找到的

问题,因为子报表存放的目录已经被自动的加到 iReport 的 classpath 里了。

这 里 我 们 指 定 的 值 是 “ $P{SUBREPORT_DIR}

+java.io.File.separator+"emp.jasper"”

Page 56: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

56

图 9.14

为了在子报表里可以显示员工的信息我们需要为子报表的 deptId 这个

parameter 赋值,这里我们通过父报表传过去,在“Subreport parameters”

窗口中,我们添加了一个用于为子报表的 deptId 赋值的 parameter,该值到于

父报表中的$F{DEPT_ID}这个 field。编译子报表和父报表。

点击主工具栏中的 按钮,查看生成的后父报表效果。

Page 57: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

57

图 9.15

在这里我们看到子报表里的有一些字段显示的有问题(如 sex 性别这块显

示的是 true 和 false,还是日期不是我们要的日期格式),需要我们进一步对

显示的字段信息进行格式化操作。

打开 emp.jrxml 文件,选中 detail band 里的 sex field,右键选择

properties,在弹出的窗口作如下修改:

图 9.16

在 Text Field Expression 里我们输入($F{SEX}.booleanValue()?"男":"

女")的意思是把原来显示的 true 和 false 翻译成男和女。这里$F{SEX}是

java.lang.Boolean 类型,所以需要先把它转化成 java.lang.Boolean 所对应

的简单类型,然后如果值为 true 则为男,否则为女。对于 birthday(出生日期)

我们同样需要对其做格式化操作,如下图:

Page 58: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

58

图 9.17

关闭 emp.jrxml(关闭之前别忘记对其进行编译)。打开父报表 dept.jrxml

文件,编译查看报表效果:

图表 9.18

Return Parameters

有时候我们需要从子报表里返回一些值到子报里,比如子报里有多少条记

Page 59: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

59

录等。

Jasperreport1.0.0 提供的一个新的特性就是允许用户从子报表中返回值

到父报表中,如下图,在“Subreport (other)”标签下的“Subreport return

values”标签里设置我们需要在父报表里显示子报表里的参数值。

图 19.19

SubReport Wizard

从前面的操作中我们可以看出,当我们插入一个 SubReport 时会自动弹出

向导窗口,通过这个向导窗口我们可以快速创建一个 SubReport 对象,创建过

程非常简单,我们这里就不再介绍。

Page 60: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

60

10 数据源(DataSource)

一个 DataSource 是 Jasperreport 获取数据以生成报表的源。这里有两种

类型的 DataSource:一种是 JDBC Connection 用来从关系型数据库里取数据;

另外一种是扩展了 JRDataSource 接口的 java object,这种类型的对象允许我

们去管理数据的细节,比如一个 xml 文件或一个 javabean 的集合。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

通过 sql 查询从关系型数据库里取数据来填充生成报表是很简单的,

iReport 可以通过各个数据库厂商提供的 JDBC Driver 来获取连接生成要检索

的 field。

如果我们不通过 JDBC 直接访问数据库来获到生成报表的字段与数据的时

候 , 我 们 需 要 使 用 JRDataSource( 全 称 JasperReport Data

Source).JRDataSource 是一个接口,它允许我们访问具有行列结构的数据(在

Datasource 行我们叫 records,列我们叫 record fields).

不管是 JDBC Connection 还是 JRDataSource 他们都不能通过 JasperReport

来创建,但是当应用程序调用生成报表的时候我们可以通过 JasperReports 的

fillReport方法传递一个打开的数据库连接(一个java.sql.Connection对象)

或者是一个 JRDataSource 对象实例用于填充被调用的报表.对于传递一个

java.sql.Connection 对象的情形 JasperReports 将在指定的报表里使用 JDBC

Connection 来 执行一 个 SQL 查 询 .查 询 的 结 果 将 会 被 包 含 在 一 个

JRResultSetDataSource 对 象 里 (JRResultSetDataSource 也 是 一 个

JRDataSource 对象的实例),这样 JasperReports 将使用一个 JRDataSource 对

象来关联打印数据。

在本章中,我们将阐述 JRDataSource 的不同类型和他们如何在 iReport 中

使用。此外我们还将看到如何对一个 JRDataSource 做扩展;通常通过扩展一个

datasource 可以克服 JsperREports 自身的一些局限性,比如在交叉报表中使

用等。

【 开源商业智能社区 http://bbs.CubeBI.com 】

Page 61: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

61

10.1 iReport 中的数据源(DataSource in iReport)

iReport 允许我们管理和配置不同类型的 DataSources 用来填充报表。这些

DataSources 被储存在 iReport 配置文件中当我们需要的时候即可以使用。

我们可以使用的 DataSources 类型如下:

- JDBC Connection

- XML DataSource

- JavaBean Collection DataSource

- CSV DataSource

- Custom DataSource

- JRDataSourceProvider

- Hibernate DataSource

打开状态的 JDBC Connection 在报表生成的时候会被直接传递到

JasperReport 中。XML DataSource 允许我们从 XML 文档里获取数据用来填

充报表。一个 CSV DataSource 允许我们打开一个 CSV 文件来填充报表。

JavaBean Collection DataSource , Custom DataSource 和

JRDataSourceProvider 他们允许我们一个写好的 java 类来获取数据。

Hibernate DataSource 定义了一个执行 HQL 语言的方法。DataSource 的管

理我们可以通过在主菜单“DataConnections/DataSources”(图 10.1)

打开配置管理 DataSource 窗口界面。

Page 62: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

62

图 10.1

从技术的角度去看一个 Connection 和一个 DataSource 是两个不同的对象

(Connection 需要一个关系一个关系型数据库,但是一个 DataSource 只是提

供一个简单的接口用来访问数据结构)。

虽然我们可以建立了若干个 DataSource 准备使用,但是 iReport 在工作时

同一时候总是使用一个 DataSource 或一个 connection。因此你需要设置一个

“active”datasource。设置一个 dataSource 为“active”最简单的方法是在

工具条上的下拉框里选择一个你要使用的 datasource,那么这个 datasource

就处于“active”状态了。

图 10.2

同时你也可以从主菜单里的“DataSet the active connection”在弹出

的窗口中选择一个 DataSource 并设置其为“active”状态。

Page 63: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

63

图 10.3

最后我们还可以在 DataSource 窗口里通过“set default”来设置“active”

状态的 DataSource。

图 10.4

如果没有 datasource 处理“active”处于激活状态,那么 iReport 里生成的报

表里面将不会产生数据。同时当我们使用报表向导的时候要求必须要有一个处

于“active”状态的 JDBC Connection。

Page 64: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

64

10.2 JDBC 连接(JDBC Connection)

一个 JDBC Connection 允许我们从一个关系型数据库里直接获取数据(需

要有一个 JDBC Driver)。要添加一个新的 JDBC Connection,可以点击“New”

按钮(如图 10.1)打开创建新连接的管理窗口。

图 10.5

选择“Database JDBC Connection”点击“Next”,在出现的窗口中输入数据源

的名称及 Driver、URL、username,password 等相关信息。

Page 65: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

65

图 10.6

点击“test”按钮,对 JDBC 连接做测试。

【 更多开源商业智能项目 www.CubeBI.com 】

Page 66: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

66

图 10.7

完成新建 JDBC Connection 之后,别忘了在管理窗口中设置 Connection 的

“active”状态。

当报表采用的是一个 JDBC Connection 创建的时候,用户需要指定一个 SQL

语句用来从数据库里取出数据。主报表的 Connection 也可以为其子报表提供服

务。例如,JasperReport 里的 REPORT_CONNECTION,一个 java.sqlConnection

类型的内建参数对象放在表达式里提供给子报表使用。

$P{REPORT_CONNECTION}

这个参数包含的是一个正确的从应用程序里传入的 java.sql.Connection

对象。使用 JDBC 或一个 SQL Connection 是一种最简单的最容易的方式用来填

充报表,关于创建 SQL 查询的细节我们将在 11 章中讲解。

为了可以在报表中使用通过 SQL 查询出来的 fields,我们需要“Register”

它们(要注册的可能不是全部是字段,仅仅只是我们在报表中要使用的字段)。

对于每一个字段我们需要指定一个名称和字段的类型,下表中显示了 SQL 类型

所对应的 Java 类型。

Page 67: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

67

SQL 类型 JAVA 类型

CHAR String

VARCHAR String

LONGVARCHAR String

NUMERIC Java.math.BigDecimal

DECIMAL Java.math.BigDecimal

BIT Boolean

INTYING Integer

SMALLINT Integer

INTEGER Integer

BINARY Byte[]

VARBINARY Byte[]

LONGVARBINARY Byte[]

DATE Java.sql.Date

TIME Java.sql.Time

TIMESTAMP Java.sql.Timestamp

表 10.1

在上面的表当中对于 BLOG 和 CLOB 类型和其它的特殊类型如 ARRAY、

STRUCT,REF 等我们没有指定对应的 JAVA 类型,这是因为这些类型在

JasperReports 里不能自动管理它们。

10.3 JRDataSource 接口(The JRDataSource Interface)

除了使用 SQL 做为数据源之外,我们还可以使用其它类型的数据源。在使

用之前,我们需要明白如何使用 JRDataSource 接口。对于实现每一个

JRDataSource 接口的类必须实现两个方法:

Public Boolean next()

Page 68: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

68

Public Object getFieldValue(JRField jrField)

对于第一个方法是用来移动一个虚拟的游标到下一条记录,判断是否还有

记录。如果 Next 方法返回 true 表示还有记录否则表示已经没有记录了。

当 JasperReports 执行 next 方法时,在报表里声明的所有字段将被赋上相

应的值并且所有的表达式重新计算它的值,接下来将决定是否在一个新的group

里打印 header,是否开始一新的页等。当 next 方法返回 false 时,报表的内

容也就宣告结束同时开始打印所有的最后的 bands(group footer,column

footer,last page footer 和 summary)。很多时候需要调用 next 方法用来取

下一条记录。

当 JasperReports 调用完成 next 方法后如果返回 true 的时候就调用

getFieldValue 方法。事实上报表里的每一个 field 在取值的时候都会调用

getFieldValue 方 法 ( 查 看 第七 章 看如何 声 明 一个 报 表的 field) 。

getFieldValue 方法返回数据的类型必须与声明的字段类型相匹配,当然如果

返回一个 null 除外。

10.4 使用 JavaBean 作为数据源(JavaBean set datasource)

在 DataSource里面我们还可以使用一些JavaBean做为数据源来填充数据,

这里的 JavaBean 指的是一个 POJO,里面 private 类型的若干个属性和与之对

应的 getter 方法:

Public <returnType> getXXX()

这里的<returnType>(返回值)是一个普通的java类或一个简单类型如int、

double 等。

要创建这种类型的 connection 我们只需在创建的时候选择“JavaBeans set

data source”

Page 69: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

69

图 10.8

点击“Next”输入“JavaBeans set data source”的名称,JavaBean set

datasource 使用一个扩展类(一个工厂类)来生成我们所需要的 JavaBean 对

象,然后组合成数据传递到报表当中。输入包含包名的 java class 名称,它需

要有一个static方法产生一个包含若干个javaBean的 Collection类型或一个

array(Object[])类型。让我们来看看如何去写这个工厂类。

假如你的数据是一个 Person 对象,它包含两个 fields:name 和 age:

public class Person {

private String name;

private int age;

public Person(String name, int age) {

super();

this.name = name;

this.age = age;

}

Page 70: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

70

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

接下来我们要写我们的工厂类,我们这里的工厂类名为 TestFactory

public class TestFactory {

public static java.util.Collection generateCollection(){

java.util.List list =new java.util.ArrayList();

for (int i = 0; i < 10; i++) {

Person p=new Person("user"+i,i);

list.add(p);

}

return list;

}

}

我们的 DataSource 提供了一个包含 10 个 Person 类型的 JavaBean。使用

JavaBean作为DataSource的特点是它的字段必须通过getter方法暴露在外面,

意思是如果我们的 JavaBean 有一个 getXyz 方法,那么 xyz 就是一条记录的

field,在我们的例子中我们的是 name 和 age。创建一个新的创建文件,然后

添加两个名为 name 和 age 的字段:

Page 71: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

71

图 10.9

接下来把这两个字段拖到报表 detail 当中。

图 10.10

将前面我们做的两个类添加到iReport中的classpath当中。添加一个JavaBean

set data source,名为 TestBeanDataSource,并将其设置为“active”,如下

图:

Page 72: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

72

图 10.11

启动生成报表效果如下:

Page 73: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

73

图 10.12

10.5 JREmptyDataSource

在 JasperReports 中 提 供 了 一 个 名 为 JREmptyDataSource 特 殊 的

DataSource,这个 DataSource 是当我们点击 按钮生成报表时调用。这个

DataSource 的 next 方法会根据记录的数量返回 true,同时每次调用

getFieldValue 方法时总是返回 null 值。这种操作有些类似于一些记录没有字

段一样,这就是一个空的 DataSource。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

该项类有两个构造方法:

Public JREmptyDataSource(int count)

Public JREmptyDataSource()

第一个构造方法让我们告诉这个 DataSource 该返回多少条记录,第二个构

造方法会把记录的总数设置为一。

当我们点击 按钮生成报表时我们可以按住 shift 键来设置报表里产生的

Page 74: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

74

空记录数。如下图:

图 10.13

10.6 HQL 查询和 Hibernate 连接(HQL and Hibernate connection)

从 jasperreports1.2 版开始,Jasperreports 提供了一种直接使用

HQL(Hibernate Query Language)来创建报表。要使用这个功能,首先我们需要

设置一个 Hibernate connection。把所有的 JAVA 编译好的类,jar 包和使用

Hibernate mapping 的配置文件放在 classpath 里。换句话说,iReport 必须要

保证可以访问所有的你需要使用的*.hbm.xml 文件。

把 这 些 对 象 添 加 到 classpath 中 的 方 法 是 , 选 择 主 菜 单 中 的

ToolsClasspath,在弹出的窗口中设置你需要加入到 classpath 中的对象。

接下来我们需要打开 DataSource 对话框,点击“New”新建一个 DataSource,

不过这时我们选择 Hibernate connection 作为我们的 DataSource 类别。点击

“Next”输入 connection 的名称。再次点击“Next”进入下上步设置,如下图:

Page 75: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

75

图 10.14

在点击“test”按钮时要保证 hibernate.cfg.xml 在你的 classpath 里。

同时设置这个“test hibernate”为 active 状态。此时 iReport 仅使用

Hibernate Configuration 工作。

从主菜单中的 ViewReport query 里打开查询窗口,在 Query language

里我们选择 Hibernate Query Language(HQL),然后输入相应的 HQL,接下来的

工作就像使用 SQL 一样啦。

10.7 如何实现一个新的 JR 数据源(How to implement a new JRDataSource)

有时使用 Jasperreports 所内置的 JRDataSource 不能完全满足我们的要

求。此时我们可能需要写一个自己的新的 JRDataSource。自定义一个

Page 76: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

76

JRDataSource 并不复杂,事实上创建一个自定义的 JRDataSource 就是实现

JRDataSource 接口类,重写里面的 next 和 getFieldValue 方法就 OK 啦。

Package net.sf.jasperreports.engine

Public interface JRDataSource{

Public Boolean next() throws JRException;

Public Object getFieldValue(JRField jrField) throws JRException;

}

这里的 next 方法是用来把记录移动到下一条,同时判断还有没有记录。如

果返回 true 表示还有记录可用,否则表示没有可用记录了。

当 next 方法调用时,getFieldValue 方法将会返回请求字段的值(如果请求

的字段没找到或不存在,那么将返回 null)。一般来说,请求字段名会作为参

数包含在 JRField 对象里。JRField 是一个接口对象,通过它我们可以得到三

种信息:字段名称,描述,和字段类型。

接下来我们就来写一个我们自己的 DataSource。我们的这个 DataSource 要

实现对一个目录进行浏览并返回里面的文件或文件夹。DataSource 的 field 有

以下几方面:文件名(fileName),一个标志位(isDir)用来表示它是一个文

件还是一个文件夹,文件大小(size)。

我们的 DataSource 有两个构造方法,一个构造方法有一个参数可以用来接

收要扫描目录;一个就是没有参数的构造方法(那么将采用默认的目录进行扫

描)。

我们这个 DataSource 将会根据指定的目录查询文件和文件夹,并且以一个

文件数组的形提供出来。

package test;

import java.io.File;

import net.sf.jasperreports.engine.JRDataSource;

import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JRField;

Page 77: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

77

public class JRFileSystemDataSource implements JRDataSource{

File[] fileArray;

int index=-1;

public JRFileSystemDataSource(String path){

File f=new File(path);

if(f.exists() && f.isDirectory()){

fileArray=f.listFiles();

}

}

public JRFileSystemDataSource(){

this(".");

}

public Object getFieldValue(JRField arg0) throws JRException {

File f=fileArray[index];

if(f==null)return null;

if(arg0.getName().equals("fileName")){

return f.getName();

}else if(arg0.getName().equals("isDir")){

return new Boolean(f.isDirectory());

}else if(arg0.getName().equals("size")){

return new Long(f.length());

}else{

return null;

}

}

public boolean next() throws JRException {

boolean flag=false;

index++;

if(fileArray!=null && index<fileArray.length){

flag=true;

}

return flag;

}

}

到这里我们自定义的一个 JRDataSource 已经完成了,接下来我们将会来解

释如何在报表中使用我们自己的的 DataSource。

为了使用这个 DataSource,接下来我们需要编写一个 JavaBean set

DataSource,这个和我们前面写过的很像,代码如下:

Page 78: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

78

package test;

import net.sf.jasperreports.engine.JRDataSource;

public class TestFileSystemDataSource {

public static JRDataSource getFileSystemData(){

return new JRFileSystemDataSource("d:/doc");

}

}

这 个 类 中 的 static 方 法 将 会 被 调 用 , 执 行 并 产 生 一 个 新 的

JRFileSystemDataSource 对象,同时指定该对象里的文件夹路径为“d:/doc”

目录。

接下来我们可以新建一个 connection,创建时我们选择“Custom

JRDataSource”类型,并设置它的名称为“Test FileSystemDataSource”,如

下图:

Page 79: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

79

图 14.5

接 下 来 我 们 需 要 在 页 面 中 新 建 三 个 field , 分 别 是

fileName(String),isDir(Boolean),size(Long),并将他们拖到报表的 detail

band 中,如下图:

Page 80: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

80

图 14.6

运行报表,生成效果如下:

图 14.7

【 开源商业智能社区 http://bbs.CubeBI.com 】

对于这种生成的格式,为了美观期间我们可以对其进行格式化。把“目录/

文件”拿掉,通过在“文件名”列前面加图片的方式来显示该文件是文件还是

文件夹。

在 detail 里,在 fileName 列前加一个 image 对象,并在其 Expression 里

Page 81: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

81

加上如下代码:

($F{isDir}.booleanValue()?"D:\\iReport-2.0.1\\report

test\\folder.gif":"D:\\iReport-2.0.1\\report test\\file.gif")

该句话的含义是:如果 isDir 返回的为 true 则输入文件夹图片,否则输入

文件图片,如下图:

图 14.8

设置报表的列数为 2,报表排版如下:

图 14.9

Page 82: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

82

启动报表,生成的效果如下:

图 14.10

Page 83: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

83

11 国际化(Internationalication)

国际化是从 JasperReports0.6.2 开始提供的功能。国际化意味着报表可以

根据不同的地区显示不同的语言文字。报表所要显示的不同的语言文字是存储

在资源文件里。在本章中我们将介绍怎样使用内置函数 msg()来处理国际化问

题。

11.1 资源文件 (Resource Bundle Base Name)

当我们想让一个报表实现国际化功能时,我们需要定位所资源文件里的名

称字符串,就是 label 或者叫 key,key 与 value 是一对字符串,中间用“=”

连接。如:

Title_username=用户名

Title_phone=电话号码

保存这些 key 与 value 对的文件以“.properties”为后缀。在运行期间,

报表引擎将会在 classpath 里查找以“.properties”结尾的资源文件。如果文

件找到了,那么就从文件里读取相应的资源信息。资源文件的指定是通过报表

属性窗口的“i18n”来实现的。

一般来说,一个资源文件名的组成包括三个部分:一个是资源文件名,一

个是国家地区代码(与文件名之间以“_”连接),最后就是文件的扩展名

“.properties”。对于默认的资源文件名来说是没有国家地区代码的。完整的

资源文件的格式如下:

<resource bundle base name>[_language code[_country code[_other

code]]].properties

比如:

I18nReport_fr_CA_UNIX.properties

I18nReport_zh_CN.properties

Page 84: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

84

I18nReport_en.properties

I18nReport.properties

前面格式里提到的“other code”(比如上面的“_UNIX”)一般不去指定它。

在 iReport 中,它有能力自己去管理资源文件,资源文件我们需要把它和

报表文件(jrxml 文件)放在同一目录,并且资源文件的名称也要与报表文件的

名称保持一致。

我们可以从主菜单的“EditInternationalication”的“Localization

files”打开资源文件管理窗口。如下图:

图 11.1

我们可以通过“Create New Locale”按钮创建一个新的资源文件。

Page 85: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

85

图 11.2

创建时我们需要指定文件名及国家代码,创建完成之后我可以通过“Modify

file”按钮来对资源文件的内容做相应的修改。

图 11.3

Page 86: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

86

11.2 获取本地化字符串 (Retrieval of localized strings)

得到资源文件里的 key 所对应的 vlaue 我们可以通过下面的方法实现:一

种是使用 JasperReports 内部的表达式 str(“key name”),或者是使用表达

式$R{key name}:

$R{test.name}

【 开源商业智能社区 http://bbs.CubeBI.com 】

在 JasperReport 中的国际化我们可以使用函数 msg,通过使用 msg 函数我

们可以对取到的国际化的值做相应的格式化处理。比如我们的资源文件中一个

key/value 对为:

title=my name is {0}

此时我们需要为{0}指定具体的值,通过使用 msg 函数我们可以对这里的{0}进

行填值处理:

msg($R{title},"gaojie")

这样在报表生成后最终的值就是:my name is gaojie

我们有三种方式来使用 msg 函数:

Public String msg(String pattern,Object arg0)

Public String msg(String pattern,Object arg0, Object arg1)

Public String msg(String pattern,Object arg0, Object arg1, Object arg2)

在 iReport 中我们可以指定所在地区,这样我们就可以控制显示的语言。

点击主菜单“Buildset report local or BuildSet time zone”,在弹出

的窗口中我们可以对地区做相应的修改。

Page 87: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

87

12 脚本(Scriptlet)

Scriptlet是一个java class用来在报表生成的时候执行特定的动作(比如

新页开始的时候或者处理结束的时候)。在本章当中我们将要看如何写一个简单

的 Scriptlet 以及如何在报表里使用它们。

【 更多开源商业智能项目 www.CubeBI.com 】

12.1 JRAbstractScriptlet

要 写 一 个 scriptlet 我 们 只 需 扩 展 java 类

net.sf.jaspererports.engine.JRAbstractScriptlet。在该类中可以触发报表

生成的时候,数据产生的时候的事件,同时我们可以访问报表中的所有的

variables,fields,parameters。

最简单的scriptlet实现类是jasperreports提供的JRDefaultScriptlet:

package net.sf.jasperreports.engine;

public class JRDefaultScriptlet extends JRAbstractScriptlet

{

public JRDefaultScriptlet() { }

public void beforeReportInit() throws JRScriptletException

{}

public void afterReportInit() throws JRScriptletException

{}

public void beforePageInit() throws JRScriptletException

{}

public void afterPageInit() throws JRScriptletException

{}

public void beforeColumnInit() throws JRScriptletException

{}

Page 88: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

88

public void afterColumnInit() throws JRScriptletException

{}

public void beforeGroupInit(String groupName) throws

JRScriptletException

{}

public void afterGroupInit(String groupName) throws

JRScriptletException

{}

public void beforeDetailEval() throws JRScriptletException

{}

public void afterDetailEval() throws JRScriptletException

{}

}

就像我们看到的那样,该是一系列的 after 和 before 组成的方法,这些方

法代表着不同类型事件的触发。

事件/方法 描述

Before Report Init 当报表初始化的之前时候调用该方法

After Report Init 当所有的的variables初始化之前的时

候触发该方法

Before Page Init 当产生一新页的时候,所有 variables

初始化之前调用

After Page Init 当产生新页时,所有的 variable 初始

化之后调用

Before Column Init 当产生一个新的 column 时,在所有的

variables 的 resetType 为“columns”

时初始化之前调用

After Column Init 当产生一个新的 column 时,在所有的

variables 的 resetType 为“columns”

时初始化之后调用

Before Group<x> init 当 group x 调用的时候,并且所有的

variables 的 resetType 为“group”,

group x 初始化之前调用

Page 89: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

89

After Group<x> init 当 group x 调用的时候,并且所有的

variables 的 resetType 为“group”,

group x 初始化之后调用

Before Detail Eval 在 detail band 打印的时候之前调用

After Detail Eval 在 detail band 打印的时候之后调用

在 Scriptlet 内部我们可以使用下面的 Map 得到所有的 fields,variables

和 parameters,这些 Map 是:fieldsMap,variablesMap 和 ParametersMap。

Page 90: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

90

13 模板 (Template)

在 iReport 中最有用的工具之一是使用向导利用 templates 来创建报表,

在本章里我们将解释如何创建一个自定义的templates,如何把它们添加到我们

的模版库里。

13.1 模板结构 (Template structure)

一个模版文件就是一个普通的 jrxml 文件。当使用向导创建一个新报表时

选择的模版文件将会被加载同时会对用户输入地方做相应修改。

有两种类型的模版:columnar 和 tabular。columnar 是一种用一个静态的

text 显示 field name 同时用一个 textfields 显示 field 的值的竖排的记录报

表(如图 13.1)。

图 13.1 Columnar template

而 Tabular 类型将会像下图这样显示所有记录(图 13.2)

Page 91: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

91

【 中文 iReport 首页 http://ireport.CubeBI.com 】

图 13.2 tabular type

模版是一些放在 iReport 安装目录下 templates 目录里的 jrxml 文件。

iReport 根据文件的名称来决定它是 columnar 类型还是 tabular 类型的模版。

如果文件名以T结尾,那么它将作为一个 tabular 类型的模版。如果它是以C

结尾的话它将会被做为 columnar 类型模版。下面是 iReport 提供的模版列表:

File Report type

classiC.xml Columnar report

classicT.xml Tabular report

Classic_landscapeT.xml Tabular report

graycC.xml Columnar report

grayT.xml Tabular report

Gray_landscapeT.xml Tabular report

表 13.1 iReport 提供的报表模版

Page 92: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

92

我们打开 classicC.xml 文件,查看之后我们可以明白一个模版的结构。在

这个文件里你可以发现四个组:group1,group2,group3,group4,title band

和 group footer 可见,columns band 不可见(因为对于 columnar 类型的报表

columns band 没有用)。在 detail band 里有一些为将来每一个 field 准备的

静态的 text label 作为模版的 label(如图 13.1),textfield 是一个真正的

field。在 particular 里每一个 group 可以通过 n 包含一个图形元素和一些静

态 text 元素:

GnLabel

这里的 n代表 group 的编号,textfield 元素包含下面指定的表达式:

GnField

这个元素将包含使用 group 表达式的值。

图 13.3 Columnar template

Detail 部分至少要包含像下面一样的一个静态文本:

DetailLabel

同时一个 textfield 元素用下面的表达式:

DetailField

其它的 bands 可以包含任何元素。在这些 bands 中将会在使用模版时生成。

表格类型的报表模版的设计和上面很相似,图 13.4 是 classicT.xml 在窗口里

显示时的情形。

同样,有四个 group,在它们之前有一个 column header,它需插入一个静态的

字符串作为 columns labels。

Page 93: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

93

在 detail band 区域,仅仅只有一个 DetailField 元素将被作为所有列的一个

列名标签。

图 13.4

模版是不能编译的,这是因为在 textfield 里包含的表达式不是一个合法的

java 表达式。

13.2 使用自定义模板 (Using a custom template)

下面我们就来看一下怎么创建和使用一个模版。最简单的方法是打开一个

已经存在的模版,选择一个最接近我们想要的模版的类型,然后按我们想要的

对其进行修改,对存在的元素进行修改添加新的元素或者删除不需要的元素

图 13.5

为了使用模版,我们必须把改好的模版入到 templates 目录里。记住使

Page 94: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

94

用.xml 作为扩展名,在图 13.5 的例子中我们命名为 mytemplateT.xml。添加 C

或 T字母到模版的扩展名之前表示模版的类别。

以上工作完成后,我们可以通过向导来创建一个新的报表。在模版选择处

我们可以看到新的我们刚才添加的报表模版在模版列表当中(图 13.6)。

图 13.6

这里,你应该可以看到我们自定义的模版没有预览图可用,要想让我们自定

义的模版关联到一个预览图可以在templates文件夹里放上一个150x150的gif

图片(在这个例子当中我们用的图片名叫: mytemplateT.gif).

Page 95: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

95

图 13.7

图 13.7 中显示了在向导窗口中当我们选择我们自定义的模版时出现的预览图。

使用模版可以帮助我们提高开发报表的效率。通过使用我们自己的模版,我们

创建的报表生成的效果如下:

图 13.8

Page 96: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

96

13.3 将模板放置在 jar 文件中 (Put templates in jar files)

我们知道模版文件都是放置在模版目录里面的。这样的话当 iReport 访问

远程文件系统时可能会带来一个问题,当发展到 0.5 版本的时候我们可以把模

版文件放到 jar包里去,每一个 jar可以包含一个或多个模版和一个在 ireport

目录下的名为 template.xml 的模版描述文件。当报表向导执行时,iReport 将

要查找所有的在 classpath 下的可用的名为/ireport/templates.xml 文件。

为了了解如何使用一个 jar 提供一个模版,我们来创建一个基于名为

Classic Template Resource 模版的例子。

Template.xml 的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<iReportTemplateSet>

<iReportTemplate name="Classic Template Resource" type="Columnar">

<XmlFile>/it/businesslogic/ireport/templates/classic.xml</XmlFile>

<IconFile>/it/businesslogic/ireport/templates/classic.gif</IconFile>

</iReportTemplate>

</iReportTemplateSet>

Template.xml 定义了一个模版的集合,每一个模版我们都可以定义它的名字,

类型(columnar 或者 Tabular),和图标。

这个 jrxml 和图标用“/”开始指定,我们 jar 里的内部目录树可能类似于下面

这种。

template_sample.jar

├───ireport

├───it

│ └───businesslogic

│ └───ireport

│ └───templates

└───META-INF

【 开源商业智能社区 http://bbs.CubeBI.com 】

Template.xml 将要被放到 ireport 目录下,同时所有的其它文件(如这个例子

中 的 classic.xmlt 和 classic.gif ) 将 会 被 放 到

Page 97: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

97

/it/businesslogic/ireport/templates 目录下。

把创建好的 jar 放到 classpath 里,这时即使在模版目录里没有它我们也可以

使用啦。

Page 98: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

98

14 图表 (Chart)

从 5.1 版本开始,iReport 里的 chart 作为一个新的功能已经被完全重写。

为了支持这个功能,jasperreports 使用 jfreechart 的最后版本,jfreechart

是一个强大的 chart 生成工具。

创建 chart 的机制是建立在 dataset 的概念之上的,而非 iReport 前一版

本的 data series。这就使得数据的管理和对更多复杂图表类型如 High Low 之

类实现可视化。

Jasperreports 最后版本的 chart 有很多新的功能。有更多的 chart 的类型可

提供使用。Jasperreports 现在支持 Pie,Pie 3D,Bar,Bar 3D,XY Bar,Stacked

Bar,Stacked Bar 3D,Line,XY Line,Area,XY Area,Scatter Plot,Bubble,Time

Series,High Low Open Close 和 Candlestick 多种类型图表。

14.1 第一个图表 (First chart)

在这一章节里我们将来学习如何使用 chart 工具一步一步在一个报表里创

建一个 Pie3D 的 chart。在这个例子中我们将使用 doradosample 里的数据库作

为数据源。

建立一个空白的文档,点击 打开查询窗口并且写下如下查询语句:

select degree,count(*) employeeCount from employee group by

degree

Page 99: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

99

图 14.1 报表的查询窗口

这里我们想生成一个 chart 用来显示根据学历员工数目。点击 OK 确认,

iReport 将注册查询得到的 fields。同时把这些 fields 从 objects library 里

拖出放入 detail 的 band 里(图 14.1)。

图 14.2

Page 100: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

100

选择 chart tool 在 summary 里放置一个新的 chart。

图 14.3

从 charts 窗口里我们选择 pie3D 图标并按 OK 按钮。请查看图 14.3。

要配置 chart,双击 chart 打开属性窗口,同时你可以通过右键菜单的方式打

开 chart 的属性窗口。

图 14.4

【 更多开源商业智能项目 www.CubeBI.com 】

Page 101: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

101

图 14.5

点击“Edit chart properties”按钮出现的 chart 属性窗口。

Page 102: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

102

图 14.6

这个窗口包含两个标签:“Chart properties”和“Chart Data”。第一个

标签包含控件的 parameters 列表;第二个标签是用来决定和当前图片关联的数

据。修改图形的不同样式,设置背景的 alpha 和前景的 alpha 为 0.5 和 depth

factor(深度因子)为 0.2。

下一步定义和图形关联的 data。切换到“Chart Data”标签。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

Page 103: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

103

图 14.7

在“Type of dataset”列表框中允许你指定一个 dataset 用来生成图形。

在“dataset”标签里你可以在报表的上下文里指定一个 dataset。Reset type

和 Reset group 允许你对 dataset 进行重置。

为了我们的需要,我们设置 Reset type 为“Report”当我们不想数据被重

置时。同时我们设置 Increment type 为 None,这样每一条记录都将被附加到

我们的 dataset 里。

在 Detail 标签里允许你键入一个表达式和每一个在 datasource 里单独的值关

联。针对 Pie 图表类型,有三个表达式需要我们输入:Key,Value 和 Label。

表达式Key允许你标识Pie图里的一块。如果Key的值出现重复,那么Label

和 Value 的值会关联起来用来覆盖 Key 的值。一个 Key 值不能为 null。Value

Page 104: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

104

的表达式值指定这个 Key 的数字值。

Label 表达式的值允许你为并图中每一块指定一个标签。这个表达式的值是

可选的,同时默认值为“<key>=<value>”,例如:“A=100”,A是并图中一个块

的 Key 同时 100 是它的值。

图 14.8

确认对 chart 的修改,保存文件并且点击 按钮启动报表。在图 14.9 里我们

可以看到最后的效果。

Page 105: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

105

图 14.9

14.2 数据集 (Datasets)

当报表生成的时候 chart 会去收集数据然后存储在相关的 dataset 里。

Dataset 类型有:

Pie

Category

Time period

Time series

XY

XYZ

High-Low

可以把 dataset 想成是一个表格,每一个 dataset 都有不同的列(fields)。

当一条新记录插入到 dataset 里时值将会被添加到 fields 里。

在图 14.7 中演示了在 jasperreports 中如何从 dataset 里取得数据你可以

选择的一些选项。特别地,如果 dataset 必须为空的话同时当添加一行新的记

录到 dataset 里时你可以指明它。根据你选择的 dataset 类型,在“Chart data”

标签里显示指定的 dataset 的 fields。

Page 106: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

106

14.3 图表属性 (Properties of the charts )

我们可以通过图 14.5 显示的窗口来管理 chart 的外观。在这个窗口里你可以查

看并编辑 charts 和 graphs 的通用属性(如 title,图例等)。

你可以使用表达式编辑框来更改 Chart title 和 Chart subtitle 表达式

图 14.10

JasperReports 只是利用了 JFreeChart 图表库的一小部分功能。如果你想

自定义一个图表你可以写一个实现下面的接口的类:

Net.sf.jasperreports.engine.JRChartCustomizer

从这个接口中我们只需要实现一个方法:

Public void customize(JFreeChart chart,JRChart jasperChart);

在这个方法里用 JFreeChart 和 JRChart 作为它的参数。JFreeChart 作为第一

个参数通常是用来产生图片的,第二个参数包含用户在设计阶段一些参数。

【 更多开源商业智能项目 www.CubeBI.com 】

Page 107: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

107

15 子数据集 (SubDataset)

报表的生成是基于一个 data source(一个查询,一个 java 的 collection

或者一个 xml)。当你想要处理一个 chart 或一个 crosstab 时,这时可能上面

的 data source 就不行了。一个 subdataset 可用来在报表里提供另外一种记

录集。你可能会使用一个 subdataset 用来填充一个 chart 或一个 crosstab。

在一个报表里你可以有任意多个 subdatasets。

一个 subdataset 可以有它自己的 fields,variables,parameters,同时如果需

要它还可以执行一个查询。Dataset 里的记录可以像主报表一样进行一次或多

次分组。在组里可以使用 subdataset 的 variables。一个 subdataset 通过一

个叫“dataset run”的选项和一个 chart 或一个 crosstab 关联。

【 开源商业智能社区 http://bbs.CubeBI.com 】

15.1 创建一个数据集 (Creating a subdataset)

要创建一个新的 subdataset,可以在工程 library 里右键选择“add-sub

dataset”方式完成。

Page 108: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

108

图 15.1

Subdataset 的创建窗口打开。

图 15.2

这里你需要设置 subdataset 的名称,同时你也可以使用该 subdataset 合

适的“when resource missing type”指定一个 resource bundle(查看关于

资源文件的国际化章节)。

Jasperreports 允许使用 scriptlet 在一个 subdataset 的 records 里执行一个

特殊的计算。如果你需要你可以指定一个你的 scriptlet 类的名称。点击

“create”按钮把这个 subdataset 添加到报表当中。

你可以在library标签里或者在subdataset列表对话框里查看刚才新建的

subdataset (主菜单中 Edit->sub dataset)

Page 109: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

109

图 15.3

图 15.4

你可以使用和在主报表中相同的方法添加fields,variables和parametres

到你的 subdataset 里。 Subdataset 窗口里的“Query”按钮可以打开查询工

具用来指定一个查询(像在主报表里一样),你可以用一个查询或一个其它的数

据源(如 javabean 等)来反向得到字段。

15.2 运行数据集 (Dataset runs)

你可以在一个chart里或一个crosstab里使用subdataset。JasperReports

Page 110: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

110

需要一些扩展信息诸如 jdbc connection 执行 sql 查询或者为一个指定的

subdataset 的 parameter 用来填充 dataset。所有这些信息的提供者是一个

dataset run。

图 15.5

Dataset 的工作方式与在主报表中引用一个 SubReport 类似。你可以使用

表达式(里面可以包含主报表里的对象,如:fields,variables,parameters)

为指定的 subdataset 的 parameters 设置值。在启动运行时可以定义一个

parameters Map 来为 subdataset parameters 填充值,同时还可以定义一个连

接或一个 datasource 在 subdataset 获取数据时使用。

实例

Page 111: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

111

在这个例子中我们将演示如何使用一个 subdataset 去填充一个 chart。

在主报表中只有一条统计所有记录总数的记录(select count(*) as

employeeCount from employee)

第一步,创建一个新的空白报表

图 15.6 第一步,创建一个新的空白报表

【 中文 iReport 首页 http://ireport.CubeBI.com 】

第二步,打开查询工具( )同时插入下面的 sql 语句:

Select count(*) as employeeCount from employee

Page 112: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

112

图 15.7

第二步,插入查询语句

第三步,从 library 标签里拖动字段 employeeCount 到 detail band 如下图添

加一个 labels

图 15.8 添加字段 employeeCount

第四步,创建 subdataset

在 library 里右键选择弹出菜单选择 Add->sub Dataset,我们创建一个名为

Page 113: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

113

subdataset1 的 subdataset。

图 15.9 创建一个新的 subdataset

第五步,在 subdataset 的对话框里点击“Query”按钮,我们键入如下语句:

select degree, count(*) as empCount from employee group by

degree

Page 114: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

114

图 15.10 定义 subdataset 的查询语句

【 更多开源商业智能项目 www.CubeBI.com 】

第六步,添加 pie3d chart 到报表里

图 15.11 创建一个 chart

第七步,编辑 chart 属性

打开 chart 属性编辑窗口我们来编辑一下 chart 的相关数据,选择

subdataset1 作为它的 subdataset。切换到“Connection/Datasource exp”标

签同时从下拉框里选择“use connection expression”。这里我们使用主报表

里的 connection 来填充 subdataset($P{REPORT_CONNECTION}) 。

Page 115: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

115

图 15.12 设置 chart 属性

第八步,设置 Pie Dataset 的属性

切换到“Detail”标签,我们输入下面的表达式:

Key expression: $F{DEGREE}

Value expression : $F{EMPCOUNT}

Label expression : $F{DEGREE}

Page 116: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

116

图 15.13 定义 pie data

【 中文 iReport 首页 http://ireport.CubeBI.com 】

第九步,保存并启动报表

Page 117: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

117

图 15.14

【 中文 iReport 首页 http://ireport.CubeBI.com 】

第十步,报表制作完成

图 15.15 最终的效果

Page 118: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

118

16 CrossTabs

一个 CrossTabs 是一种在设计的时候既不确定行数和也不确定列数的一种

表格,在运行环境下它会像下面显示的不同年份的一个销售报表一样。

水果/年份 2004 2005 2006

草莓

野生樱桃

CrossTabs 在 jasperresports 中从 1.1.0 版本时开始提供,同时 iReport

也从 1.1.0 开始支持 CrossTabs。

Jasperreports 的 CrossTabs 工具允许对行和列的数据进行分组、汇总和自

定义每一个 cell 里的内容。填充 CrossTab 的数据可以来自主报表里的 dataset

或来自 subDataset。使用 iReport 里提供的向导我们可以简单快速的创建功能

强大的交叉报表组件。

一个 CrossTabs 本质上是一个表格,行和列的数量取决于填充这个表格的

数据。行和列也可以在 groups 里做聚合操作。对于每一个行或列的 group 我们

都可以得到一个细节信息和一个可选的行列数据的汇总。

16.1 交叉表向导 (Crosstab wizard)

为了说明怎么让一个 crosstab 工作起来,我们将使用向导创建一个

crosstab,当我们在工具条里选择 crosstab 元素并将其添加到报表中时

crosstab 的向导会自动启动。

还是以 DoradoSample 里提供的 hsql 数据里的 employee 报为例,我们使用包含

下面查询语句的空报表开始:

Select * from employee

我们把 crosstab 放在报表的底部:summary band

Page 119: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

119

图 16.1

在第一步里我们需要选择一个 dataset 来填充 crosstab,我们这里使用主

报表里提供的 dataset,点击下一步继续。

图 16.2

在第二步里我们需要定义至少一个行分组.我们这里选择对所有记录使用

Page 120: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

120

DEPT_ID 进行分组。这样就意味着 crosstab 的每一行将会采用一个明确的部门

编号,这样 JasperReports 将会使用部门编号对数据集里的数据进行重新整理

计算。使用向导,我们可以定义两个行分组,这是使用向导的局限性所在,事

实上,如果你需要的话你可以通过 Crosstab 的属性设置窗口定义若干个行和列

的分组。点击下一步继续。

和定义行分组一样,从这里我们可以定义两个列分组,这里我们仅使用一

个列分组,使用数据中的 DEGREE 字段对数据进行分组。该字段的含义是学历,

这就表示,我们要做的这个交叉报表是用来计算不同部门员工在学历方面的人

数分布情况。

Page 121: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

121

图 16.4

是时候定义 detail 数据了,一般的,这个 detail 是使用类似根据

country,year 得到 orders 总数或者是相同组合的物品总数的一个聚合函数的

计 算 出 来 的 结 果 值 。 我 们 这 里 选 择 打 印 员 工 的 数 量 ( Detail

field:ordered,function:count)。点击下一步继续。

【 开源商业智能社区 http://bbs.CubeBI.com 】

Page 122: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

122

图 16.5

最后一步我们可以为 crosstab 的布局设定一个布局。我们可以设置是否能看到

表格线、或者是否包括行和列总数统计之类。我们这里全部选择。

点击 finish

注意当一个 crosstab 添加到一个报表中后,会自动在设计窗口中添加一个用来

编辑当前 crosstab 的 tab 页窗口。

图 16.6

当点击 crosstab 的 tab 页,两个新的属性窗口将会被添加在窗口的左边和

右边:一个 crosstab 的结构树,用来显示 crosstab 的当前选中单元格和帮助

相关信息。一个是 crossstab 对象列表用来显示和该 CrossTab 相关的一些

variables 或 fields 等。

当点击工具条上的启动按钮后,我们将可以看到引擎生成的如下效果的报表:

Page 123: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

123

图 16.7

最后一列包含每一行交叉所有列的总计,最后一行包含每一列交叉所有行的总

计。

16.2 列,行,单元格 (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 将会显示出如下效果:

Page 124: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

124

Crosstab header cell Column group1 header Column group 1 total

header

Row group 2

header

detail Col group 1 total Row group 1

header

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

【 中文 iReport 首页 http://ireport.CubeBI.com 】

16.2.1 行和列 (Rows and columns)

一个行或列的分组可能通过 crosstab 的属性窗口来对它进行修改(在

crosstab 编辑器右键菜单里选择 Crosstab properties)。

图 16.8

Page 125: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

125

点击“row and column groups”的标签页。在这里我们可以看到已经定义

好的行或列的分组。

图 16.9

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

Page 126: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

126

图 16.10

所有分组必须有一个唯一的名称。当你添加或修改一个行分组时,你可以

设置 row group header 的宽度。

【 更多开源商业智能项目 www.CubeBI.com 】

Column group1 header Column group 1 total

header

Row group 1 header detail Col group 1 total

Row group 1 total Row group1 total Row group 1

ROW GROUP WIDTH

Page 127: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

127

header total/column group 1

total

“bucket”是分组的标准,它通过一个 java 类来定义。在一个 bucket 表

达式里,你可以使用主报表里所有的 fields/variables/parameters。但是,

如果你选择使用 subdataset 来填充 crosstab,那么必须使用 subdataset 里提

供的 fields/variables/parameters。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

一个 header 的单元格增长依赖于它所跨越的行数。你可以选择多个元素放

置在 header 里。

top

middle

bottom

stretch

最后,你可以选择是否打印出总计的结果。这些选项是:

None : 没有总计行被打印

Start : 总计行打印在 detail 行之前

End : 总计行打印在 detail 行之后

创建 column 的 group 是非常简单的。定义 column group 时你可以定义 column

的高度来替代行高(看下图)

Column group1 header Column group 1 total

Column group height

Page 128: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

128

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

【 开源商业智能社区 http://bbs.CubeBI.com 】

当 Bucket 在行分组里时,header 的单元格内容的定位相似。但是在这个用例

中, details 可以改变 header 宽度而不是高度。

left

center

right

stretch

再一次,如果打印总计列的话,你可以做一些选择。各选项如下:

None : 没有总计列被打印

Start : 总计列在 detail 列之前打印

End : 总计列在 detail 列之后打印

列和行的高度可以很容易的在 crosstab 编辑器里通过鼠标拖曳表格线的方式

改变。

图 16.11

Page 129: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

129

当一个行或列添加到 crosstab 里时,一个特殊的用来引用 bucket 表达式

的变量将要被创建。它和新的 group 有相同的名称。你可以从 crosstab objects

标签里通过查找绿色小点的方式来定位这个 bucket variable。

图 16.12

iReport 为 group 创建新的 header cells 是很简单的,这个操作不需要添加任

何新的额外元素到 crosstab 里。你可以根据你的喜好来填充 cells,最好的方

式是通过拖曳把 bucket 从 crosstab objects 列表拖到新的单元格里。

图 16.13

Page 130: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

130

图 16.14

在上图中,你可以看到加在一个新加的嵌套在 column group 里四个新添加

到 crosstab 里的单元格,group header 单元格,group total header 单元格。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

你可以使用”up”和”down”按钮来更改你的 group 的嵌套顺序。

Page 131: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

131

图 16.15

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

Page 132: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

132

图 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.18

Page 133: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

133

16.2.3 特殊单元格 (Special cells)

如果一个 crosstab 不能包含一些数据,你可以选择打印别的东西来替代。

例如,你可以包含一条消息,方法是,你必须编辑“when-no-data”单元格。

在 crosstab 上右键勾选弹出菜单中的“when-no-data default cell”复选框。

这个操作完成后将会出现一种很明显的编辑模式,你可以操作“when-no-data”

单元格的内容。

图 16.19 激活“when-no-data”单元格的编辑模式

【 中文 iReport 首页 http://ireport.CubeBI.com 】

“when-no-data”单元格和 crosstab 元素有相同的尺寸。如果没有数据展

示的话它将替代 crosstab 打印。单元格橙色的边框标志出你可以编辑的单元格

区域。可以在这个单元格里添加一个或多个元素。

在一个 crosstab 里,所有的元素关联一个单元格,如果一个元素在单元格

外面或部分在单元格外面,这是不正确的放置方式并且当编译的时候

jasperreports 将会抛出异常。iReport 在界面中标识这个错误会以红色的框显

示。

Page 134: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

134

16.2.4 度量 (Measures)

在 crosstab 里每一个元素的表达式(如 textfield 表达式)可以包含唯一

的 measure。在这种情况下,你可以直接使用 fields,variables 或 parameters。

一个 measure 和 variable 一样是一个对象。要建立一个 measure,请打开

crosstab 属性窗口(在 crosstab 编辑器上右击,选择 crosstab properties)

并且到 measure 标签页。

图 16.20

点击 Add 按钮,创建一个新的 measure。Measure 的属性窗口将显示,你最

少应该去设置它的 name,class type 和 expression。在 measure 里你可以使用

fields,variable 和 parameters

Page 135: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

135

一个measure可以存储一个来自你代码中的实际的值(将calculation type

设为 nothing)或者一个类似于用 count,sum 等计算出来的值。

对于每一个 measure 你可以提供一个自定义的 incrementer 类(一个继承

net.sf.jasperreports.engine.fil.JRIncrementerFactory

的类)去实现特定的 increment 方法。

图 16.21 measure 属性窗口

这里的“percentage of”选项允许你选择表现变量最终值的百分比。

你可以提供一个特殊类来计算百分比的值,此时这个类必须实现

net.sf.jasperreports.crosstabs.fill.JRPercentageCalculator 接口。

16.2.5 Crosstab element properties

在主设计窗口中双击 crosstab 元素将打开 element properties 窗口,点击

Page 136: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

136

crosstab 标签。

图 16.22 crosstab element properties

Repeat column headers : 如果勾选,当 crosstab 完全添加到页面中时列的

header 将会被重复打印。

Repeat row headers : 如果勾选,当 crosstab 完全添加到页面中时这个行

headers 将会被重复打印。

Column break offset : 当 crosstab 超过页面宽度时它指定上一块的数据与下

一块之间的空白间隔。

Page 137: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

137

图 16.23 列被打断后

【 更多开源商业智能项目 www.CubeBI.com 】

16.2.6 交叉表参数 (Crosstab parameters)

你可以使用元素属性窗口里的crosstab parameter表格建立一个crosstab

parameter 并且设置一个 crosstab 的 parameter 同时为其设置一个默认的表达

式(图 16.22),要添加一个 parameter,请点击 Add 按钮,这个 crosstab

parameter 窗口将会出现。

Page 138: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

138

图 16.24

对于一个 parameter,你必须为其指定 name,class type,同时你还可以为

其指定一个可选的可以包含主报表中任意一个 fields,variable,parameters

的表达式。

警告:使用 dataset 的过滤查询,你必须用定义在 crosstab properties

窗口里的 dataset 启动 parameters,不能用 crosstab 里的 parameters.

你可以在 crosstab objects 窗口里看到 crosstab parameters 的列表,他

们用红色的点标记出来。

图 16.25

Page 139: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

139

你可以在启动时用一个 MAP 来设置 crosstab parameters 里声明的值。在这个

用例中,你需要在 element properties 窗口里提供一个合法的 parameter map

expression。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

16.2.7 交叉表数据 (Crosstab data)

你可以用主报表或一个 subdataset 来填充一个 crosstab。在后面的例子中,

在 crosstab properties 窗口“crosstab data”标签里你必须指定要启动的

dataset。

Page 140: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

140

图 16.26

如果你的数据是 pre-sorted.你可以勾选“Data is presorted”的 checkbox

以使得填充数据的处理速度加快。

Reset type/group 和 increment type/group 选项可以用来定义当集合类型的

数据需要重置并且当添加一条记录到你的 dataset。

关于怎么设置 dataset 的启动参数请参考 subdataset 的相关章节。

【 中文 iReport 首页 http://ireport.CubeBI.com 】

16.2.8 交叉表合计变量 (crosstab total variables)

Crosstab variables 是内置的对象,可以结合数据在不同的聚合水平使用

在 crosstab textfield 的表达式里。

图 16.27

对于每一个尺寸,jasperreports 创建 variables 根据每一行或列存储 measure

的合计值。

下面的例子是一个用来显示不同学历不同部门的员工数的报表.

Page 141: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

141

图 16.28

图 16.29

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】

Page 142: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

142

17 jrxm 文档介绍 (jrxml file introduce)

元素名称 元素名称

属性名称 含义

模板根元素

name

columnCount

printOrder

pageWidth

pageHeight

columnWidth

columnSpacing

leftMargin

rightMargin

topMargin

bottomMargin

根元素 jasperReport

whenNoDataType

Page 143: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

143

isTitleNewPage

isSummaryNewPage

scriptletClass

orientation

property 定义 property

name

property

value

定义模板中的字体

name

isDefault

fontName

jasperReport

reportFont

size

Page 144: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

144

isBold

isItalic

isUnderline

isStrikeThrough

pdfFontName

pdfEncoding

isPdfEmbedded

模板中的参数定义

name

class

Parameter

isForPrompting

Parameter parameterDescription Parameter 中的 isForPrompting

此字段的信息就是向用户提示的信息

Parameter defaultValueExpression

在数据填充过程中,parameter

如果在填充中不向变量传送值,

定义了defaultValueExpression

中的内容(此字段的值当且仅当数据填充过程中没有向此变

量传送值时有效

Page 145: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

145

jasperReport queryString 数据填充过程中,如果数据参数是连接池对象

则执行此 SQL 语句进行取数据

查询结果目标列字段名称定义

name jasperReport field

class

field fieldDescription

variable

变量定义。系统中还有一些内嵌的变量

号码(可以是页码也可以是页数

间的不同值来设置)COLUMN_NUMBER

REPORT_COUNT:当前文档中数据源记录数目

PAGE_COUNT:当前页面中记录的数目

COLUMN_COUNT:当前列中记录的数目

GroupName_COUNT:当前组中记录的数目

name

class

jasperReport

variable

resetType

Page 146: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

146

resetGroup

calculation

Page 147: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

147

incrementerFactoryClass

variable variableExpression

variable initialValueExpression

jasperReport group

Page 148: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

148

name

isStartNewColumn

isStartNewPage

isResetPageNumber

isReprintHeaderOnEachPage

group

minHeightToStartNewPage

Group groupExpression 分组字段值

Group groupHeader 分组头部分

Group groupFooter 分组尾部分

Page 149: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

149

jasperReport background 背景部分

jasperReport title 标题头部分

jasperReport pageHeader 页眉部分

jasperReport columnHeader Column

jasperReport detail

jasperReport columnFooter Column

jasperReport pageFooter 页脚部分

jasperReport summary 总结部分

<band> 模板的一段

height

groupHeader

goupFooter background title

<pageHeader><columnHeader><detail><columnFooter><pageFooter><summary> <Band> isSplitAllowed

<line> 直线元素<Band>

<line> direction

<line> <reportElement>

Page 150: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

150

key

positionType

stretchType

isPrintRepeatedValues

mode

x

y

width

height

isRemoveLineWhenBlank

isPrintInFirstWholeBand

<rectangle>

<ellipse> <image> <staticText> <textField> <subreport> <reportElement>

isPrintWhenDetailOverflows

Page 151: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

151

printWhenGroupChanges

forecolor

backcolor

graphicElement

stretchType

pen

<line><Rectangle>

<ellipse>

<image>

graphicElement

fill

<reportElement> <printWhenExpression> 当且仅当此字段返回

<Rectangle> 矩形框元素<band>

<Rectangle> radius

<band> <ellipse> 椭圆元素

Page 152: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

152

<Image> 图形元素

scaleImage

hAlign

vAlign

isUsingCache

evaluationTime

<band>

<image>

evaluationGroup

Page 153: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

153

hyperlinkType

<imageExpression> 指定图像的源位置

<image> <imageExpression> class

<image>

<textField> <anchorNameExpression> 锚名字(以被超级连接引用

<image>

<textField> <hyperlinkReferenceExpression> 超级链接引用类型

<image>

<textField> <hyperlinkAnchorExpression> 超级连接锚类型

<image>

<textField> <hyperlinkPageExpression> 超级链接页面类型

<band> <staticText> 静态文本元素

<textElement> 文本元素

textAlignment

verticalAlignment

rotation

lineSpacing

<staticText>

<textField> <textElement>

isStyledText

Page 154: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

154

<Font> 文本中用到的字体

reportFont

fontName

size

isBold

isItalic

isUnderline

isStrikeThrough

pdfFontName

pdfEncoding

<textElement>

<Font>

isPdfEmbedded

<staticText> <Text> 静态文本框中的文本内容

<textField> 动态文本框元素

isStretchWithOverflow

<band>

<textField>

evaluationTime

Page 155: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

155

evaluationGroup

pattern

isBlankWhenNull

hyperlinkType

<textField>

<textFieldExpression> 字段值内容

<textFieldExpression> class

<Subreport> <band>

<Subreport> isUsingCache

<Subreport> <parametersMapExpression> 子报表参数变量

<subreportParameter> 子报表参数<Subreport>

<subreportParameter> name

Page 156: iReport 立方开源商业智能read.pudn.com/downloads145/sourcecode/others/631556/manual.pdf · iReport用户手册 立方开源商业智能 2 序 本手册是一本iReport的入门教程,从前往后的顺序阅读,您能

iReport 用户手册 www.CubeBI.com 立方开源商业智能

156

<subreportParameter> <subreportParameterExpression> 子报表参数值

<Subreport> <connectionExpression> 子报表连接池值

<Subreport> <dataSourceExpression> 子报表数据源值

<subreportExpression> 子报表的位置

<Subreport> <subreportExpression> class

<band> <elementGroup> 元素组

【 更多开源商业智能项目 www.CubeBI.com 】

【 中文 iReport 首页 http://ireport.CubeBI.com 】

【 开源商业智能社区 http://bbs.CubeBI.com 】