iReport专题学习之字段、参数04

http://demo.netfoucs.com/xuzheng_java/article/details/22990231

在iReport中有三种类型的对象可以用来保存数据,它们分别是Fields、Parameters、Variables,这三种对象可以用再某些地方的Expression中,通过一定的逻辑在报表生成的时候动态的更改某些之,Fields、Parameters、Variables有类型的概念,它们的类型就是一个标准的java Object对象,要使用这三种类型的对象必须首先创建它,创建的方法就是在Report Inspector面板中选择其中的需要创建的右键--->添加,这样我们可以创建不同的对象,同时我们可以将其展开,对已经存在或者添加的字段、参数、或者变量进行管理,如下图所示,创建了一个test的参数。

选择相应的参数 ,右键,我们可以对其进行修改、删除该对象,接下来我们将对字段、参数、变量进行详细的讲解和学习。


一、字段(Fields)

Field在iReport中是专门用来组织记录,Field的创建有多种途径可以实现,我们可以根据在iReport中各种类型的数据源哎创建我们所需要的Field。

1.1、手动创建Field

在reportinspector面板中选中【Fields】右键添加Field,如下图所示,创建好之后,在右侧会显示该Field所有的属性,我们可以对其进行修改和选择。

一个Field有两个必填的属性:name和type和一个可选项的description,从iReport1.0.0开始,fields可以使任何java数据类型,这样当我 们使用javaBean作为数据源时我们可以很方便的从java.langObject向报表中的Field的转换工作,在对象的Expression里你可以使用下面的语法引用一个Field:

$F{field name}

比如,如果想处理com.saihu.test.domain.Person Bean里的username字段,可以这样去写:

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

1.2、使用SQL Query来创建Field

在iReport的设计中,使用SQL Query的方式来创建或者记录字段是使用最广泛的也是最直接最简单的一种方式,做此操作我们需要首先打开ReportQueryDialog窗口(在report inspector面板中选择reportDemo右键---->report query),在reportQueryDialog窗口出现后,我们可以输入合适的SQL检索并创建Fields。

注意:在打开reportQueryDialog窗口之前,必须确认我们已经有一个数据源连接处于激活状态,激活状态请查看专题其他章节,

插入一条查询语句,如:select * from stud;iReport将启动SQL查询引擎,根据输入的SQL分析结果用fields的形式展示出来,在下面的窗口中选择你要的fields(可以多选),然后点击【ok】按钮,fields就被创建出来了。

在这个例子当中所有字段有多种类型,一般地说,fields的数据类型是构建在原始SQL类型基础之上的,如String、Integer.....

1.3、用JavaBean生成Fields

iReport的高级特性之一是它的数据源除了可以构建在SQL query基础之上外,还可以使用含有getter和setter方法的JavaBean(POJO)对象来创建,在这个例子中fields就是POJO类里的属性(或者属性的属性,即子对象的属性)。

第一步:定义一个简单的Bean

  1. package com.saihu.model;public class ProductBean {  private String productName; public String getProductName() {        return productName; }   public void setProductName(String productName) {        this.productName = productName; }}  

第二步:在iReport中使用JavaBean作为数据源,首先要定义好classpath,以使iRepport能够找到我们定义的Bean,使用菜单【工具】--->【选项】,在弹出对话框之后,选择【Classpath】选项,然后选择【Add Folder】选择JavaBean所在的工程路径下编译后的class文件所在的文件目录,如,在此定义的classpath为D:\myworkspace\my_design\reportDemo\WebRoot\WEB-INF\classes.保存之后,将该classpath选择为默认的classpath路径,如下图所示:

第三步:点击【确定】,在菜单看中选中"Data"---->"Connections/DataSources",添加数据源,将数据源类型设为"JavaBean set data source",设定的数据源属性如下图所示:

四步:点击【next】,对JavaBeans相关参数进行设置,设置好之后,点击【test】进行测试,提示成功即可,如下图所示:

