jasperreport开发手册--ireport教程
Posted bug集结号
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jasperreport开发手册--ireport教程相关的知识,希望对你有一定的参考价值。
iReport http://www.jasperreport.net
一、介绍
iReport是一个能够创建复杂报表的开源项目,它100%使用Java语言编写,是目前全球最为流行的开源报表设计器之一。
由于它丰富的图形界面,你能够很快的创建出任何一种你想要的报表。
以下是iReport一些比较突出的功能:
• 拖拽式,所见即所得的报表编辑器;
• 多样的向导来简化复杂的报表设计任务;
• 超过30个排版和格式化工具;
• 报表可转换为PDF HTML EXCEL FLASH CSV RTF TXT OpenOffice Java2D JRViewer等格式;
• 支持所有有效的数据源。如:JDBC,CVS,Hibernate,JavaBean等;
• 用户自定义数据源;
• 无限次数的撤消/重做;
• 集成脚本(scriptlet)支持;
• 内置图表支持:超过20种的图表支持。并可扩展;
• 国际化:集成超过15种语言;
• 报表模板与报表库样式管理;
• 源文件的备份;
• 文档结构浏览器。
二、开始
在本章中我们将介绍iReport运行时所需要的环境、如何下载iReport以及如何在我们的系统中安装使用。
2.1、运行环境(Requirements)
iReport运行时需要sun java2 SDK 1.5及以上版本,为了能编译我们的报表文件我们需要完整的安装JDK。
2.2、下载(Download)
iReport官方网址:http://ireport.sourceforge.net/cap3.html。
2.3、运行(Run)
将文件下载到本地解压后,您可以直接双击iReport.exe或者iReport.bat来运行程序。
注:在本文中iReport的版本是3.0.0。
三、报表结构
在本章中我们将分析一下报表的结构,看一下报表中每一部分的作用是什么,以及在生成报表的时候每一部分将产生什么样的效果。
栏(Bands)
报表被垂直分成若干个部分,每一个部分我们叫它“band”。每一个band都有自己的特性,在报表生成的时候有些会打印一次,有些会打印多次。如下图。
接下来我们就对每一种类型的band分别进行介绍。
*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的后面,一般用来统计报表中某一个或某几个字段的合计值。
*lastPageFooter**:***内容将会出现在报表的最后一页的最后部分。
为了实际演示各个band的生成效果,我们可以在报表中的各个band里添加不同的对象,以测试各个band的作用。
步骤:
第一步:新建文档,报表名称命名为:MyFirstReport,然后单击“OK”。
第二步:设置JDBC连接参数
单击“Dateà连接/资料来源”,出现如下界面:
然后单击“New”,出现如下界面:
选择“Database JDBC connection”项,单击“Next”,
设置好参数,单击“Test”,如果测试成功单击“Save”保存,如果测试没有成功,请检查一下以上步骤。
第三步:单击Dataà报表查询。在query editor里输入下面的语句:
select * from tb_employee,然后单击“OK”
第四步:单击“不会变动的文字”按钮,添加各个Band内容。
在报表中的各个band分别放置如下内容:
第五步:将要显示的字段拖到“detail”栏内
第六步:单击“执行报表”查看结果:
启动报表,生成的效果如下:
最后一页:
四、报表元素
在本章中我们将介绍可以在报表中使用的对象及他们的相关属性。
我们所说的元素主要是一些图形对象,比如text,rectangle等。在iReport中没有段落、表格或分页的概念,在报表中最基本的对象主要有七个:
-Line(线段)
-Rectangle(矩形)
-Ellipse(椭圆形)
-Static text(不会变动的文字)
-Text field(文字栏位)
-Image(图像)
-Subreport(子报表)
-Crosstab()
-Chart
通过以上这些组件的组合我们可以做出各种各样复杂的报表样式。iReport提供两种特殊的图形对象:chart和barcode。
每一种类型的对象都有一些通用的属性,如高度、宽度、位置、所在的band等。除此之外还有一些针对不同元素的特殊属性。
每一个元素都必须在一个band内部,如果一个元素跨了一个以上的band,那么在编译的时候将会抛出元素位置错误的异常。
要添加一个元素到报表中,我们可以从主工具栏中选择相应的工具,然后添加到报表区域中即可。
我们可以通过双击对象或右键菜单打开元素的属性设置窗口。
属性窗口由若干个标签页构成,“Common”标签里包含每一个组件都具有的通用属性,其它的标签页是针对不同元素的属性设置。在下面的章节中,我们将对每一个对象的使用做详细的介绍。
五、字体和样式
一个style是一个预定义的属性的集合,用来控制元素的外观(比如背景色、边框线、字体等)。我们可以为我们的报表定义一个默认的style。
要为一个元素应用一个style,我们可以选择该元素并从元素的属性窗口common标签里的style列表选择你需要的style。
Fonts是用来描述text的外观特征。
5.1、字体(Font)
通常定义一个字体,我们需要做下面几件事情:
-Font name(字体名称)
-Font dimension(字体大小)
-Attribute(属性,诸如bold-faced,italics,underlined,barred)
如果我们需要导出PDF格式的报表,需要为字体添加下面的信息:
PDF Font Name:PDF字体名称(预先定义PDF字体或一个在classpath里的TIF文件的名称)。
PDF Embedded:当使用一个外部的TTF类别的字体文件生成报表时是否把它包含在PDF文件里的一个标志。
PDF Encoding:指定一个字体编码名称。
单击“格式化à报表字形”可以创建自定义的字体。
如果我们需要将报表导出成PDF格式,将会使用指定的PDF字体,其它属性将会被忽略掉。
5.2、样式(Styles)
我们可以选择主菜单的“Format Styles” 来定义一个style。如下图所示:
单击“格式化àStyles”可以创建自定义的样式。
点击“New”按钮添加一个新的style。在弹出的窗口中我们可以定义一些属性,如果我们需要某个属性的值,我们可以点击按钮来实现。
在每个元素属性窗口的“Common”标签里有一个style属性下拉框,如果我们需要为一个元素设置一个style,我们可以在这个下拉框里选择我们定义好的style,这样就可以把一个style应用到一个元素上面了。
我们可以为一个Style加一个动态的条件,当条件满足的时候采用某个style,否则就采用默认的style。举个例子,还是以数据库里的employee表为例,如果员工的工龄大于3时,我们让工龄以红色加粗的字体显示。
打开Query窗口,输入下面的查询SQL:
Select * from tb_employee
新建一个style,在弹出窗口的style conditions里新建一个conditions,在表达式窗口里输入下面的表达式:
($Femployee.workingYear.intValue()>2?newBoolean(true):new Boolean(false))
如下图:
新建的style如下图:
接下来把员工姓名和工龄到报表当中,并将我们新建的style应用到薪水这个field上,如下图:
启动查看运行效果如下:
六、字段、参数、变量
在ireport中有三种类型的对像可以用来保存数据:Fields/Parameters/Variables.这三种对象可以用在某些地方的Expression中,通过一定的逻辑在报表生成的时候动态的更改某些值。Fields/Parameters/Variables有类型的概念,它们的类型就是一个标准的Java的Object。要使用这三种类型的对象我们必须首先创建它,创建的方法是点击“View”主菜单中,选择其中的子菜单Fields,Variables,Parameters我们可以创建不同的对象。通过这三个子菜单我们可以查看并管理Fields,Variables,Parameters对象。
会出现如下界面:
通过该窗口,我们可以创建,修改,删除这三种类型对象。
6.1、字段(Fields)
Field在ireport是专门用来组织记录。Field的创建有多种途径可以实现,我们可以根据在ireport中各种类型的数据源来创建我们所需要的Field。
6.1.1、在Fields标签页中,我们可以点击new 按钮来创建一个新的Field。
一个Field有两个必填的属性: name、type和一个可选项的description。从ireport1.0.0开始,fields可以是任何Java数据类型。这样当我们使用JavaBean作为数据源时我们可以很方便的从java.lang.Object向报表中的Field的转换工作。在对象的Expression里你可以使用下面的语法来引用一个field:
$Ffield name
例如,如果你想处理com.bstek.test.domain.Person Bean里的username 字段,可以这样去写:
((com.bstek.test.domain.Person)$username)
6.1.2、用一个SQL query来创建Field
在ireport的设计中,使用SQL query的方式来创建或记录字段的是使用最广泛的也是最直接最简单的一种方式。做此操作我们需要首先打开ReportQueryDialog窗口(点击主工具栏的 按钮),ReportQueryDialog窗口出现后,我们可以输入合适的SQL检索并创建Fields。
在打开ReportQueryDialog窗口之前请先确认我们已经有一个数据源连接处于激活状态(激活方式请查看相关章节),插入一条查询语句,如:select * form employee
iReport将启动SQL查询引擎,根据输入的SQL将分析结果用fields的形式展示出来。在下面的窗口中选择你要的fields(可以多选)然后点击OK按钮, fields就被创建出来了。
在这个例子当中所有字段有多种类型,一般地说,fields的数据类型是构建在原始SQL 类型基础之上的,如String,Integer…
6.1.3、用JavaBean生成Fields
ireport的高级特性之一是它的数据源除了可以构建在SQL query基础之上外,还可以使用含有getter和setter方法的JavaBean(或者叫POJO)对象来创建。在这个例子中fields就是POJO类里的属性(或者是属性的属性,即子对象的属性)。
第一步:定义一个简单的Bean:
package com.asinfo.ccm.model;
public class ProductBean
private StringproductName;
public StringgetProductName()
returnproductName;
public voidsetProductName(String productName)
this.productName= productName;
第二步:要在iReport中使用JavaBean作为数据源,首先要定义好Classpath,以使iReport能够找到我们定义的Bean,使用菜单“Options”-“Classpath”定义Classpath,定义的路径为编译后的.class文件所在路径,例如,我定义的Classpath为“C:\\Documents and Settings\\wzz\\workspace\\ccmrightinfo\\WebRoot\\WEB-INF\\classes”。
第三步:在菜单“Data”-“Connections/Datasources”菜单中,添加数据源,将数据源类型设为“JavaBeans set data source”,设定的数据源属性如下图所示:
第四步:然后到菜单“Data”-“Report Query”中定义需要用到的 Bean属性,在“Class name”中输入自定义Bean的名称,本例中为“lld.test.ireport.ProductBean”,然后点击“Read attributes”按钮,获取Bean属性,点击“Add Selected Field(s)”添加要用的属性,如下图所示:
要把一个属性添加到field列表,只需选中需要的属性然后点击“Add field(s)”按钮。
6.2、参数(Parameters)
Parameters通常是用来在打印的时候从程序里传值到报表里。也就是说parameters通常的是起参数传递的作用。他们可以被用在一些特定的场合(比如应用中SQL 查询的条件),如report中任何一个需要从外部传入的变量等(如一个Image对象所包括的char或报表title的字符串)。
和使用Fields一样,parameters也需要在创建的时候定义它的数据类型。parameters的数据类型是标准的java的Object。
在ireport中,Parameters的机制是允许用户通过应用程序传递参数致报表当中。在jasperreort中的某个对象中的expression可以通过下面的语法来访问一个当前ireport中存在的parameter:
$Pparameter name。
如果应用程序没有为报表中定义的parameter赋值,那么parameter将会取我们在定义它的时候设置的default value的值。parameters是一个Java Object,所以如果它的类型是Object类型,我们在其default value里写下面的表达式就是错误的:
0.123
你必须要创建一个Object,如:
New Double(0.123)
这种写法就是正确的。
6.2.1、在查询中使用Parameters
Parameters可以用来做SQL查询的条件参数的传递。如果你想根据部门编号(dept_id)得到客户的详细信息 (设计的时候我们是不知道这个部门编号的具体值是多少的).此时我们可以这样组织查询语句:
select * from employee where dept_id=$PdeptId
此时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
6.2.2、在程序里使用Parameters
在应用程序里,如果想把某个值传递到我们的报表中parameters时,我们可以把相关的值放入一个扩展java.util.Map接口类里,然后传入到ireport里。如下面的代码:
...Map hm = new HashMap();...JasperPrint print = JasperFillManager.fillReport(fileName,hm,new JREmptyDataSource());
fillReport是一个关键的方法,它允许你通过一个文件名,一个参数集来传递到我们要调用的报表当中。例-如通过下面的处理方法我们可以让一个处部的传入值作为我们报表的title。
下面的是一个例子:
a).声明一个parameter.这个parameter是java.lang.String 类型,名字为:name_report:
b).将这个parameter拖到page中的titleband.修改上面的程序代码如下:
HashMap hm = new HashMap();hm.put(“name_report”,”report title”);...JasperPrint print = JasperFillManager.fillReport(fileName,hm,new JREmptyDataSource());
运行时效果如下:
一般情况下,我们不需要为报表中的每一个parameters传递一个值,除非某一个parameter一定要从外部程序传入时我们才需为一个parameter设置一个值。如果一个parameter外部门程序没有为其赋值那么ireport将使用Default Value Expression来对一个parameter进行初始化,如果连Default Value Expression没有设置那么它的值就是null。
事实上,对于一个parameters我们不仅仅可以传递一个String,Integer,Boolean等java中小的对象,同时我们还可以利用parameters来传递一些足够大足够复杂的对象,比如一个图像(java.awt.Image),或者通过一个parameters来为一个为子报表提供的datasource 连接等。在用Map类型传递参数时我们要注意传递的参数要与report里的parameters类型保持一致,否则会抛出ClassCastException。
ireport内嵌的Parameters:
ireport提供了一些内建的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. JRDefaultScriptlet. |
IS_IGNORE_PAGINATION | 通过这个参数你可以控制分页功能是打开还是关闭。默认情况下,分页是打开的。但是如果导出为HTML或EXCEL时不进行分页处理。 |
REPORT_LOCALE | 它被用来设置报表所处的地区。如果没有提供地区,那么将采用系统默认的地区。 |
REPORT_TIME_ZONE | 设置报表的时区,如果没提供的话采用系统默认的。 |
REPORT_RESOURCE_BOUNDLE | 为报表指定要加载的资源文件,在国际化一章中介绍了如何使用资源文件来构建报表。 |
6.3、变量(Variables)
Variables是用来存储对某些字段计算后的结果,比如sum等。
和fields,parameters一样,Variables也是有数据类型的。你必须为一个Variable实例声明一个java类型。上图显示了如何创建一个新的Variable。看一下每个字段的意思:
Variable name: variable的名称,我们可以在表达式中通过下面的方法来引用一个Variable:
$Vvariable name
Variable Class Type : variable也可以是任意一个Java类型,在下拉框里你可以看到大多数常用的类型,如java.lang.String等。
Calculation Type : 一个计算类型可以用来计算结果。当一个预先定义的值是“nothing”时,那它的意思是不做任何计算。ireport会根据指定的计算类型和从数据源中获取的每一条记录计算出结果,然后去更改variables的值。做一个变量的计算意为着去执行一个表达式,如果计算类型为nothing,那么ireport将会根据variable expression为variable赋值。计算类型列举如下:
类型 | 说明 |
---|---|
Nothing | 不做任何计算 |
Count | 对记录集数量进行循环累加(计算有多少条记录),这和sum不一样,sum的计算是针对数字的,会对数字进行累加操作。 |
Distinct Count | 也是对计算有多少条记录的累加操作,只是在累加过程中会忽略已经出现的记录(比如某个字段的值已经出现后就不会再记录) |
Sum | 添加每一次表达式(这里的表达式只能是数字类型)迭代的结果到变量中 |
Average | 它用算术的方法来计算表达式累加结果的平均值 |
Lowest | 返回表达式最小值 |
Highest | 返回表达式最大值 |
StandardDeviation | 根据表达式所有值返回标准方差 |
Variance | 返回表达式接收到的值的变化 |
System | 不做任何计算并且表达式也是没有价值的,在这样的用例中,报表引擎仅仅保存内存中variable的最后的值。 |
Reset Type : 重置类型。表示一个变量在什么时候做重置操作。reset类型如下:
类型名称 | 说明 |
---|---|
None | 任何时候都不做重置操作 |
Report | 在报表创建的时候Variable才会对表达式进行初始化 |
Page | Variable的初始化在每一页都做一次reset操作 |
Column | Variable的初始化在每一列都做一次reset操作(这里的Column指的是report里的page的column,每个报表的column可以通过报表的Editàreport properties窗口进行修改) |
Group | Variable的初始化在每一个组都做一次reset操作 |
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.
内置的variables:
和parameters一样,ireport提供了一些内置的variables(这些由报表引擎直接管理),这些变量是只读的,不能被用户修改,如下表所示:
Variable 名称 | 说明 |
---|---|
PAGE_NUMBER | 它包含当前页的页。 |
COLUMN_NUMBER | 它包含当前的列数。 |
REPORT_COUNT | 当前的记录数目 |
PAGE_COUNT | 当前的页号 |
COLUMN_COUNT | 当前的列号 |
在 |
七、栏和组
在本章中,我们将解释如何用iReports去管理bands和groups,在第四章中我们介绍了报表的结构,在本章中我们将要看到如何使用bands来划分报表。同时我们还将看到如何使用groups,如何创建report中的breaks,如何管理subtotals等等。
7.1、栏(Bands)
ireport把一个报表划分成七个主要的bands和一个名为backgroup的band(一共是八个bands),每当我们添加一个group时就会有两个新的band添加到报表当中:group footer bands和group header bands。
点击 按钮在弹出的窗口中我们可以对当前报表所具有的bands的进行相关属性的修改。
通过上图中的窗口,我们可以修改左边列表窗口中的任何一个band的属性,比如它的高(以像素为单位)。Print When expression表示我们可以在这里输入一个表达式,这样我们可以根据表达式的值来控制当前的这个band是否输出。这里需要注意的是Print When expression里必须返回一个java.lang.Boolean类型的对象,如:
New Boolean(true)
上面的表达式说明这个bands总会被打印(如果我们什么都不输入这个就是默认值),在表达式里可以使用fields,variables,parameters。根据这个特性我们可以通过相关的fields,variables,parameters来灵活的控制当前的band是否可以输出,比如下面的代码:
($FSALARY.intValue()>4000?new Boolean(true):newBoolean(false))
上面的代码说明当salary的值如果大于4000就输出当前的band否则就不输出当前的band。
把鼠标移到bands的边上我们可以鼠标拖拉的方式改变band的大小以此来适配band里的内容。
7.2、组(Groups)
Groups允许我们对报表里的数据进行全新的切割分组组合。分组是通过一个表达式来定义的,ireport会通过这个表达式进行计算分组情况,每一个新的组都是从我们在expressionvalue里输入的表达式发生变化的时候开始的。接下来我们将通过一个例子的演示一步一步说明如何使用groups。
假设我们有一个员工的列表,我们想要创建一个根据员工所在的部门进行分组的报表。
a)首先我们打开一个新的报表文件,然后点击Connection/Data Sources,选择JDBC Connection,我们创建一个JDBC的Connection,如下图:
b)点击和工具栏里的按钮,输入查询语句,如下图
c)把Employee_no和Employee_department两个field拖到report 中的detail的band里,同时调整detail band的高度,如下图:
d)保存报表文件,并按浏览报表生成后的效果,如下图:
到这里,我们看到员工的数据已经可以在报表里显示,接下来我们就对员工信息按dept_id字段进行分组显示。
e)点击主工具栏里的按钮,打开groups定义窗口,并添加一个新的名为dept的group,如下图:
一个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这个group时我们在GroupExpression里输入了$FDEPT_ID,表示将该组按员工的DEPT_ID字段进行分组显示。
Group header band height:新产生的header band的高度。
Group footer band height:新产生的footer band的高度。
f)接下来我们把在detail band里的dept_id的field移到report里新产生的deptHeader的band里,
g)点击按钮,报表的生成效果如下:
在jasperreport里group的数量是没有限制的,一个group可以有一个父group同时也可以有若干个子group。通过group定义列表,我们可以通过”move up”和”move down”来设置group的顺序。
*Group* *向导***
在iReport中还有一种简单的方法创建一个group,那就是向导,通过向导我们可以快速的创建一个group,我们可以通过主菜单中的Edit new report groupwizard来启动创建group的向导。
向导允许用户创建最多有四个group的报表(group header,group footer和每一个group关联)。
*Groups**和records*的排序**
我们可以在设置查询的地方选择设置选项来使ireport自动对依据字段进行排序,我们也可以在创建一个group时要对分组的字段做好正确的排序工作。比如在sql中我们可以添加“order by ”来对要分组的字段进行排序。
八、子报表
SubReport是ireport提供的高级功能,通过SubReport,我们可以创建复杂的报表。通过SubReport,我们可以创建一个包含若干个子报表的报表。创建一个包含子报表的报表我们需要三个对象:一个jasper文件,一个包含参数map(当然可以为空)和一个DataSource(数据源,或者是一个JDBC的Connection)。在本章中我们将解释如何通过这三个对象创建一个SubReport并实现在子报表中数据过滤显示的目的。
8.1、创建一个子报表
一个SubReport是一个真正的包含它自己xml文件并且是一个已经编译好的jasper文件。创建一个SubReport就是创建一个普通的报表文件,创建过程中唯一需要注意的是设置SubReport的宽度、高度及一些不需要显示的band,一般情况下对于不显示的band我们把它们的高度都设置为0。在设置子报表的宽度时我们应该考虑到它在父报表中显示时的效果,然后针对这一特性有针对性的去设置。
在父报表中我们要添加一个子报表可以通过iReport中的SubReport工具 来实现。子报表的形状和一个距形类似,我们可以调整SubReport的尺寸和位置以控制子报表的显示。
将一个子报表链接到父报表中需要做三件事情:获得SubReport所对应的jasper报表对象、如何为它提供数据及如何为子报表的parameters设置具体的值。所有这些信息的定义我们可以通过SubReportproperties窗口来实现。
8.2、 传递参数
当我们在应用程序里通过fillReport方法来生成一个报表的时候,我们会提供一个包含参数值的Map一起传递到报表中,包含参数的Map对象是由报表引擎直接管理的。在子报表属性窗口的里的“SubReport”标签里的“Parameters Map Expression”属性,就是提供给我们的最简单的方法来为子报表设置parameters的值,它允许我们定义一个最终可以返回java.util.Map对象的表达式,使用这种方法我们可以把从外部应用程序传到父报表里的parameter对象,当然这个parameter的实际值是一个java.util.Map对象传递给子报表使用(比如$PTestMap),这里我们也可以使用内建的报表parameters:$PREPORT_PARAMETES_MAP把子报表中的java.util.Map对象传递到父报表中供使用。如果该属性我们空着不填那么一个不包含任何值的空的java.util.Map将会被传到子报表中。这种机制的局限性是parameters里所对应的java.util.Map值是死的、不会变的。为了克服这种局限性,jasperreport允许我们定义parameter键值对的时候每个对象的值通过一个表达式来创建,如在图中的“SubReportParameter”表中通过添加个参数java.util.Map来填充子报表。
deptId是子报表中一个parameter的名称,如果设置值时也要与子报表中deptId的数据类型保持一致。
指定数据源
为子报表指定数据源就是告诉jasperreport引擎如何获到数据来填充SubReport。我们可以指定两种类型的数据源:JDBC Connection和DataSource。
使用JDBC来填充报表是很简单的,在Connection Expression里定义一个已经连接到数据库的java.sql.Connection对象。要把一个已经处于打开状态下的连接传到SubReport中我们只需使用一个预定义的包含一个基于从应用程序里调用fillReport方法时的传入的连接REPORT_CONNECTION参数
如果使用一个DataSource就稍微复杂一点,事实上它是一个简单的记录的集合,记录集合的概念和JDBCConnection不同,既然如此我们可以通过一个parameter来传递一个DataSource来填充SubReport,此时采用这种机制内建的parameter REPORT_CONNECTION就不再起作用了。
一个DataSource是一个普通的“消费品”对象仅仅可用来填充一次报表。所以一个作parameter传递的DataSource可以满足一个SubReport的需要。因此parameter的方式不能满足当父报表的每一行记录都有一些子报表的数据与之对应(除非主报表中只有一条记录)。当我们解释DataSource时我们可以看到这个问题可以通过自定义DataSource方式解决。
指定SubReport
创建一个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文件。
8.3、子报表示例(SubReport sample)
在这个例子中我们将采用示例数据库来创建一个简单的包含子报表的报表。我们要从两张表里取数据:dept(部门表)、employee(员工表),要达到的效果是根据部门表的部门ID取出该部门下的所有员工。类似的效果的报表我们在groups一章中使用group也实现了一次,这里我们将用SubReport来实现相同的效果。
新建一个空报表,新建一个名为deptId的parameter对象,如下图:
在这里我们在Default Value Expression里赋予了一个空的字符串,为什么要这样做呢,因为接下来我们要使用该parameter来作为SQL的查询条件的输入值,所以我们要对这个参数赋予一个初始化的值。
点击 打开SQL查询引擎窗口,输入下面的查询语句:
Select * from tb_employee where dept_id=$PdeptId
在这里,我们在查询员工信息的时候加了一个部门的条件,如下图:
此时如果我们把相关的field拖到detail band里,然后点击 我们发现没有任何记录,原因是因为我们并没有为deptId赋值。
保存报表文件,我们命名为emp.jrxml,我们把这个报表文件作为下面将要引用的子报表文件。因为它将作为子报表被引用,所以我们需要调整该报表的不用显示的band的高度及detail band的高度,如下图:
在detail band里我们放置了三个字段:employee_name(员工姓名)、sex(性别)、birthday(出生日期)。
接下来我们需要建立一个父报表,关闭emp.jrxml文件,新建一个空的报表文件,命名为dept.jrxml。点击主工具栏里打开SQL查询窗口,输入下面的语句:
Select * from tb_position
如下图:
把dept_name这个field拖动到报表的detail band里,同时在detail band里添加一个了报表,在弹出的子报表向导中我们选择“Cancel”按钮,这里我们不采用向导来创建SubReport。如下图
双击子报表图标打开子报表属性设置窗口,在弹出的窗口中我们选择“SubReport”标签,在“Connection/DataSource Expression”属性里我们选择“UseConnection Expression”并且指定内建的parameter:REPORT_CONNECTION作为表达式用来存储JDBC连接,如下图:
切换到“Subreport(other)”标签窗口,指定如何找到子报表文件“emp.jasper”以及如何创建和修改在子报表与父报表之间的参数传递。
使用绝对路径在iReport里我们不用去考虑子报表文件是否可以被找到的问题,因为子报表存放的目录已经被自动的加到iReport的classpath里了。这里我们指定的值是“$PSUBREPORT_DIR +java.io.File.separator+"emp.jasper"”
为了在子报表里可以显示员工的信息我们需要为子报表的deptId这个parameter赋值,这里我们通过父报表传过去,在“Subreport parameters”窗口中,我们添加了一个用于为子报表的deptId赋值的parameter,该值到于父报表中的$FDEPT_ID这个field。编译子报表和父报表。
点击主工具栏中的按钮,查看生成的后父报表效果。
九、数据源
一个DataSource是Jasperreport获取数据以生成报表的源。这里有两种类型的DataSource:一种是JDBC Connection,用来从关系型数据库里取数据;另外一种是扩展了JRDataSource接口的java object,这种类型的对象允许我们去管理数据的细节,比如一个xml文件或一个javabean的集合。
通过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自身的一些局限性,比如在交叉报表中使用等。
9.1、iReport中的数据源
iReport允许我们管理和配置不同类型的DataSources用来填充报表。这些DataSources被储存在iReport配置文件中当我们需要的时候即可以使用。
我们可以使用的DataSources类型如下:
- JDBCConnection
- XMLDataSource
- JavaBeanCollection DataSource
- CSVDataSource
- CustomDataSource
- JRDataSourceProvider
- HibernateDataSource
打开状态的JDBC Connection在报表生成的时候会被直接传递到JasperReport中。XML DataSource允许我们从XML文档里获取数据用来填充报表。一个CSV DataSource允许我们打开一个CSV文件来填充报表。JavaBean Collection DataSource,CustomDataSource和JRDataSourceProvider他们允许我们一个写好的java类来获取数据。Hibernate DataSource定义了一个执行HQL语言的方法。DataSource的管理我们可以通过在主菜单“Data Connections/DataSources”(图10.1)打开配置管理DataSource窗口界面。
从技术的角度去看一个Connection和一个DataSource是两个不同的对象(Connection需要一个关系一个关系型数据库,但是一个DataSource只是提供一个简单的接口用来访问数据结构)。
虽然我们可以建立了若干个DataSource准备使用,但是iReport在工作时同一时候总是使用一个DataSource或一个connection。因此你需要设置一个“active”datasource。设置一个dataSource为“active”最简单的方法是在工具条上的下拉框里选择一个你要使用的datasource,那么这个datasource就处于“active”状态了。
同时你也可以从主菜单里的“DataàSet the active connection”在弹出的窗口中选择一个DataSource并设置其为“active”状态。
图62
最后我们还可以在DataSource窗口里通过“set default”来设置“active”状态的DataSource。
如果没有datasource处理“active”处于激活状态,那么iReport里生成的报表里面将不会产生数据。同时当我们使用报表向导的时候要求必须要有一个处于“active”状态的JDBC Connection。
9.2、JDBC连接
一个JDBC Connection允许我们从一个关系型数据库里直接获取数据(需要有一个JDBCDriver)。要添加一个新的JDBC Connection,可以点击“New”按钮打开创建新连接的管理窗口。
选择“Database JDBC Connection”点击“Next”,在出现的窗口中输入数据源的名称及Driver、URL、username,password等相关信息。
点击“test”按钮,对JDBC连接做测试。
完成新建JDBC Connection之后,别忘了在管理窗口中设置Connection的“active”状态。
当报表采用的是一个JDBC Connection创建的时候,用户需要指定一个SQL语句用来从数据库里取出数据。主报表的Connection也可以为其子报表提供服务。例如,JasperReport里的REPORT_CONNECTION,一个java.sqlConnection类型的内建参数对象放在表达式里提供给子报表使用。
$PREPORT_CONNECTION
这个参数包含的是一个正确的从应用程序里传入的java.sql.Connection对象。使用JDBC或一个SQL Connection是一种最简单的最容易的方式用来填充报表,关于创建SQL查询的细节我们将在11章中讲解。
为了可以在报表中使用通过SQL查询出来的fields,我们需要“Register”它们(要注册的可能不是全部是字段,仅仅只是我们在报表中要使用的字段)。对于每一个字段我们需要指定一个名称和字段的类型,下表中显示了SQL类型所对应的Java类型。
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 |
在上面的表当中对于BLOG和CLOB类型和其它的特殊类型如ARRAY、STRUCT,REF等我们没有指定对应的JAVA类型,这是因为这些类型在JasperReports里不能自动管理它们。
9.3、JRDataSource接口
除了使用SQL做为数据源之外,我们还可以使用其它类型的数据源。在使用之前,我们需要明白如何使用JRDataSource接口。对于实现每一个JRDataSource接口的类必须实现两个方法:
Public Boolean next()
Public Object getFieldValue(JRField jrField)
对于第一个方法是用来移动一个虚拟的游标到下一条记录,判断是否还有记录。如果Next方法返回true表示还有记录,否则表示已经没有记录了。
当JasperReports执行next方法时,在报表里声明的所有字段将被赋上相应的值并且所有的表达式重新计算它的值,接下来将决定是否在一个新的group里打印header,是否开始一新的页等。当next方法返回false时,报表的内容也就宣告结束同时开始打印所有的最后的bands(group footer,column footer,last pagefooter 和summary)。很多时候需要调用next方法用来取下一条记录。
当JasperReports调用完成next方法后如果返回true的时候就调用getFieldValue方法。事实上报表里的每一个field在取值的时候都会调用getFieldValue方法(查看第七章看如何声明一个报表的field)。getFieldValue方法返回数据的类型必须与声明的字段类型相匹配,当然如果返回一个null除外。
9.4、使用JavaBean作为数据源
在DataSource里面我们还可以使用一些JavaBean做为数据源来填充数据,这里的JavaBean指的是一个POJO,里面private类型的若干个属性和与之对应的getter方法:
Public
这里的
要创建这种类型的connection我们只需在创建的时候选择“JavaBeans set datasource”
点击“Next”输入“JavaBeans set data source”的名称,JavaBean set datasource使用一个扩展类(一个工厂类)来生成我们所需要的JavaBean对象,然后组合成数据传递到报表当中。输入包含包名的java class名称,它需要有一个static方法产生一个包含若干个javaBean的Collection类型或一个array(Object[])类型。让我们来看看如何去写这个工厂类。
假如你的数据是一个Person对象,它包含两个fields:name和age:
*package* com.asinfo.ccm.model; *import* java.io.Serializable; *public* *class*** Person *implements* Serializable *private* Stringname; *private* *int*** age; *public* Person(String name,*int* age) *this*.age = age; *this*.name = name; *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
*package* com.asinfo.ccm.model; *import* java.util.ArrayList;*import* java.util.Arrays;*import* java.util.Collection;*import* java.util.List; *public* *class*** TestFactory *private* *static*** Person[] data = *new* Person("用户1" ,1), *new* Person("用户2" , 2), *new* Person("用户3" , 3), *new* Person("用户4" , 4), *new* Person("用户5" , 5), *new* Person("用户6" , 6), *new* Person("用户7" , 7), *new* Person("用户8" , 8), *new* Person("用户9" , 9), *new* Person("用户10" , 10) ; *public* *static*** Collection generateCollection() *return* Arrays.asList(data);
我们的DataSource提供了一个包含10个Person类型的JavaBean。使用JavaBean作为DataSource的特点是,它的字段必须通过getter方法暴露在外面,意思是如果我们的JavaBean有一个getXyz方法,那么xyz就是一条记录的field,在我们的例子中我们的是name和age。创建一个新的创建文件,然后添加两个名为name和age的字段:
接下来把这两个字段拖到报表detail当中。
将前面我们做的两个类添加到iReport中的classpath当中。添加一个JavaBean set data source,名为TestBeanDataSource,并将其设置为“active”,如下图:
启动生成报表效果如下:
9.5、JREmptyDataSource
在JasperReports中提供了一个名为JREmptyDataSource特殊的DataSource,这个DataSource是当我们点击 按钮生成报表时调用。这个DataSource的next方法会根据记录的数量返回true,同时每次调用getFieldValue方法时总是返回null值。这种操作有些类似于一些记录没有字段一样,这就是一个空的DataSource。
该项类有两个构造方法:
Public JREmptyDataSource(int count)
Public JREmptyDataSource()
第一个构造方法让我们告诉这个DataSource该返回多少条记录,第二个构造方法会把记录的总数设置为1。
当我们点击按钮生成报表时,我们可以按住shift键来设置报表里产生的空记录数。如下图:
9.6、HQL查询和Hibernate连接
从jasperreports1.2版开始,Jasperreports提供了一种直接使用HQL(Hibernate Query Language)来创建报表。要使用这个功能,首先我们需要设置一个Hibernate connection。把所有的JAVA编译好的类,jar包和使用Hibernate mapping的配置文件放在classpath里。换句话说,iReport必须要保证可以访问所有的你需要使用的*.hbm.xml文件。
把这些对象添加到classpath中的方法是,选择主菜单中的ToolsàClasspath,在弹出的窗口中设置你需要加入到classpath中的对象。
接下来我们需要打开DataSource对话框,点击“New”新建一个DataSource,不过这时我们选择Hibernate connection作为我们的DataSource类别。点击“Next”输入connection的名称。再次点击“Next”进入下上步设置,如下图:
在点击“test”按钮时要保证hibernate.cfg.xml在你的classpath里。
同时设置这个“test hibernate”为active状态。此时iReport仅使用Hibernate Configuration工作。
从主菜单中的ViewàReport query里打开查询窗口,在Query language里我们选择Hibernate QueryLanguage(HQL),然后输入相应的HQL,接下来的工作就像使用SQL一样啦。
9.7、如何实现一个新的JR数据源
有时使用Jasperreports所内置的JRDataSource不能完全满足我们的要求。此时我们可能需要写一个自己的新的JRDataSource。自定义一个JRDataSource并不复杂,事实上创建一个自定义的JRDataSource就是实现JRDataSource接口类,重写里面的next和getFieldValue方法就OK啦。
Package net.sf.jasperreports.enginePublic interface JRDataSourcePublic 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将会根据指定的目录查询文件和文件夹,并且以一个文件数组的形提供出来。
test;java.io.File;net.sf.jasperreports.engine.JRDataSource;net.sf.jasperreports.engine.JRException;net.sf.jasperreports.engine.JRField;JRFileSystemDataSource JRDataSourceFile[] fileArray;index=-1;JRFileSystemDataSource(String path) File f= File(path); (f.exists() && f.isDirectory()) fileArray=f.listFiles(); JRFileSystemDataSource() (".");Object getFieldValue(JRField arg0) JRException File f=fileArray[index]; (f==) ; (arg0.getName().equals("fileName")) f.getName(); (arg0.getName().equals("isDir")) Boolean(f.isDirectory()); (arg0.getName().equals("size")) Long(f.length()); ; next() JRException flag=; index++; (fileArray!= && index<fileArray.length) flag=; flag;
到这里我们自定义的一个JRDataSource已经完成了,接下来我们将会来解释如何在报表中使用我们自己的的DataSource。
为了使用这个DataSource,接下来我们需要编写一个JavaBean set DataSource,这个和我们前面写过的很像,代码如下:
test;net.sf.jasperreports.engine.JRDataSource;TestFileSystemDataSource JRDataSource getFileSystemData() JRFileSystemDataSource("d:/doc");
这个类中的static方法将会被调用,执行并产生一个新的JRFileSystemDataSource对象,同时指定该对象里的文件夹路径为“d:/doc”目录。
接下来我们可以新建一个connection,创建时我们选择“Custom JRDataSource”类型,并设置它的名称为“Test FileSystemDataSource”,如下图:
接下来我们需要在页面中新建三个field,分别是fileName(String),isDir(Boolean),size(Long),并将他们拖到报表的detail band中,如下图:
运行报表,生成效果如下:
对于这种生成的格式,为了美观期间我们可以对其进行格式化。把“目录/文件”拿掉,通过在“文件名”列前面加图片的方式来显示该文件是文件还是文件夹。
在detail里,在fileName列前加一个image对象,并在其Expression里加上如下代码:
($FisDir.booleanValue()?"D:\\iReport-2.0.1\\report test\\folder.gif":"D:\\iReport-2.0.1\\report test\\file.gif")
该句话的含义是:如果isDir返回的为true则输入文件夹图片,否则输入文件图片,如下图:
设置报表的列数为2,报表排版如下:
启动报表,生成的效果如下:
十、国际化
国际化意味着报表可以根据不同的地区显示不同的语言文字。报表所要显示的不同的语言文字是存储在资源文件里。在本章中我们将介绍怎样使用内置函数msg()来处理国际化问题。
10.1、资源文件
当我们想让一个报表实现国际化功能时,我们需要定位所资源文件里的名称字符串,就是label或者叫key,key与value是一对字符串,中间用“=”连接。如:
Title_username=用户名Title_phone=电话号码
保存这些key与value对的文件以“.properties”为后缀。在运行期间,报表引擎将会在classpath里查找以“.properties”结尾的资源文件。如果文件找到了,那么就从文件里读取相应的资源信息。资源文件的指定是通过报表属性窗口的“i18n”来实现的。
一般来说,一个资源文件名的组成包括三个部分:一个是资源文件名,一个是国家地区代码(与文件名之间以“_”连接),最后就是文件的扩展名“.properties”。对于默认的资源文件名来说是没有国家地区代码的。完整的资源文件的格式如下:
比如:
I18nReport_fr_CA_UNIX.propertiesI18nReport_zh_CN.propertiesI18nReport_en.propertiesI18nReport.properties
前面格式里提到的“other code”(比如上面的“_UNIX”)一般不去指定它。
在iReport中,它有能力自己去管理资源文件,资源文件我们需要把它和报表文件(jrxml文件)放在同一目录,并且资源文件的名称也要与报表文件的名称保持一致。
我们可以从主菜单的“EditàInternationalication”的“Localization files”打开资源文件管理窗口。如下图:
我们可以通过“Create New Locale”按钮创建一个新的资源文件。
创建时我们需要指定文件名及国家代码,创建完成之后我可以通过“Modify file”按钮来对资源文件的内容做相应的修改。
10.2、获取本地化字符串
得到资源文件里的key所对应的vlaue我们可以通过下面的方法实现:一种是使用JasperReports内部的表达式str(“key name”),或者是使用表达式$Rkeyname:
$Rtest.name
在JasperReport中的国际化我们可以使用函数msg,通过使用msg函数我们可以对取到的国际化的值做相应的格式化处理。比如我们的资源文件中一个key/value对为:
title=my name is 0
此时我们需要为0指定具体的值,通过使用msg函数我们可以对这里的0进行填值处理:
msg($Rtitle,"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中我们可以指定所在地区,这样我们就可以控制显示的语言。点击主菜单“Buildàset report local or BuildàSet time zone”,在弹出的窗口中我们可以对地区做相应的修改。
十一、脚本
Scriptlet是一个java class用来在报表生成的时候执行特定的动作(比如新页开始的时候或者处理结束的时候)。在本章当中我们将要看如何写一个简单的Scriptlet以及如何在报表里使用它们。
11.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****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 |
当group x调用的时候,并且所有的variables 的resetType为“group”,group x 初始化之前调用 |
After Group |
当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。
十二、模板
在iReport 中最有用的工具之一是使用向导利用templates来创建报表,在本章里我们将解释如何创建一个自定义的templates,如何把它们添加到我们的模版库里。
12.1、模板结构
一个模版文件就是一个普通的jrxml文件。当使用向导创建一个新报表时,选择的模版文件将会被加载,同时会对用户输入地方做相应修改。
有两种类型的模版:columnar 和tabular。columnar是一种用一个静态的text显示field name,同时用一个textfields显示field的值的竖排的记录报表。
而Tabular类型将会像下图这样显示所有记录
模版是一些放在iReport安装目录下templates目录里的jrxml文件。iReport根据文件的名称来决定它是columnar类型还是ta
ireport与jasperreports版本兼容问题
我用的是jasperreports1.0.3版本,那ireport应该用什么版本才可与之兼容?ireport是不是向后兼容的?
还有,不知能否提供一个ireport英文版下载地址?最好能支持jaspoerreports1.0.3版本的
以上是关于jasperreport开发手册--ireport教程的主要内容,如果未能解决你的问题,请参考以下文章
ireport5.1.0和jasperreports5.1.1怎么集成
jasperReport/iReport 子报表显示空白(未显示)