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。

创建新的空白文档,打开Ireport 用例教程查询窗口并输入:

select , COUNT(*) AS from ORDERS

group by SHIPCOUNTRY

Ireport 用例教程

图11.4

这个想法是制作一个不同国家的销售图表。确定我们的查询ok:iReport将注册选择的字段。拖拽他们到detail中。(图14.1)

Ireport 用例教程

图14.2

重设bands的高度(除了summary和detail)。

选择chart工具并放置一个新的chart到summary中。

Ireport 用例教程

图14.3

iReport将提示你是否需要内部脚本处理:你选择是。从图表窗口选择饼图并按ok按钮。你将看到图14.2的情形。

接下来配置图表,打开元素属性窗口(双击元素),移动到“Chart”选项卡上,选择“Edit chart properties”按钮。

Ireport 用例教程

图14.4

将看到图表管理窗口(同时显示图表元素创建,图14.5)。

Ireport 用例教程

图14.5

这个窗口由三个选项卡组成: Chart type, DataChart details. 第一个可以选择图表的类型:每个图表需要组织级别数据;级别需要通过chart information选择框中列出来的图表。

Ireport 用例教程Ireport 用例教程警告!每次选择不同的图表类型,那么插入到detail选项中data和chart都将被覆盖掉。

这个例子中我们需要标签(Labels)的级数和一个级数值(Serie1)。

移动到Data选项卡。你将看到两行用来输入这两个级的名字,以便满足已选图表的需要(图14.6)。

Ireport 用例教程

图14.6

有许多方法可以创建series。这时我们就用最简单:我们许可iReport管理它为我们。选择“Report series”按钮连接到报表的series管理窗口(图14.5)。

Ireport 用例教程

图14.7

创建一个新的series用“New series”按钮。在图14.8中将看到。指定series名字,设置“Reset When”为<none>并指定你想生成的series的字段的表达式。在我们的例子中有string的series为SHIPCOUNTRY和一个series的完整数字(整数)为Series1。

Ireport 用例教程

图14.8

为了用表达式编辑,在表达式编辑上点鼠标左键选择“

一旦你添加了两个series,回到图14.6窗口选择新的series列表:选择SERIE_COUNTRY作为Labels series和SERIE_ORDERS_COUNT作为Serie1。

警告修改了图表,保存文件和并开始报表用Ireport 用例教程按钮。结果显示在图14.9。

Ireport 用例教程

图14.9

级Series

Series表示一些由字符串或数字值组成的一组值。每个图表需要两个或多个数据的series以便更形象。当你选择图表类型(图14.5),窗口底部的表单可以指定已选择的的图表的series。如果你需要一个饼图(一种图表类似于饼的,我们在先前段落中看到的),需要两个series,分别是LabelsSeries1:这个表单包含了不同图表“片”的标签,后面的值表示片。通常当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对象和和包含在里面的值被打印出来。

Ireport 用例教程

图14.10

自动级

自动series是被iReport完全的管理。仅仅需要用户做的一件事就是定义你想生成的series的值的表达式。例如你想收集到值假设通过一个字段,那么series的表达式就应该是这样的:

$F{MyField}

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)。

Ireport 用例教程

图14.11

图表类型和属性

iReport允许管理六种不同类型的图表,他们中的每一中通过一些属性来定义,这些属性中的一些能定义所有的图表类型,另一些是各自的特性。

如果series表现数据来画一个图表,这些属性可以修改它的样子,可以在图表属性窗口(图14.12)的“Chart Details”选项卡来修改。

Ireport 用例教程

图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标签()。它没有除了公共属性以外的特殊属性。

Ireport 用例教程

图14.13

3D饼图

3D饼图和饼图是一样的,只是使用了三维效果。

Ireport 用例教程

图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

Ireport 用例教程

如果你保持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

Ireport 用例教程

如果你想更形象化不同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

Ireport 用例教程

通常这对(Value, Category)被看成X和Y轴的值。这个series允许为同一个category设置同一个值。

 

 

Plot orientation

Bars方向;以前例子中预先设置的值是vertical,这儿是一个水平方向的例子:

Ireport 用例教程

Foreground Alpha

图表的透明度(适合具有彩色背景)

Value label

Label为axe(XY轴)的值

Category labela

Label 为categories axe

Ireport 用例教程

3D柱状图

Bar3D图表和Bar的特性一样,除了具有三维外表。

Ireport 用例教程

图14.15

线图

线型图表被penalized(处罚)通过使用CategoryDataset ,因为因为最后一个不工作和x,y相陪的值,在Y轴和X轴的“categories”。

Ireport 用例教程

图14.16

和柱状图一样,每个series有相应的颜色,线在“categories”没有有意义数字时被断开。

这个问题将在未来的iReport版本中解释XYDataset的Line Chart。

Line chart和柱状图有一样的附加属性。

区域图

最后一个是区域图。它和Line chart工作原理一样,但X轴和线之间的区域被完全的涂上颜色。通过适当的选择Foreground Alpha属性,可以使图表非常的独特。

Ireport 用例教程

图14.17

此时iReport管理JFreeChart的可能性很小:图表的特性将在未来发布的版本中管理的越多越好。

 

相关文章:

  • 2022-12-23
  • 2021-08-16
  • 2021-04-14
  • 2022-12-23
  • 2021-07-19
  • 2021-10-17
  • 2022-02-16
  • 2022-02-13
猜你喜欢
  • 2021-12-06
  • 2021-06-10
  • 2022-02-07
  • 2021-06-13
  • 2021-09-04
  • 2021-05-31
  • 2021-11-11
相关资源
相似解决方案