五步:点击【save】保存即可,然后选择【reportDemo】面板中的reportDemo报表,右键选择【Edit Query】,在弹出的Report query对话框中选择【JavaBean DataSource】选项页,在Class name路径下填写刚才上一步填写的全类路径,然后点击【Read ttributes】读取JavaBean的属性,如下图所示:

点击此时【ok】之后,在【report Inspector】面板中的【Fields】中就能看到刚才从JavaBean中读取的字段元素了,如下图所示:

至此,几种添加Fields的方法就介绍到这里,已经能满足我们报表设计的需要了。


二、参数(Parameters)

Parameters通常是用来在打印的时候从程序里传值到报表里,也就是说parameters通常的是起参数传递作用,它们可以被用在一些特定的场合(比如应用中SQL查询的条件),如report中任何一个需要从外部传入的变量等(如一个Image对象所包括的char或者报表title的字符串)。

和使用Fields一样,Parameters也需要在创建的时候定义它的数据类型,parameters的数据类型是标准的java的Object。

在iReport中,parameters的机制是允许用户通过应用程序传递参数至报表当中,在jasperreport中的某个对象的expression可以通过下面的语法来访问一个当前的ireport中存在的parameter:

$p{parameter name}

如果应用程序没有为报表中定义的parameter赋值,那么parameter将会取我们在定义它的时候设置的default value的值,parameter是一个Java Object,所以如果它的类型是Object类型,我们在其default value里写下面的表达式就是错误的:0.123 你必须创建一个Object,如New Double(0.123),这种写法是正确的。

2.1、在查询中使用Parameters

parameters可以用来做SQL查询的条件参数的传递,如果你想根据学生编号(id)得到该学生的详细信息(设计的时候我们是不知道这个学生编号具体值是多少的),此时我们可以这样组织查询语句:

select * from stud where id=$p{studId}

此时SQL查询引擎将会采用PreparedStatement来处理传入的studId值以此作为查询条件参数。

如果你想直接通过parameter值来作为SQL语句的一部分,那么你可以使用下面的特殊语法:$p!{parameter name},这种写法允许你在查询时用parameters的值来替换parameter name,比如,我们有一个具体参数名为MyWhere,其值为:where studId=1,查询写法如下:

select * from stud $p!{MyWhere}

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

select * from stud where studId=1;

2.2、在程序里使用Parameters

在应用程序里,如果想把某个值传递到我们的报表中parameters时,我们可以把相关的值放入一个扩展java.util.Map接口类里,然后传入ireport里,如下面的代码:

Map hm = new HashMap();

JasperPrint print = JaperFillManager.fillReport(fileName,hm,new JREmptyDataSource());

fileReport是一个关键的方法,它允许你通过一个文件名,一个参数集来传递到我们要调用的报表当中,比如通过下面的的处理方法我们可以让一个初步的穿入职作为我们报表的title.

下面的就是一个在实际项目中的例子,首先我们来看看效果图,如下图所示:

上图可以看出,x轴的日期,是我们通过代码传递参数至报表中的,那是一个统计每周的系统存在风险的趋势图,所以它的X轴的时间是随着时间动态变化的,那么我们接下来就来学习代码是如何传递参数至模板的。

第一步:在我们使用iReport设计的报表中,需要添加一个parameter,这个parameter是java.lang.String类型,名字为:data_time

第二步:将这个parameter赋值给上述的Area图中Categroy expression值即可。

第三步:在我们代码中封装该参数,代码程序如下:

HashMap hm = new HashMap();

hm.put("data_time",“04-02”);//传递需要的值

........

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_RESOURCE9_BOUNDLE

为报表指定要加载的资源文件,在国际化一章中介绍了如何使用资源文件来构建报表。

至此介绍了Fields和parameter相关的知识点,由于篇幅关系,变量我们将放到下一个章节详细进行介绍!


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值