资源描述
iReport报表设计器使用说明
iReport报表设计器使用说明
文件编号
文件状态
[ ]草稿 [ ] 正式发布 [√]正在修改
当前版本
拟 制
日期
审 核
日期
批 准
日期
修订历史记录
A - 增加 M - 修订 D - 删除
变更版本号
日期
变更类型
(A*M*D)
修改人
摘 要
备注
目录
iReport报表设计器使用说明 1
先演示一个简单报表的创建过程 5
Ø a、新建一个报表 5
Ø b、选择报表模版 6
Ø c、命名报表,选择存放路径 7
Ø d、给报表组织数据源 8
Ø e、选择统计分组字段 12
Ø f、完成报表的建立过程 12
Ø g、将可用的数据域组织到相应的位置即可完成报表的设计。 13
Ø h、查看设计好的报表效果。 14
理解几个重要概念 15
Ø a、iReport的输出格式 15
Ø b、报表的动态对象变量、参数、字段 15
Ø c、编译、静态运行、动态运行 15
Ø d、报表的结构 15
讲解制表过程常用的几个控件和相应的设置 17
Ø 先将全局分成下面几个版块 17
Ø 报表报表属性管理版块 20
Ø 报表设计版块 22
Ø 各种元素及其属性版块 23
制表过程常见问题解答 23
Ø Text field及static text的区别 23
Ø 如何设置两行数据的间距 24
Ø 如何给报表设置参数 24
Ø 表报中文格式无法输出pdf或输出pdf时为乱码 26
Ø 解决字符串过长,自动换行的问题 29
Ø 如何让报表的数据在方框里面显示 32
Ø 如何设置报表的宽度和高度 35
Ø 如何让字体居中,靠左等 36
Ø 配置数据源时提示找不到jdbc驱动 37
Ø 查询语句有数据的情况下输出报表为空 38
Ø 如何运用变量,以设置变量统计某一列为例 39
Ø 如何制作分组报表 42
Ø 如何制作子报表 45
i. 先举例说明一下什么是子报表: 45
ii. 总结子报表概念 45
iii. 制作子报表的几个前提条件 46
iv. 制作子报表的过程 46
Ø 数据源的配置 53
1. iReport中的数据源 54
2. JDBC连接 55
² ClassNotFoundException 56
² URL不正确 57
² 连接参数不正确 57
² 使用JDBC连接 57
² 字段注册 57
3. JRDataSource接口 58
4. JavaBean作为数据源 59
² JavaBean的一个字段作为数据源 60
5. XML数据源 62
² 字段的注册 64
6. XML和子报表 66
7. CSV数据源 70
² 字段的注册 71
8. JREmptyDataSource 71
² 实现一个新的JRDataSource 72
² 用iReport实现个性化的JRDataSource 74
9. JavaBean Extended数据源 76
Ø 参数$P!{ }及$P{ }的区别 77
Ø 如何制作图表 78
a. 饼图(或3D饼图): 78
b. 柱状图(或3D柱状): 81
c. 线图: 85
d. 区域图: 89
e. 其他图: 89
Ø 制作模版 89
a) 制作模版 89
b) 添加模版 92
c) 利用模版 93
附: iReport报表中各个元素的属性的含义 95
先演示一个简单报表的创建过程
Ø a、新建一个报表
Ø b、选择报表模版
Ø c、命名报表,选择存放路径
Ø d、给报表组织数据源
如果还没有数据源,可以选择新建new,将显示下图新建步骤
可测试数据源是否有效。然后选择保存。保存完后接下来需要组织sql语句。
然后选择需要的数据域(即字段)
Ø e、选择统计分组字段
这里的分组是为方便后面的统计用的。这里我们暂时选择为空。需要者可自己测试
Ø f、完成报表的建立过程
Ø g、将可用的数据域组织到相应的位置即可完成报表的设计。
Ø h、查看设计好的报表效果。
进一步学习之前先学习理解下面几个重要的概念。
理解几个重要概念
Ø a、iReport的输出格式
iReport的预览输出格式可以支持以下几种:
PDF、HTML、CSV、JAVA2D、Excel、纯文字、JRViewer,其中最常用的是PDF、JRViewer。
Ø b、报表的动态对象变量、参数、字段
在使用iReport的过程中会碰到很多及变量(Variables)、参数(Parameters)、字段(Fields)这些有关的内容,我们要介绍这些对象的使用和意义:
·字段(Fields):是数据库抽取出来的,希望在报表中出现的数据库内容。
比如一个ID的所有值。$F{ } F必须为大写
·参数(Parameters):参数是程序用来传递给报表的一个值,是你的应用需要提供给报表的入口,比如你希望在报表被解释的时候提供Where语句的条件值,那么就可以使用参数(Parameters)。$P{ parameterName } P必须为大写
·变量(Variables):变量是一个用来存放计算结果的对象,比如统计值。$V{ variablesName } 每种对象的定义格式如每个对象的后面说明,比如定义一个变量(Variables),那么表达式就写成$V{ variablesName },报表中出现的就是这个变量的名称。 V必须为大写
Ø c、编译、静态运行、动态运行
Jasperreport运行时需要的就是一个jasper后缀的文件,编译过程其实就是把jrxml后缀的文件生成jasper后缀的文件。(可以参考Jasperreport的运行原理) 静态运行和动态运行是相对的,后者带数据源运行,比如带数据库运行。前者就是静态文本运行,和数据源无关,如果报表中出现和数据源有关的对象,则以null显示。
Ø d、报表的结构
一个报表的结构大致是几个部分:title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。
·Title:每个报表一般会有一个名字,比如×××销售报表,title就是搁置这个名称的最好地方了,当然你也可以根据需要搁置在合适的地方。 只在整个报表的第一页的最上面部分显示.
·pageHeader:报表的一些公共要素,比如页码、创建时间、创建人等信息放置在这里是比较好的选择。
·columnHeader:这里放置列的名称,记住不是列数据。
·Detial:放置需要循环的数据,一般就是查询出来的列对应的数据。
·columnFooter:放置列级别的统计计算值或是列的说明。
·pageFooter:放置页级别的统计值或是页的说明。 显示在所在页面的最下端.
·Summary:可能需要对几页(你的报表可能有几个页组成)的统计值。比如50个销售记录共占用了3页,那么放置这些统计记录的统计值最好的地方就是summary。 一般用来统计报表中某一个或某几个字段的合计值。
·groupHeader:每个表的内容可能需要根据某个属性进行划分显示内容和计算内容,比如希望以月份为单位每组分开显示销售记录,那么就可以定义一个组(组的定义参考后文),groupHeader就是放置组说明或是组标志最好的地方。 (定义了分组时才会出现)
·Groupfooter:放置组的统计或是说明
讲解制表过程常用的几个控件和相应的设置
Ø 先将全局分成下面几个版块
Ø 报表属性管理版块
Ø 报表设计版块
Ø 各种元素及其属性版块
指定被选元素在条目中的y轴坐标
位置类型:当报表因拉伸而受到影响时,指定被选元素的位置.
Float:备选元素根据周围的元素尺寸所移动;
Fix Relative to Top:元素保持相对于条目顶部位置;
Fix Relative to Bottom:元素保持相对于条目底部位置;
Ø 属性版块
表达式计算时刻Now:当前
Report:报表结束
Page:当前页结束
Column:当前列结束
Group:组发生变化
超出时拉伸
为空时显示空白
指定pdf字体是否被嵌在文档中
线间隔,single(单),1_1_2(1.5),double(双)
穿越线
是否透明
背景色
前景色
指定被选元素的宽度和高度
指定被选元素在条目中的x轴坐标
是否当表达式成立时输出:表达式成立时输出被选元素,默认false,一般不要修改这个值
当组改变时输出:当指定的组发生改变时,输出被选元素
当超出细节条目时输出:当由于某些原因而导致当前条目不能在当前页打完,当开始一个新的页时,被选元素是否在新页上重新输出
在第一个条目输出:当你选择Print Repeated Values为false,在换页或换列时,是否重新输出该值.
为空时移除线:当条目中的一条记录都为空时,是否把该条记录从条目中移除
输出重复值:当多条记录连续中某字段的值都相同时,是否每条记录的该字段否输出,默认为true.
拉伸行为类型:当报表被拉伸时的拉伸行为类型
NoStretch:不拉伸;
Relative to Tallest Object:图形元素将适应元素组中最高的元素拉伸;
Relative to Band Object:图形元素将适应条目拉伸;
制表过程常见问题解答
Ø Text field及static text的区别
Textfield为文本域,一般为有效的java表达式,如果是中文或其他字符等非表达式,需要用双引号包含作为字符串处理。
Statictext静态文本,里面的内容直接输出,不做任何处理。
例如:Text Field里面可容纳任何变量或参数,字段甚至任何有效的java表达式值。如果文本的内容需要按照某些条件进行变化的。这时就需要使用Text Field。
Static Text里面包含的内容会一成不变的显示出来。不会根据条件变化的。如果用作标题或其他的不变的文本,可选用它。
Ø 如何设置两行数据的间距
设置两行数据之间的距离:detail域表示的是一次计算的高度。如果两行数据仅相当及一行的表格,则detail的高度就是一个表格的高度,比如,希望两行的数据连接比较紧凑,则detail的高度设置为字段框的高度即可。如下图:
效果图:
如果不留意这个设置,比如detail高度比较高。如图:
效果图:
Ø 如何给报表设置参数
首先确定报表参数名称,在报表属性管理版块里面的Parameters新建一个参数。比如命名一个参数为:districtcode,初始值为:”00%”
新建参数完成后,可用该参数进行参数设置了。一般用在sql语句里面。比如我需要根据该参数开重新组织数据集,则可在数据源里面重新组织sql语句:
select *
from mis_district a
where a.districtcode like $P{districtcode}
如下图示:
参数利用时的格式为:$P{参数名}。注意:这里的P必须为大写
设置好参数之后,报表输出时将要求输入参数,如果不输入,可选默认值(即初始值):
Ø 表报中文格式无法输出pdf或输出pdf时为乱码
第一:确保.. \Jaspersoft\iReport-nb-3.6.0\platform7\lib下面有iTextAsian.jar包,如果没有,则需要添加进去。有了该包后,在工具菜单的选项里面对其进行添加。
注意:这一步完成之后要重启才生效。
第二:选择包含中文字符的元素框,对其pdf pont name属性和pdf Encoding属性进行编辑,将pdf pont name设置为STSong-Light,pdf Encoding设置为:UniGB-UCS2-H(Chinese simple)
这种方法是对单独的元素进行设置。
也可以定义一个全局的style,再对选中的的元素都进行应用该样式即可。那可以在报表属性管理版块里面的styles里面设置。如下新建一个style的例子:
然后对需要应用该样式的元素选择引用该样式即可
这种定义全局样式不局限于解决该问题。对全局定义统一样式的都可以使用到这种方法。
Ø 解决字符串过长,自动换行的问题
第一:首先确定那一列或字段有可能过长,然后选中该字段,对其Text fieldproperties属性Stretch with overflow进行修改,如下图示:
第二:同时把该行所有的字段选上,然后在属性里面对Stretch Type属性进行编辑,选择为Relative to tallest object。如下图示:
Stretch with overflow:当它被选择时,表示这个选项可以垂直的改变内容,如果元素不能充分的包含在文本线内的话
修改了这两点后,输出之后的效果如图:
Ø 如何让报表里的空数据显示为空,不显示null
当对报表的空数据不做处理时,将显示以下结果:null
想要让null以空白显示只需如下操作:
选中可能有空数据的字段,在属性列勾选Blank When Null。
Ø 如何让报表的数据在方框里面显示
在默认情况下,打印出来的数据是看不到方框的(其实不是没有方框,而是默认情况下方框的线条宽度设置为0了)。要将方框显示出来,原理很简单,只需要将线条宽度设置大于0的数字即可。但是直接是找不到设置的属性的。我们需要自己定义一个全局Styles。
下面一步步说明如何设置:
第一:定义一个style,命名为:“中文”(可随意):
将其选中,在右边的属性栏里面对其Padding and borders属性进行编辑:
然后将要显示的元素全部选中,右边style属性应用刚新建的“中文”style即可:
说明一点,这里面的方框是对你选中的方框显示的。如果你希望形成表格形式,请将各方框相连:
打印效果如下:
Ø 如何设置报表的宽度和高度
右击报表属性,修改高度和宽度即可,如下图:
Ø 如何让字体居中,靠左等
先寻则要修改的字段或列,然后在Text properties下面的Horizontal Alignment的属性修改为center即可,如下图示:
或者直接选中列,在文本编辑工具上直接编辑即可,如下图示:
Ø 解决自动换行,跨页后内容信息显示不完整的问题
当由于字符串内容太长,设置自动换行后,跨页时就会出现以下内容显示不完整的问题:
此时,只需将整行选中,在属性列勾选Print When Detail Overflows(当输出细节条目式输出),当然,此处条件是必须Print Repeated Values(输出重复值)没有修改默认,即选中的情况。
即可显示如下打印数据:
Ø 配置数据源时提示找不到jdbc驱动
找到一个ojdbc14.jar(如在mis下的\WebRoot\WEB-INF\lib下有该驱动包)拷进\iReport-nb-3.6.0\platform7\lib下,然后按照下面图示进行设置即可:
第一:选择工具下面的选项
第二:在选项下面的Classpath下面选择addjar,将之前添加的ojdbc14.jar添加进来。完成后下面将显示出来。对其进行√选中,最后点确定。重启即可
上面的操作是针对连接到oracle数据库的。如果连接sqlservier数据库,则将ojdbc14.jar换成sqljdbc.jar(需要自己找)即可。后面的操作一样。
Ø 查询语句有数据的情况下输出报表为空
下面仅列出几种可能的情况,如果检查完下面的情况之后还出现这种问题,请自行检查或联系开发部人员。
引起问题的根本原因在于:数据源的数据没有在ireport中体现出来。
第一种情况:有可能是jdbc驱动没找到。这种情况,可参考驱动没找到的解决方案解决。
第二种情况:没有选对数据源。在ireport 报表工具的菜单栏下方有如下图示的数据源选择框,如果这一框没选对数据源也将导致显示数据为空
Ø 如何运用变量,以设置变量统计某一列为例
新建一个变量,便可出现下面的变量属性。下面先详细说明各个属性的含义。
Reset Group 当组选择Group reset类型时用来指定变量的重置
Custom Incrementer Factory Class 一个叫JRIncrementerFactory接口的java扩展类用来定义像总计一个非数值类型的操作;
Variable Expression 用来识别输入值的java表达式。我们经常在这个属性里面设置对列的统计。
Initial Value Expression 用来给变量初始化一个值的表达式
下面以统计一列为例说明。其他的类似。
第一:新建一个变量:MONEY_COUNT
第二:对变量属性进行设置,对变量的表达式进行赋值
第三:将该变量放入报表中
输出报表即有其效果。
其他的如统计行数,取最大值,最小值,平均值等等类似操作即可。
Ø 如何制作分组报表
² 什么时候用到分组
分组,在数据库里面也有group by可实现分组的统计。那何时可用到这里面的分组而不是数据库里面的分组呢?先来说明这两个分组的区别:
数据库里面的group by:查询出来的数据集只能是group by的字段信息和对这些字段的统计信息,具体的信息并没有统计出来。
比如下面sql:
select t.districtcode, count(*)
from mis_district t
group by t.districtcode
这里面的数据集局限及districtcode和count(*),其他的信息没有体现出来。
分组报表里面的分组:可对那些字段信息进行统计,同时也能将具体的信息显示出来。对上诉的报表效果,完全可以体现出来,并且将其他的信息也体现出来,数据集可采用下面的sql:
select*
from mis_district t
这种情况就可以用到分组表报
² 如何制作分组报表
第一:首先组织数据源:
select *
from mis_operator
order by districtcode
注意:order by districtcode 这个是必须的(因为我们等会要用它来分组,分组的字段必须用order排序!)
第二:新建一个group
我们选用districtcode字段来分组统计,显示的信息只显示操作员名称和登陆ID号。于是,我们新建一个group,命名为department。右击报表选择add report group即可新建。新建group的过程如下:
第三:对其属性进行编辑,选中其header或footer,在右边属性栏对其属性进行编辑
然后选中要分组的字段作为其表达式即可。当然,这里不局限于字段,可以是任意合法有效的表达式,更丰富的功能请自行摸索,本例仅讲解基本功能,供参考。
第四:查看效果:
说明,上图示中下方‘4‘的来源。每新建一个组,都会自动生成一个不能修改的变量,用来统计该组的行数,设计时,我们将其放到下方,故出现4,这里只是用来说明,其生成和用途而已,可不用。
下面说明分组的属性信息:
Group Name 定义组的名字,这个名字将被用来命名和这个组关联的两个band: header和footer;
Start on a new column 如果这选项被选择,它允许强制在组的最后将列分开(意思就是新开一个组);如果这个报表仅有一列,这列就将被分开;
Start on a new page 如果选择这项,它允许强制在组的最后将页分开(意思就是新开一个页);
Reset page number 这个选项可以重设页码在一个新组开始时;
Print header 如果选择这项,就可以在所有的页打印组头的内容(如果一个组的内容比需要多页来显示,则在每页上都打印组头);
Min height to start new page 如果不是0的话,JasperReports 将在每页打印组, 如果有效的空间被指定为次的空白;通常这是为了避免分割(就像一整段被分开一样);
Group Expression 是JasperReports计算记录的表达式;当表达式换一个值时,一个新的组就创建,如果表达式是空的话,既然这样,这个结果就是单一的组的头和单一组的角分在第一列头之后和最后一列角之前;
报表中组的数量可能是任意不确定的,一个组可能被一个父组包含,父组包含其他的子组。结果就是一个组列表。
可以修改一个组及另一个组的关系的优先权,通过右击该组的“Move Group Up” 和“Move Group Down”按钮。
改变组的优先权的意思就改变这这个组的位置。优先权越高,组bands就越远离detail。
Ø 如何制作子报表
i. 先举例说明什么是子报表:
比如一个公司有3个部门,分别为市场部,技术部,研发部。市场部有3名员工:甲、乙、丙;技术部有两个员工:A、B;研发部有3名员工:张、李、赵。
A报表为:打印公司的几个部门;
B报表为:打印公司的员工;
A报表及B报表之间有一个联系,就是B报表中的员工属于公司其中一个部门(假设成立);那么B报表就及A报表有一个联系:部门编号是相同的。于是就可以将B作为子报表嵌套在A报表中。于是就可以设计如下效果的打印:
市场部:
甲
乙
丙
技术部:
A
B
研发部:
张
李
赵
这就是子报表的一个简单例子的说明。
ii. 总结子报表概念
下面抽象一下上述例子,以方便更普遍的应用
A报表相当一个表或视图(甚至是一个任何形式的可用数据源的数据集),简称表A
B报表相当另一个表或视图(或另一个相同或不同的可用数据源的数据集),简称表B
表A及表B之间有一个或多个相同的字段,我们称其有外键联系,这种情况下,外键联系一般是一对多的形式(如果多对多将显的复杂且统计意义不大,除非有特殊要求)。这两种报表就可以用子报表嵌套父报表来完成。
如果还有C报表和B报表也存在这种关系,那么可在B中也嵌套C报表,就构成了多层子报表。
iii. 制作子报表的几个前提条件
从上面的抽象,我们来总结制作子报表的几个前提条件:
第一:父报表和子报表都可独立运行(不要求有相同数据源),之间并没有依赖关系。
第二:父报表和子报表必须要联系(一个字段或多个字段取值域相同)
第三:要想子报表嵌入父报表,必须在他们之间建立联系(这时就需要用上第二个条件了)
只有符合了上述条件,才必要和可以制作子报表。
iv. 制作子报表的过程
根据上述的抽象和前提条件,我们一步步来具体介绍一个子报表的制作过程
我们制作这样一个子报表,左边是供电单位,右边是该供电单位下的操作员
a. 先制作两个报表,一个打印供电单位,一个打印操作员
如下图示:
供电单位报表:
Sql:
select *
from mis_district t
where t.districtcode != '00'
报表设计:
操作员报表:
Sql:
select *
from mis_operator t
报表设计:
要保证这两个报表都能独立正常运行。
b. 给两个报表建立联系
先确定两个报表的联系字段。这里的联系字段我们采用DISTRICTCODE即供电单位来联系。
首先,我们给子报表设定一个参数(这一步很关键):P{districtcode}
使其sql变为:
select *
from mis_operator t
where t.districtcode = $P{districtcode}
到此子报表不需要其他设置,除了排版。
其次,我们给父报表插入子报表:
第一:选择组建模版中的,拖到detail中即可完成插入
选择子报表
选择数据源
选择下一步直至完成。完成一步,不要选择静态路径。
完成之后调整子报表被包含在detail中即可。
第二:选中子报表,在右边的属性里面对子报表的Parameter属性进行修改:
第三:输出检验:
到此,几个基本的子报表制作过程就结束了。
下面我们来介绍子报表的几个属性:
Subreport expression:这个属性表示子报表的编译文件位置,一般不采用静态的方式赋值,一般赋值如下:$P{SUBREPORT_DIR} + "SubreportName.jasper",采用根目录+子报表编译文件名称表示子报表的路径
Connection type:表示获取子报表的数据集的数据源方式。
connection expression:指定内部参数$P{REPORT_CONNECTION}作为存储JDBC连接的表达式。
Return Value:表示子报表的返回参数。下面我们将具体介绍
c. 子报表的返回参数
如果父报表不需要子报表的返回参数,就不需要看这一节的内容了。
这一节暂时没有相关资料可以设计返回满意参数。获取的参数总是上一次的返回值,有资料表明要用外部类来实现。暂时不能完成文档编写。如今后有成功者,请完成这里的文档。2009-11-17
d. Jsp报表页面的相应设置
Jsp报表页面要在setParamter()方法中对子报表的路径参数进行设置。
para.SUBREPORT_DIR = "<%=session.getServletContext().getRealPath("/jasper_model").replace("\\","//")%>" + "//";
//如果没设置此项,将报错。
Ø 数据源的配置
这一节的文字都摘自《ireport技术手册》
datasource是一个源来自于JasperReports,并取走数据用于打印。这儿有两种类型的datasources:一个是JDBC连接到关系数据库,在这个数据库上执行sql查询,这个对象继承JRDataSource接口,那个,像我们看到的,允许我们去管理详细的数据像这种XML文档或者一个JavaBean。
从一个关系数据(通过sql查询)找回数据来打印的这中能力来创建一个报表是非常简单的,因为可以通过鼠标点击“register”查询字段作为报表字段(没有指定每一个单独字段的名字和类型)。iReport可能关联每一个数据库,为数据库提供一个JDBC驱动,并且提出你配置的用来完成从sql查询开始创建一个报表的向导。当你不想存取数据通过JDBC (或者当你不想JasperReport不直接影响数据库),这时就需要用到JRDataSource (JasperReports数据源),这是一个接口允许存取数据好象他们被构造在表格中,被组织在lines和columns上 (lines是datasource指定的记录,columns是记录的字段)。
The JDBC连接或者JRDataSource不是通过JasperReports创建的,但是是通过调用报表的应用程序生成的。这个程序将传递JasperReports的fillReport方法来打开连接到数据库(一个java.sql.Connection对象)或者由于JRDataSource填充报表的情况。
第一个中,JasperReports将使用提供的JDBC连接去执行sql查询指定在报表中(明显的这个查询仅仅在你使用这种方法时想打印报表而指定)。查询的结果被包含在被JRResultSetDataSource的指定的JRDataSource中。以这种方式, JasperReports用JRDataSource对象联合这些数据去打印,表示一般的用这个库管理数据打印的接口。
在这章我们将在iReport的使用和配置时澄清JRDataSource的不同。而且我们将看到如何扩充JRDataSource ;有时扩充datasources需要我们超越JasperReports的限制,就像没有直接的支持交叉报表。
1. iReport中的数据源
iReport允许我们管理和配置不同类型的datasources来填充报表。以下是存储在iReport中需要我们配置和激活的datasources。
你可能使用到的datasources类型:
- JDBC connection
- XML DataSource
- JavaBean Collection Datasource
- CSV DataSource
- Custom DataSource
在报表生成时JDBC连接被打开并立即传递给JasperReports。XML DataSource 允许我们从XML文档中取数据。CSV DataSource允许你打开一个CSV(以逗号分割的值)文件在报表中使用。JavaBean Collection Datasource和Custom DataSource
允许你打印数据使用java类。Datasources被管理通过菜单 “Datasource → Connections /Datasources“ (图10.1), 打开配置连接列表。
图10.1
技术上connection和datasource是不同的对象 (第一个总是需要一个关系数据库, 但是第二个表示一个简单的接口去存取数据结构在任意的表单中)。然而现在我们将使用这两个相似的单词。
即使我们保持任意数量的datasources准备去用,iReport工作仅仅使用一个源或连接。设置“active” datasource, 选择主窗口菜单“Build → Set the active connection” 并选择想要的datasources从提示列表中(图10.2)。
图10.2
如果没有datasource被选择,就不可能为报表提供数据。用报表向导配置一个能起作用的JDBC连接(仅仅一个允许执行sql查询)。
2. JDBC连接
iReport 数据库连接需在Jaspersoft\iReport-nb-3.x\platformx\lib\路劲下加入ojdbc14.jar
JDBC (Java Database Connectivity)连接允许我们去使用作为一个关系DBMS (或者无论那种更接近通过JDBC驱动的) driver). To set a设置一个新的JDBC连接,按“New”按钮依照图10.1提供的,将打开一个新的界面创建一个新的连接(或datasource)。
图10.3
首先为这个连接命名(可以用一个有意义的名字,像“Mysql – Test”)。iReport将使用这个指定的名字进行连接。
JDBC Driver区域是用来指定连接数据库的JDBC驱动的名字。这个选择框包含了常用的JDBC名字。
警告! iReport仅仅装载了Mysql和HSQLDB的JDBC驱动。
幸亏JDBC URL Wizard, 他可以自动的构造JDBC URL来连接数据库通过插入服务名和数据库名在恰当的textfield。按Wizard按钮创建URL。
插入用户名和密码去存取数据库。意思就是一个选择框可能保存连接密码。
警告! iReport将密码保存在清晰的配置文件并加载到<USER_HOME>/.ireport/config.xml
如果密码是空的,最好保存它。
插入所有的数据以后,需要按“Test”按钮来校验连接。如果一切都ok,将会出现以下提示:
图10.4
测试后,记着设置创建连接作为“active connection”去使用。
如果测试失败,可能是以下这些原因:
- ClassNotFoundException
- URL不正确
- 连接参数不正确(Database not found, user or password wrong, etc...)
² ClassNotFoundException
这个异常出现当所需要的JDBC驱动在CLASSPATH中不存在,比如我们创建一个Oracle数据库连接。iReport缺省驱动中没有oracle的,但是在JDBC驱动列表中存在oracle.jdbc.driver.OracleDriver驱动,事实上当你测试连接时就会出现这个异常:
图10.5
我们并没有将oracle的JDBC驱动加到CLASSPATH(这里JVM可以搜索到的类)中,它是一个名叫classes12.zip的文件(或者老版本的classes11.zip). 当作iReport使用自己的Class Loader,需要拷贝完整的classes12.zip文件到iReport的lib目录下,然后重新测试就不会发生异常了。
Lib目录是插入jar档案的正确地方(扩展名为jar或zip)。如果这个驱动不是jar版本的,它就被作为未知目录加载(例如,com目录包含所有驱动类的级数),最正确的地方去动态的加这些类到CLASSPATH就需要拷贝驱动目录到classes目录(iReport的主目录)
² URL不正确
如果指定一个错误的URL(例如指定一个错误类型的),不会发生什么事当你按“Test”按钮时。事实上会抛出一个StackOverflowError异常(堆栈报告被打印在控制台或者shell中在iReport被打开时)。
既然这样,最好还是用URL向导来建这个JDBC URL,然后再试一次。
² 连接参数不正确
这个错误是比较少见点的,它是你在建立数据库连接时用了错误的参数时发生的(用户名或密码无效,数据库不存在,等)。这个错误或多或少是比较直观的连接错误。
² 使用JDBC连接
当使用JDBC创建报表时,用户指定一个sql查询从数据库中查询记录用来打印。这个连接也能被在子报表或这例如,通过个性化的查找功能为详细的数据码。为这个原因, JasperReports安置我们的配置作为指定的参数,名字叫REPORT_CONNECTION,类型为java.sql.Connection,这个参数能被随意的使用,它的语法格式:
$P{REPORT_CONNECTION}
这个参数包含在正确的java.sql.Connection类传递给JasperReports来自于calling程序
展开阅读全文