Ireport 用例教程
JasperReports不是天生就支持显示图表的:他们被单独的生成,用一个或多个java open-source 库来生成图表和作为一个图形元素来显示图片。这个想法非常的简单,然而制作图表在run-time就需要非常好JasperReports 设计技术。需要用脚本来收集显示在图表上的数据。
使用0.4.0版本,iReport有一个无返回值的图表工具。用这个工具就可以通过配置主要的属性和查找数据来打印图表,更加的简单化。图表的创建就完全依靠一个名叫JFreeCharts(0.9.21版本)的java open-source库,它是由Object Refinery Limited的David Gilbert开发的,仅有少数的图表属性,但可以创建一个清晰的报表。
创建一个简单的图表
这段我们就来学习chart工具一步一步的创建一个包括3D饼图表,然后我们分析所有的chart管理的细节。
这个例子我们使用HSQLDB中的Northwind数据库作为datasource。
创建新的空白文档,打开查询窗口并输入:
select , COUNT(*) AS from ORDERS
group by SHIPCOUNTRY
图11.4
这个想法是制作一个不同国家的销售图表。确定我们的查询ok:iReport将注册选择的字段。拖拽他们到detail中。(图14.1)
图14.2
重设bands的高度(除了summary和detail)。
选择chart工具并放置一个新的chart到summary中。
图14.3
iReport将提示你是否需要内部脚本处理:你选择是。从图表窗口选择饼图并按ok按钮。你将看到图14.2的情形。
接下来配置图表,打开元素属性窗口(双击元素),移动到“Chart”选项卡上,选择“Edit chart properties”按钮。
图14.4
将看到图表管理窗口(同时显示图表元素创建,图14.5)。
图14.5
这个窗口由三个选项卡组成: Chart type, Data和Chart details. 第一个可以选择图表的类型:每个图表需要组织级别数据;级别需要通过chart information选择框中列出来的图表。
警告!每次选择不同的图表类型,那么插入到detail选项中data和chart都将被覆盖掉。
这个例子中我们需要标签(Labels)的级数和一个级数值(Serie1)。
移动到Data选项卡。你将看到两行用来输入这两个级的名字,以便满足已选图表的需要(图14.6)。
图14.6
有许多方法可以创建series。这时我们就用最简单:我们许可iReport管理它为我们。选择“Report series”按钮连接到报表的series管理窗口(图14.5)。
图14.7
创建一个新的series用“New series”按钮。在图14.8中将看到。指定series名字,设置“Reset When”为<none>,并指定你想生成的series的字段的表达式。在我们的例子中有string的series为SHIPCOUNTRY和一个series的完整数字(整数)为Series1。
图14.8
为了用表达式编辑,在表达式编辑上点鼠标左键选择“
一旦你添加了两个series,回到图14.6窗口选择新的series列表:选择SERIE_COUNTRY作为Labels series和SERIE_ORDERS_COUNT作为Serie1。
警告修改了图表,保存文件和并开始报表用按钮。结果显示在图14.9。
图14.9
级Series
Series表示一些由字符串或数字值组成的一组值。每个图表需要两个或多个数据的series以便更形象。当你选择图表类型(图14.5),窗口底部的表单可以指定已选择的的图表的series。如果你需要一个饼图(一种图表类似于饼的,我们在先前段落中看到的),需要两个series,分别是Labels和Series1:这个表单包含了不同图表“片”的标签,后面的值表示片。通常当series的标签是“Labels“时,iReport期望series被composed通过设置string对象,另外还有numeric对象(像double或integer)。所有的series关联到同一个图表,并有同一个元素号码。
Series是一个简单的java vector(java.util.Vector)。它可能让iReport自动重建一个或多个series(查看前一段)通过脚本;如果你想更多的控制series(例如当你想创建图表在报表的不同地方),可能要手工的来管理,通过使用IReportScriptlet类的一些方法来放置series。
IReportScriptlet提供一个方法来得到series内容:getSerie()。这个表达式是用来打印series的内容到textfield:
""+((it.businesslogic.ireport.IReportScriptlet)
$P{REPORT_SCRIPTLET}).(“<seriesName>”)
getSerie方法返回对象,它里面包含了由空字符串联起来的字符串内容。图14.10显示了使用getSerie的例子:每次迭加期间,series对象和和包含在里面的值被打印出来。
图14.10
自动级
自动series是被iReport完全的管理。仅仅需要用户做的一件事就是定义你想生成的series的值的表达式。例如你想收集到值假设通过一个字段,那么series的表达式就应该是这样的:
MyField是一个字段名。
要创建自动的series,选择菜单View → Report Serie. 这种方式可以得到公告在报表中的series的列表。按New series按钮来创建一个新的series,依照这章前面的例子来创建。
automatic series 存储了从datasource读取的行的数目的一个数字,或者是最后的重设置的series。如果“Reset when“值为series是<none>,在报表的最后series将准确的包含一个和从datasource读取的数字一样的值。“Reset when” 可能是<none> 对报表的组的名字:在这个例子中每次重设series,组的表达式都被改变。
手动级
如果automatic series创建机制不适合去创建我们感兴趣的收集(例如,你想创建一个group subtotals 的series),就需要手工填充一些series。Series仅仅是一个简单的Vector:IReportScriptlet处理你的配置两个方法来管理Vector,你的series将表现的。这个方法是:
public Boolean (String serieName, Object value)
public Boolean (String serieName)
前一个方法允许你添加一个值到指定的series,后一个方法允许你删除series包含的所有的值。
这两个方法都返回boolean对象的值为false。在JasperReports中不可能执行任意的没有用脚本的java指令(像需要填充series的)。然而,下面我们将介绍一个比较游泳技巧来避免这种局限性。这个想法就是在报表中插入一个假的元素,它将永远不会被打印:在这个元素的“printWhenExpression”将执行返回对象值是false的代码。这儿是一个可能的表达式:
((it.businesslogic.ireport.IReportScriptlet)
$P{REPORT_SCRIPTLET}). (“TEST”,”ciao”)
这个结果是一个值为false的boolean对象,但是当你用方法添加一个新的元素到“TEST”series时,将被初始化。Manual series没有在任何地方被公告;他们被创建了,如果不存在,在第一次运行方法。
现在,让我们看一个简单的例子来模仿这种automatic series的手动机制;创建一个空白文档并设置查询SELECT * FROM ORDERS;
表ORDERS有不同的字段,我们想收集记录中的SHIPCITY字段的假值,并保存名为“TEST”的series的顺序。在detail中插入一小行(line元素),将元素的PrintWhenExpression写入。
((it.businesslogic.ireport.IReportScriptlet)
$P{REPORT_SCRIPTLET}).("TEST",$F{SHIPCITY})
选择属性以便JasperReport在没有插入line元素时正常运转。
在summary插入一个text元素,那儿将表示已经创建的series。就这样做,用这个表达式为被指定为“TEST”的series的打印:
""+((it.businesslogic.ireport.IReportScriptlet)
$P{REPORT_SCRIPTLET}).(“TEST”)
结果将是一个空白的detail在报表的最后,所有的城市列表将按照已选择的顺序打印。
通常,一个元素被加到series,这个series被指定当JasperReports求printWhenExpression的值时,在这儿将插入调用的方法,此时假元素也包含在PrintWhenExpression中被报表引擎遇到;在这个例子中,这个元素通过放置在detail band的line表现。配置同样的元素在不同的band(例如page footer),那么series也就不同了(具体来说就是它被composed通过每页最后一行的元素)。
除非允许准确控制当添加元素到series时,用这个表达式加这个值在这种情形下,
考虑一下下面的表达式例子:
new Boolean(
($F{SHIPCITY} != null && $F{SHIPCITY}.length() > 3) &&
(((it.businesslogic.ireport.IReportScriptlet)
$P{REPORT_SCRIPTLET}).("TEST",$F{SHIPCITY})
.booleanValue()))
以上可以简化为:
new Boolean( <expression> && false )
<expression> 表示:
($F{SHIPCITY} != null && $F{SHIPCITY}.length() > 3)
FALSE通常调用addValueSerie方法。这两个表达式都是true的话就返回true,如果JVM校验<expression>结果失败,它将不会继续为第二个表达式赋值,以避免去执行addValueSerie方法并发挥false。
Series被识别为简单的字符串,series号也是任意定义的。
“ghost”元素能欺骗addValueSerie方法的执行来重设series的值,通过调用方法。
这些调用被引见在表达式编辑器的规则中(图14.11)。
图14.11
图表类型和属性
iReport允许管理六种不同类型的图表,他们中的每一中通过一些属性来定义,这些属性中的一些能定义所有的图表类型,另一些是各自的特性。
如果series表现数据来画一个图表,这些属性可以修改它的样子,可以在图表属性窗口(图14.12)的“Chart Details”选项卡来修改。
图14.12
以下是对所有图表的通用属性的概括。
|
|
|
Width |
图表的像素宽度,通常也是元素的宽度 |
|
Height |
图表的像素高,通常也是元素的高度 |
|
Zoom |
表示图表图象质量的要素:预置值是2,也就是图表图片的高度和宽度都为2。 |
|
Chart title |
图表的标题,如果不指定,图表就没有标题 |
|
Subtitle |
图表的副标题,如果不指定,图表就没有副标题 |
|
Title position |
依照图表确定标题的位置;能值是: Top, Bottom, Left和Right和显示图象的位置: |
| |
|
Chart Background |
图表的背景色(包括画title,legend, 等时) |
|
Plot Background |
图表的背景色(图表轴之间的扁平区域) |
|
Antialias |
指定是否使用平滑 |
|
Show tooltips |
指定是否显示tooltip,这是一个****的标签用来显示图表点的值(或者是用来说明饼图的薄片) |
|
Show legend |
指定时候显示图例 |
表格14.1
饼图
饼图是最简单的图表在iReport中,它可以形象化的用数字表示series()用series标签()。它没有除了公共属性以外的特殊属性。
图14.13
3D饼图
3D饼图和饼图是一样的,只是使用了三维效果。
图14.14
|
|
Depth factor |
表示饼图的高度值(图14.14使用的值是0.2) |
Foreground Alpha |
图表的透明度(图14.14使用的值是0.33) |
柱状图
在iReport中除了饼图(简单和3D),其他所有图表都使用CategoryDataset数据结构,它是以种类组成的一组series值。为柱状图表,也为其他图表,需要三级值:, 和。他们被解释以下面的方法:每个和series相关的作为同一类别。如果你仅仅想要一组值,series是一样,而类型是变化的。
|
|
|
1.0 |
Serie 1 |
C1 |
4.0 |
Serie 1 |
C2 |
3.0 |
Serie 1 |
C3 |
5.0 |
Serie 1 |
C4 |
5.0 |
Serie 1 |
C5 |
7.0 |
Serie 1 |
C6 |
7.0 |
Serie 1 |
C7 |
8.0 |
Serie 1 |
C8 |
如果你保持category的数量和改变series,你将有仅仅一个标签(category值)和一种颜色为每个series:
|
|
|
1.0 |
Serie 1 |
Type 1 |
4.0 |
Serie 2 |
Type 1 |
3.0 |
Serie 3 |
Type 1 |
5.0 |
Serie 4 |
Type 1 |
5.0 |
Serie 5 |
Type 1 |
7.0 |
Serie 6 |
Type 1 |
7.0 |
Serie 7 |
Type 1 |
8.0 |
Serie 8 |
Type 1 |
如果你想更形象化不同categories,你需要指出series和categories所属的每个值。
|
|
|
1.0 |
Serie 1 |
Type 1 |
4.0 |
Serie 2 |
Type 1 |
3.0 |
Serie 3 |
Type 1 |
5.0 |
Serie 4 |
Type 1 |
5.0 |
Serie 1 |
Type 2 |
7.0 |
Serie 2 |
Type 2 |
7.0 |
Serie 3 |
Type 2 |
8.0 |
Serie 4 |
Type 2 |
通常这对(Value, Category)被看成X和Y轴的值。这个series允许为同一个category设置同一个值。
|
|
Plot orientation |
Bars方向;以前例子中预先设置的值是vertical,这儿是一个水平方向的例子: |
Foreground Alpha |
图表的透明度(适合具有彩色背景) |
Value label |
Label为axe(XY轴)的值 |
Category labela |
Label 为categories axe |
3D柱状图
Bar3D图表和Bar的特性一样,除了具有三维外表。
图14.15
线图
线型图表被penalized(处罚)通过使用CategoryDataset ,因为因为最后一个不工作和x,y相陪的值,在Y轴和X轴的“categories”。
图14.16
和柱状图一样,每个series有相应的颜色,线在“categories”没有有意义数字时被断开。
这个问题将在未来的iReport版本中解释XYDataset的Line Chart。
Line chart和柱状图有一样的附加属性。
区域图
最后一个是区域图。它和Line chart工作原理一样,但X轴和线之间的区域被完全的涂上颜色。通过适当的选择Foreground Alpha属性,可以使图表非常的独特。
图14.17
此时iReport管理JFreeChart的可能性很小:图表的特性将在未来发布的版本中管理的越多越好。