在使⽤ireport的过程中,因为各种功能都要百度,但是⼤家使⽤的例⼦⼜千差万别让⼈很苦恼,所以⽤⼀个简单例⼦贯穿的展⽰⼀下ireport的常见功能。
iReport简介
说到iReport不得不先介绍Jasperreport,Jasperreport是⼀个报表制作程序,⽤户需要按照它制定的规则编写 ⼀个XML⽂件,然后得到⽤户需要输出的格式⽂件。它⽀持输出的⽂件格式包括PDF,HTML,XML,XLS,CVS等等。⽽iReport就是⼀个制 作Jasperreport的XML⽂件的可视化开发⼯具。只是⼀个UI。我使⽤的是iReport 3.5.1,使⽤的⽰例数据表如图:
sales表:(⼈名、⼤致结构来⾃帆软电⼦⽂档,如有雷同,⽆意冒犯)
sellers表:
下⾯开始介绍:报表结构
左边是view区,联系着主设计区中的各个band区域的数据,以及参数、变量等。中间是主设计区,通过拖拽控件⾯板可以在此区域进⾏设计,有三种模式:设计(Designer)、源码(Xml)、预览(Preview),设计模式是可视的,源码⽅式可以直接在上修改,预览是对设计好的报表样式进⾏预览,也是⼀个编译的过程;右边是控件⾯板和属性⾯板,可以在此使⽤控件和设置属性。 JasperReport有三个⽅式来保持数据:Field、Paramrter、Variables。
⼀般情况下,Field是⽤作保存从数据源取出来的数据,⽤法是;
Parameter是⽤来占位—我们在设计时往往不知道具体的值,那么⽤⼀个参数来占住它们的位置,在执⾏时,从程序或者数据库中传递对应的参数过来,从⽽实现⼀个动态的过程,⽤法是
Variables是变量,可以将变量⽤于TextFild表达式中,也可以设置它的属性,使它具有⼀些功能,如求和,求平均数等,⽤法是数据源
ireport提供很多种数据源的连接⽅式,
点上⽅的数据库标识就可以设置数据库,下⽅的数据标识⽤来写SQL语句获取数据。
我们这⾥选择jdbc数据连接,mysql连接语句,数据库名称是test
test⼀下是否连通,输⼊数据库密码以后,如果成功会出现提⽰:
⽰例
3.1 简单⽰例
⾸先连接数据库表sales:
点击ok,这时左侧view窗⼝的field区域就得到了取到的数据:
这时,在主设计区域拖拽静态⽂本控件:在column header区域添加列名,然后拖动左侧的field字段到detail域相应的列名下:
3.2 分组⽰例
有时候我们需要分组来观察数据,这时就需要group,我们以区域id来分组,需要注意的是,如果使⽤group分组,需要在⼀开始的sql语句中加上order by语句,否则ireport是不会⾃动分组的。右键添加⼀个分组:
接下来会有⼀个向导,我们根据向导⼀步步操作:
然后下⼀步,完成。
3.3 ⼦表⽅式分组查看
如果不想在sql语句中增加order by语句,那么可以使⽤⼦表的⽅式进⾏分组查看,例如我想在⽗报表master.jasper中查看⼦报表sub_report.jasper的信息,需要⽤到销售情况表sales和员⼯情况表sellers以及⼦报表控件和⼀个参数 area_id。
⾸先建⽴⼦表员⼯信息表sub_report.jasper,新建⼀个参数,作为连接两个表的桥梁:area_id,参数的属性设置如图
主要是要把parameter class设置成与数据库表中同样的类型以防出错。
然后为sub_report绑定数据库表,此时需要注意SQL语句中需要包含我们设定的参数 $P{area_id}
接下来,我们preview⼀下,这时需要给⼀个参数测试,假使我们给定1,结果如图:
这说明分组已经成功,我们下⼀步需要把⼦表与⽗表连接起来。
同样需要新建⼀个报表⽂件master.jasper,为⽅便查看,将区域名称拖⼊detail区域备⽤。
拖拽⼦表控件,根据向导完成⼦表属性设置
(1)选择已有⼦表,注意是选择编译后的⽂件,sub_report.jasper,⽽⾮sub_report.jrxml。如果先建⽗表,在这⾥选择创建⼦表,按照向导创建⼦表,流程如上。
(2)使⽤内建连接参数表达式
(3)设定参数值为本报表中已存在的field域中的$F{area_id}
(4)存储⼦表表达式,事实上,我将⼦表和⽗表已经放在同⼀个⽂件夹中所以不必使⽤绝对路径法,只需存储⼀个路径名称即可
完成,运⾏⼀下:
3.4 图表⽰例 3.4.1 饼图
针对 Pie图表类型,有三个表达式需要我们输⼊:Key,Value 和 Label。表达式 Key 允许你标识 Pie 图⾥的⼀块。如果 Key 的值出现重复, 那么 Label 和 Value的值会关联起来⽤来覆盖 Key 的值。⼀个 Key 值不能为 null。Value 的表达式值指定这个Key 的数字值。Label 表达式的值允许你为并图中每⼀块指定⼀个标签。这个表达式的值是可选的,同时默认值为 key=value ⾸先拖动图表控件,ireport⽀持多种图表,因为⽰例的数据⽐较简单,我们就只说饼图和柱状图。
放好饼图以后,右键chart data,设置图表属性
这⾥需要注意的是,value是⽤来表述你划分饼图关键词的值,本例中,我们根据售货员来销售的苹果汁来划分饼图,那么key就是售货员,他的“值”,也就是苹果销售量就是value,value⼀般要求是数字类型。
如果我们将label表达式换成$F{apple},就会是如下效果:
个⼈认为还是后者⽐较直观。3.4.2 柱状图
过程和饼状图⼀样,效果如下:
显然更复杂的数据⽐较能体现到他的⽤处。
3.5交叉报表
有时候我们不仅需要纵向⽐较数据,也需要同时横向进⾏⽐较,这就⽤到了交叉报表。 交叉报表需要⽤到空间crosstab
我们新建⼀个报表⽂件CrosstabTest,统计⼀下不同区域苹果汁的销售情况,绑好数据表后,拖拽交叉报表控件,根据向导设置: ⾸先选择主报表数据集:
然后,设定⾏参数,我们选择区域id作为分组依据,group2暂时不⽤。
接下来是列参数,选择销售⼈员作为分组依据。
然后是主区数据,我们主要是看不同区域不同销售⼈员苹果汁的销售情况所以选择apple,由于是计数,fuction选择count即可。
最后是布局,crosstab控件会⾃动带⾏总数列总数,可⾃选。
完成:
不在该销售区域的会被标记为0.
此外,iReport还有获取当前时间,获取页数等⼩⼯具可供使⽤,这些⼯具都是基于TextField可以更改表达式进⾏定义。当模板⽂件编译后,可放⾄程序中使⽤,并进⾏参数传递。这是我这⼀段对ireport的摸索,因为数据简单,很多问题还没有发掘出来,有错误和不⾜的地⽅欢迎⼀起讨论改正。
因篇幅问题不能全部显示,请点此查看更多更全内容