级别: 高级 李 忠波 (leigh@vip.sina.com), 资深软件开发师, 安讯(Actuate)上海研发中心
2008 年 8 月 07 日 百灵报表(BIRT)是一个非常实用的开源报表工具,它不仅能满足商业智能领域报表设计的一般需求,还可以通过与 Java 语言相结合,来实现一些更为丰富的个性化报表样式。本文通过一个简单的实例,在 Eclipse 中创建一个单一工程,使用 Java 语言实现百灵报表(BIRT)的事件响应处理程序。引导读者在短时间内对百灵报表(BIRT)有一个初步了解,并掌握使用 Java 语言创建百灵报表(BIRT)事件响应处理程序的基本步骤和调试方法。
概述
在新近发布的 Eclipse Ganymede 软件包站点(参见参考资料中“获得产品和技术”一栏) 上,提供了一个新的软件包 Eclipse IDE for Java and Report Developers(图一),它来自 Eclipse 社区的顶级项目 BIRT(Business Intelligence and Reporting Tools,参见参考资料中“获得产品和技术”一栏)。
图 1. Eclipse Ganymede 软件包站点
这是一个具有强大功能的商业智能报表开发工具,它有一个很好听的中文名字,叫百灵报表。到本文撰写时为止,按照 Eclipse 系列划分,该软件包的最新版本是3.4.0,按照百灵报表(BIRT)的系列划分,它的最新版本是2.3.0。这也就是说,该软件包是由3.4.0的 Eclipse 平台与2.3.0的百灵报表(BIRT)插件的集成而成。本文以下所提到的百灵报表(BIRT)和百灵报表(BIRT)设计器,均指该软件包。
作为一个专门的报表设计工具,开发者使用百灵报表(BIRT)设计器,可以完成大多数商业智能领域的数据模型组建和报表布局设计。但是,在实践中经常会遇到一些比较特殊的个性化需求,很难用一般的设计手段来实现。这往往需要开发者定制相应的报表事件响应处理程序来解决。百灵报表(BIRT)设计器提供了一个 JavaScript 的开发和调试环境,开发者可以很方便地使用 JavaScript 来实现报表的事件响应处理程序。同时,百灵报表(BIRT)也具有直接调用 Java 编写的事件响应处理类的机制,尽管与 JavaScript 相比,使用 Java 来完成这一工作显得有些复杂,但对于习惯使用 Java 语言、或者希望利用丰富的 Java 资源的开发者来说,这种办法是一个相当好的选择。
本文接下来就通过一个简单的实例,在 Eclipse 中创建一个单一工程,引入样例报表,使用 Java 语言实现报表事件响应处理程序。引导读者在短时间内对百灵报表(BIRT)有一个初步了解,并掌握使用 Java 语言创建百灵报表(BIRT)事件响应处理程序的基本步骤和调试方法。本文结尾处提供了示例工程和操作演示的下载。
准备
首先在 Eclipse Ganymede 软件包站点(参见参考资料中“获得产品和技术”一栏) 下载百灵报表(BIRT - Eclipse IDE for Java and Report Developers) ,下载之后解压缩到系统,即完成安装。
建立工程
按照如下步骤,建立一个Java工程,同时引入BIRT Engine API JAR 包。
图 2. 建立工程
1. 启动百灵报表(BIRT),在主菜单中选择 File -> New -> Project... 菜单项,打开 New Project 对话框。
图 3. New Project 对话框
2. 在 New Project 对话框中选择 Java -> Java Project 项目,单击 Next 按钮,打开 New Java Project 对话框。
图 4. New Java Project 对话框
3. 在 Project name 处输入“BirtWithJava”作为项目名称,单击 Next 按钮,打开 Java Settings 对话框。
图 5. Java Settings 对话框
4. 在 Java Settings 对话框中选择 Libraries 页面,单击 Add External JARs... 按钮.
图 6. Libraries 页面
5. 选择 “<百灵报表(BIRT)根目录>/plug-ins/org.eclipse.birt.report.engine_2.3.0.v20080616.jar“ 文件,添加为工程类库。这个 JAR 包文件是百灵报表(BIRT) 的 Engine API。对于不同版本的百灵报表(BIRT),该文件的文件名中所附带的版本信息是不一样的。
图 7. 引入 Engine API
6. 单击 Finish 按钮,当系统提示 “Open Associated Perspective?” 时,单击 Yes 按钮,如下结构的 Java 工程被创建出来。
图 8. BirtWithJava 工程
导入样例报表
按照如下步骤,导入一个样例报表。
图 9. 打开 Show View 对话框
1. 在主菜单中选择 Window -> Show View -> Other... 菜单项,打开 Show View 对话框。
图 10. Show View 对话框
2. 在 Show View 对话框中选择 Report and Chart Design -> Report Examples 项目,单击 OK 按钮,打开 Report Examples 窗口。
图 11. Report Examples 窗口
3. 在 Report Examples 窗口的 Sample Reports 列表中选择 Reporting Feature Examples -> Cross tab -> CrosstabSampleRevenue.rptdesign 项目。这是一个样例报表,它采用交叉表格式来展示一份商品销售情况报告,其数据来自百灵报表(BIRT)内嵌的一个样例数据库。交叉表的具体用法较为复杂,本文不做过多讨论。选择好样例报表后,单击窗口右上角的导入按钮,打开 Project Name 对话框。
图 12. Project Name 对话框
4. 在 Project Name 对话框中输入 BirtWithJava,单击 OK 按钮,系统显示 Project Exists 提示框。
图 13. Project Exists 提示框
5. 在 Project Exists 提示框中单击 Proceed 按钮,将选择的样例报表 CrosstabSampleRevenue.rptdesign 导入到本文的示例工程 BirtWithJava 中。导入成功后,此报表被自动打开。
图 14. 样例报表
6. 单击报表 CrosstabSampleRevenue.rptdesign 的 Preview 页面,预览此报表。
7. 系统显示处理状态,表示正在生成报表,这可能需要等待几十秒钟的时间。
图 15. 预览报表
8. 当系统处理完成后,报表被显示出来。这是一份商品销售报告,显示的是每类商品的季度销售额以及累计情况。接下来,我们尝试用 Java 创建一个事件响应处理类,把每季度销售额在10万美元以上的数据用红色标示出来。
创建 Java 类
按照如下步骤,用 Java 创建百灵报表(BIRT)的事件响应处理程序。
图 16. 创建 Java 类
1. 在主菜单中选择 File -> New -> Class 菜单项,打开 New Java Class 对话框。
图 17. New Java Class 对话框
2. 在 New Java Class 对话框的 Name 处输入 DataItemEventHandler ,作为该事件响应处理类的名字。单击 Browse... 按钮,打开 Superclass Selection 对话框。选择或直接输入 "org.eclipse.birt.report.engine.api.script.eventadapter.DataItemEventAdapter" 作为父类。
3. 单击 Finish 按钮,一个名称为 DataItemEventHandler.java 的文件被创建出来,在这个文件里输入如下代码:
清单 1. 报表事件响应处理类
import org.eclipse.birt.report.engine.api.script.IReportContext;
import org.eclipse.birt.report.engine.api.script.eventadapter.DataItemEventAdapter;
import org.eclipse.birt.report.engine.api.script.instance.IDataItemInstance;
public class DataItemEventHandler extends DataItemEventAdapter {
public void onRender(IDataItemInstance data, IReportContext reportContext) {
super.onRender(data, reportContext);
if (((Double) data.getValue()).doubleValue() > 100000) {
data.getStyle().setColor("red");
}
}
}
|
在上面这段代码中,我们重写了 DataItemEventHandler 类的 onRender 方法。该方法带有两个参数,其中 data 就是当前我们要操作的数据实例,在这里我们通过条件判断来把大于10万美元的数据设置为红色。另外一个参数 reportContext 则是一个全局的上下文对象,利用这个上下文对象,可以在不同的事件响应处理类中传递信息。
4. 确认无误后存盘,报表事件响应处理类创建完成。
Java 类与报表关联
按照如下步骤,将创建好的 Java 事件响应处理类和样例报表关联起来。
图 18. 打开报表属性页面
1. 切换到报表 Layout 页面,在主菜单中选择 Window -> Show View -> Other 菜单项,打开 Show View 对话框。
图 19. Show View 对话框
2. 在 Show View 对话框中选择 Report Design -> Property Editor 项目,单击 OK 按钮,打开 Property Editor 窗口。
图 20. Property Editor 窗口
3. 选中报表设计区中的第一个 revenue 数据项,这就是我们要操作的季度销售数据。
4. 在 Property Editor - Data 窗口左侧选择 Event Handler 页面。
5. 在 Event Handler 页面中,单击 Browse... 按钮,打开 Class Selection 对话框。
图 21. Class Selection 对话框
6. 在 Class Selection 对话框中选择 DataItemEventHandler 类,单击 OK 按钮,完成报表数据项和 Java 事件响应处理类的关联。
图 22. 关联 Java 类
7. 单击报表的 Preview 页面,可以看到10万美元以上的季度销售数据(不包括累计数据)都被标示为红色了。这表明我们定制的 Java 事件响应处理类已经和报表成功关联起来。
图 23. 预览报表
调试 Java 类
对于任何一个开发工作,调试都是不可避免的。百灵报表(BIRT)提供了一个调试器,开发者可以利用这个调试器,对定制的 Java 事件响应处理类进行调试。
1. 在 Java 类 DataItemEventHandle 中设置断点。
图 24. 设置断点
2. 在主菜单中选择 Run -> Debug Configurations... 菜单项,打开 Debug Configurations 对话框。
图 25. Debug Configurations 对话框
3. 在 Debug Configurations 对话框中,选择 Report 列表项目,单击鼠标右键。在弹出菜单中,选择 New 菜单项,创建一个新的调试环境配置 New_configuration。
图 26. 配置调试环境
4. 在 Main 页面中,选择 Debug type 为 Java,并选中 Output 中的 “Open generated file when finished”。
5. 单击 Classpath,打开 Classpath 页面。
图 27. Classpath 页面
6. 在 Classpath 页面中,选中 User Entries 项目,单击 Add Projects... 按钮,打开 Project Selection 对话框。
图 28. Project Selection 对话框
7. 在 Project Selection 对话框中,选择 BirtWithJava 工程项目,单击 OK 按钮,回到 Debug Configurations 对话框。
图 29. Debug Configurations 对话框
8. 在 Debug Configurations 对话框中, 单击 Debug 按钮,开始调试。
9. 系统准备进入调试状态,这可能需要几十秒钟的时间。当提示 “Confirm Perspective Switch” 对话框时,单击 Yes 按钮,进入调试画面。
图 30. 开始调试
10. 系统运行停留在断点处,开始调试。调试完成后,去除断点,单击 Resume (F8) 按钮继续运行,最终生成的报表在外部浏览器中被打开。
图 31. 运行结果
结束语
众所周知, Java 语言具有良好的结构性和丰富的程序资源。利用本文所提供的方法,可以充分提高报表事件响应处理程序的算法复杂性,实现普通设计手段难以达到的效果。但需要注意的是,当设计好的报表被部署到 WEB 时,采用 Java 实现的事件响应处理类是在百灵报表(BIRT)的服务器端被加载和运行的。因此,除非能够保证客户端和服务器端总是运行在同一台计算机上,否则任何试图利用本文所描述的方法,在客户端与用户进行交互的尝试,都有可能导致失败。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 本文用到的示例工程 | birt_with_java.zip | 7KB | HTTP |
|---|
| 本文的操作演示 | birt_with_java.swf | 1588KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | 李忠波是一名中国软件设计师, Sun 公司认证 Java 程序员(SCJP)和开发师(SCJD),Eclipse 开源社区提交者。他有15年以上的软件开发经验,目前专门从事百灵报表(BIRT)设计器的研发工作。
业余爱好自行车、游泳、法律和古典文学。 |
对本文的评价
|