我们对第一部分的内容做个简要的回忆,第一部分主要是介绍使用iReport如何制作一个数据报表,我认为文章比较详细的介绍“如何从零到满足大部分需求报表出现”。但是文中没有涉及Jasperreport的任何内容,目的是让你纯粹的理解如何做报表,因为做报表和把报表内嵌到应用程序编程是可以分工的,便于整合也便于分解。
我们知道 iReport 是一个 Jasperreport 的前端开发工具, iReport 用来制作和预览报表,为应用使用报表提供足够的前端支持。现在简要的介绍 Jasperreport 是如何工作的,这样你可以更好的理解 iReport 是如何帮助 Jasperreport 实现前端的工作,其实这些工作在我们看来就是“脏活”,为什么呢?看看下面的资料就知道了。
通过上图你大概已经明白Jasperreport的工作原理了。首先是要有一个XML文件(一般是以jrxml后缀),那么这个XML文件从那里来呢?做什么用呢? 这个XML文件就是报表的定义文件,整个报表的每一个细节都在这个XML文件之中定义,一个简单报表的xml文件就有几百行,你可以手工编辑这个XML文件(一行一行,一段一段的编辑吧――这就是所谓的“脏活”)。如果是手工制作这个XML文件,单从效率上考虑就不允许,特别是现在很多应用系统的开发时间变得越来越紧张,总是会在时间上出问题。节省时间最好的办法就是充分的利用自动化工具,詹姆斯.马丁的软件工程思想也是反复的强调过程的自动化,如何做到自动化呢?就是充分的利用自动化工具集成到开发流程,说了一大堆不就是为了说要用iReport来做报表吗!这是我们第一部分已经完成的工作,但是这里重要的是理解Jasperreport的工作原理。
2、结合Jbuilder开发胖客户端报表应用
2.1 、建立 Application
参考 Jbuilder 有关资料。只要是普通 Window 窗口应用即可。
2.2 、引入 JasperReports 需要的库文件
通过 jbuilder9 【 Tool 】-【 configure Libraries 】-按最左边的【 New 】-输入一个名称,比如 Report -【 add 】按钮,导航到 iReport 的 lib 目录,把 lib 目录里面的所有文件引入。如图:
按两次 OK 回到 Jbuilder 的开发界面。
2.3 、向工程添加 Report 系列库文件
通过右击工程,选择【 properties 】-【 paths 】 Label -【 Required Libraries 】 Label -【 Add 】按钮-选择“ Report ”-按两次 OK 回到 Jbuilder 的开发界面。这样就添加完成了需要的库文件了。这么做是比较理想的,但是报表运行时可能不需要 iReport 的 lib 下所有的 jar 文件。
2.4 、在主界面上添加需要的组件
在主 Frame 添加一个 Button 和一个 Label 以及一个 TextBox ,当然你也可以通过创建菜单连接,如图:
这个窗体时用来做测试用的,实际的界面可能很复杂,其中的 TextBox 就是为报表的变量做准备的。这里填写的值就是要传递给报表的变量,也就是第一部分定义的带 $P{} 符号的变量,程序会把他们对应起来。 Button 的单击事件代码如下:
/**
* RptDialog 对话框是用来承载报表的显示。
* @param e
*/
void jButton1_actionPerformed(ActionEvent e) {
// 请创建一个对话框类 RptDialog
RptDialog dlg = new RptDialog(this.jGroupID.getText());
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation( (frmSize.width - dlgSize.width) / 2 + loc.x,
(frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show();
}
RptDialog 是接下来制作的一个 Dialog 对象,通过 Jbuilder 新建一个 Dialog 对象并命名 RptDialog 。 RptDialog 的代码如下:
import java.awt.*;
import javax.swing.*;
import dori.jasper.engine.*;
import dori.jasper.view.*;
import dori.jasper.engine.util.JRLoader;
import java.sql.Connection;
import java.io.File;
import java.util.Map;
import java.util.HashMap;
import mytest.trac.CommectionDB;
/**
* <p>Title: RptDialog </p>
* <p>Description: 报表承载对话框 </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: *****</p>
* @author 李克喜
* @version 1.0
*/
public class RptDialog extends JDialog {
JPanel ReportPan = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
//Bug 项目名称
String proname = "";
// 显示报表需要的控件
JRViewer jrview;
public RptDialog(String GroupID) {
proname = GroupID;
try {
jbInit();
pack();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void jbInit() throws Exception {
ReportPan.setLayout(borderLayout1);
getContentPane().add(ReportPan);
// 装载报表 , 在 Jbuilder 工程的目录创建一个 Reports 文件夹,并把报表的 jasper 文件搁置在该文件夹。
String reportPath = System.getProperty("user.dir") + "\\Reports\\ BugsRpt.jasper";
JasperReport jasperReport =
(JasperReport) JRLoader.loadObjectFromLocation(reportPath);
// 创建数据库的连接,参考 java 的 JDBC 编程资料创建连接方式
CommectionDB conndb = new CommectionDB();
// 注意 :这个连接要求与制作报表时使用的连接一致
Connection conn = conndb.getDbConnection();
// 报表配置参数,前文提过的 SQL 语句的 Where 条件参数就是与这里对应。
// 条件的值可能是通过多种方式得到的,比如上一个页面传递过来的
Map parameters = new HashMap();
//ProjectName 就是 iReport 的变量 $P{ProjectName} 的名称,参考第一部分的 5.6 添加参数和使用参
proname 就是从界面上获取的值。
parameters.put("ProjectName ", proname);
JasperPrint jasperPrint =
JasperFillManager.fillReport(
jasperReport,
parameters,
conn
);
// 装载过程,注意其中的红体字部分
jrview = new dori.jasper.view.JRViewer(jasperPrint);
ReportPan.setLayout(borderLayout1);
ReportPan.setPreferredSize(new Dimension(800, 600));
getContentPane().add(ReportPan, BorderLayout.CENTER);
ReportPan.add(jrview,null);
}
}
到这里,所有需要设置和编程的工作基本完成了。
3、
运行
确定数据库已经启动了,在 JBuilder 运行应用程序。在 TextBox 输入有意义的组值,比如“ BugWin 系统”,这是我的测试值,实际情况是根据你的需要来确定的。单击 Button ,系统会弹出对话框,运行结果和第一部分 6.2 、预览报表结果一致。
4、
总结
随着技术的进步,应用环境的不断变化,胖客户端的应用可能会逐渐退出主流,但是它的存在是必要的。所以我要写胖客户端的应用方面的报表使用技术。文中简要明了的介绍了如何使用 Jasperreport 编程报表程序。希望对你有一点帮助。