IBM 电子商务顾问
Austin, TX
2003 年 9 月
©2002 International Business Machines Corporation. All rights reserved
引言
让我们来面对这个问题。世界上不是每个人都了解 SQL。作为一个顾问,我可能得和我的客户组织中各种工作头衔的人打交道。这些人中一部分是有技术头脑的软件工程师,他们很可能会查看一下二进制代码并解决软件错误;而另一部分则是商务专家,他们知道商务的详尽细节,但是对编程却一无所知。在本文中,我们将阐述后者的需求。
商务需求
我曾遇到某些情况,客户想要查看他们 IBM® DB2® Universal Database™ 中的内容但是不知道如何使用 SQL 命令行或不想使用 SQL 命令行。他们想知道是否有一个实用程序可以遍览其 DB2 数据库表并可以产生包含该数据库中数据的 Microsoft® Excel® 电子表格。那么商务专家就可以使用 Microsoft Excel 来进行数据处理(比如求和、平均值等等)和产生报表了。
您将学到什么
在本文中,您将学到如何构建能把 DB2 数据传送给 Microsoft Excel 电子表格的应用程序。我们将利用 JDBC™ 的产品以提供一个不花成本的解决方案。我们也将辅助使用 Apache Software Foundation 的开放式源代码产品。
Apache 的 POI 项目和 HSSF
Apache Software Foundation 曾承担一个称为 POI 的项目,POI 代表 Poor Obfuscation Implementation (不良模糊化实现)。该项目提供 Java™ API 用于处理基于 Microsoft 的 OLE 2 Compound Document 格式的文件格式。该项目分为几个组件,包括一个叫作 HSSF 的组件,它能写 Excel 文件。这就是我们将要使用的组件。您可以在 POI Web 站点上阅读到关于 POI 项目的总体结构的更多信息,网址是 http://jakarta.apache.org/poi/index.html。
HSSF 代表 Horrible Spreadsheet Format(可怕的电子表格格式)。我想不必对此作进一步的解释了吧。
HSSF 组件让程序员使用 Java 来读写 Microsoft Excel 97-2002 文件(以 BIFF8 文件格式)。特别地,您将使用 POI jar 文件中的 org.apache.poi.hssf.usermodel 包。您可以在 http://jakarta.apache.org/builds/jakarta-poi/ 上获得该 JAR 文件。在撰写本文之时,POI 项目的 Apache 是版本 1.5.1。因为 Apache Jakarta 项目的志愿开发人员不断地在更新他们的代码以更好地为开放式源代码团体服务,所以您可能会看到更新的版本。在本文中,因为我们使用的是 POI API 的一些基本产品,所以如果您使用更新的版本应该是没问题的。
通过 HSSF 您可以做什么
HSSF 让您广泛地处理 Excel 文件。您不仅可以简单地写数字和字符串的单元格值(我会在本文中向您展示这个),甚至可以定义行与列的大小,以及格式化单元格的样式(使文本变成粗体或斜体、添加边框等)。
安装和运行该应用程序
此处提供的样本代码从 DB2 表读取数据并写到选定的 Excel 文件中。这里有一个好主意,就是请在我描述该样本代码时大致看一下代码以深入了解它是如何工作的。
确保您的环境设置如下:
您在 Microsoft Windows® 环境中运行 DB2 7.2。虽然我是在 DB2 7.2 上构建我的应用程序的,但是您应该也能够通过 DB2 8.1 来运行该应用程序。
把 db2java.zip 和 POI jar 文件添加到 Java 类路径中。
db2java.zip 包含我们需要的 JDBC API 以与您的 DB2 数据库进行交互。您必须确保您使用的是 JDBC 2。如果不是,则您应运行位于 <DB2INSTALLDIR>\SQLLIB\java12 目录中的 usejdbc2.bat 文件。
POI jar 文件包含您将用来产生 Microsoft Excel 文件的 Apache POI 包(org.apache.poi.hssf.usermodel)。
我使用 IBM WebSphere® Studio Application Developer V5.0 开发了这个应用程序。从最初就使用类似 WebSphere Studio 的 IDE 来处理 DB2Excel 应用程序是个好主意,这样就使您可以一步步遍览代码以正确理解它是如何工作的。您将需要运行的该应用程序的主类位于 DB2Excel.java 中。
一步步执行该应用程序
当您运行 DB2Excel 时必须做的第一件事是登录,见图 1。您通过与 DB2Excel GUI 交互来进行此操作。DB2Excel 的 GUI 是使用 Java Swing 设计的。该应用程序的登录部分由 LoginDialog.java 和 LoginService.java 的代码来处理。类 SQLFacade.java 用于整个应用程序以使程序员避开使用 JDBC API 的复杂性。如果由用户指定的登录属性是有效的,那么 SQLFacade 对象将实例化。此 SQLFacade 对象然后用来与 DB2 数据库数据进行交互。
图 1. 登录
在成功登录后,将提供给您一个屏幕,从中您可以在对于当前连接可用的表中选择一个表,见图 2。
图 2. 选择一个 DB2 表
要收集一系列可用的表,我们利用了 Connection 对象的元数据。您可以在 SQLFacade 类的 getTablesFromDb() 函数中查看这个,如清单 1 所示:
清单 1. getTablesFromDb()
/**
* Queries the database for the tables created by the user
*/
public Object[] getTablesFromDb() throws SQLException
{
DatabaseMetaData md = connection.getMetaData();
String types[] = {"TABLE"};
ResultSet set = md.getTables(null, null, null, types);
List list = new ArrayList();
list.add(NO_TABLE);
while (set.next())
{
list.add(set.getObject(3));
}
set.close();
if (list.size() > 0)
return list.toArray();
else return null;
}
用户必须从下拉列表中选择一个表,然后左键单击 Load Table 按钮,这将把该表数据装入内存。用户可以预览选定表中的数据,见图 3。
图 3. 装入一个表的内容
您可以在清单 2 中所显示的 reloadTableModel 方法的 ResultSetTableModel 类中找到驱动表数据装入过程的代码。
清单 2. reloadTableModel
/**
* reloads the TableModel with the contents of specified tableName
* @param tableName table with which to reload the TableModel
* @exception SQLException if a database error occurs
* @exception ClassNotFoundException
*/
public void reloadTableModel(String tableName) throws SQLException, ClassNotFoundException {
ResultSet rs = null;
this.tableName = tableName;
try
{
rs = sqlFacade.executeQuery("SELECT * from " + tableName);
clearAll();
updateColumnModel(rs.getMetaData());
while (rs.next())
{
ArrayList list = new ArrayList();
for (int i = 1; i <= colCount; i++)
{
Object o = rs.getObject(i);
list.add(o);
}
result.add(list);
rowCount++;
}
fireTableStructureChanged();
}
finally
{
if (rs != null)
{
try
{
rs.close();
}
catch (SQLException se)
{
System.out.println("An error has occurred: " + se);
}
}
}
}
您将注意到一系列 list 用作数据结构以把 DB2 表数据暂时放置在内存中。
在把表装入内存后,用户可以单击 Create My Spreadsheet 按钮以开始从当前表数据创建 Microsoft Excel 电子表格。
提供用户一个 Save 对话框,见图 4。
图 4. 保存到 Excel 文件
在用户选择了目标文件后,控制权就传递给 ExcelFileGenerator 类。就是在这个类中,我们将进行创建“Excel 电子表格”的艰苦工作。特别地,run() 方法是各个操作真正发生的地方。
线程模型只是用来在 Microsoft Excel 文件正在生成的过程中向用户显示进度条(换句话说,就是看起来悦目一些)。
为了节省空间,本文中没有包含整个 run() 方法清单,这样让我们集中在该方法的重要步骤以深入理解我们是如何创建 Excel 电子表格的:
我们使用在 Save 对话框中指定的名称把 FileOutStream 对象实例化。 FileOutputStream fileOut = newFileOutputStream(this.fileName);
然后我们第一次使用 HSSF API 并创建包含具有源表名称的电子表格的工作簿。 HSSFWorkbook wb = new HSSFWorkBook();
HSSFSheet sheet1 = wb.createSheet(this.tableName);
下一步我们在电子表格中创建一行并用我们表的列名称来填充这一行。 HSSFRow row = sheet1.createRow((short)0);
List columnNames = tableModel.getColumnNames();
for (int i=0; i<columnNames.size(); i++)
{
row.createCell((short)i).setCellValue((String)columnNames.get(i));
}
随着整个代码移动,我们随后用表数据来填充该电子表格。以下从 run() 方法抽取的代码就是用来进行这个操作的。您看到的其余代码大部分是和 GUI 相关的。 int rowCount= this.tableModel.getRowCount();
for (int i=0; i<rowCount)
{
List tableData = this.tableModel.getRow(i);
row = sheet1.createRow((short)(i+1));
for (int j=0; j<tableData.size(); j++)
{
String columnData = (String)tableData.get(j);
Row.createCell((short)j).setCellvalue(columnData);
}
}
我们要关闭工作簿和 FileOutPutStream 对象,整个过程结束: wb.write(fileOut);
fileOut.close();
您的劳动成果
如上文提到的那样,会向用户显示一个进度条(如图 5 所示)以让他们知道正在生成 Excel 文件。
图 5. 进度指示器
所有的事情都说了也做了,您应该看到一个 Excel 文件写到了您指定的目标处。图 6 显示了对于我在样本数据库表中具有的数据所产生的 Excel 文件的屏幕快照。
图 6. 由 DB2Excel 产生的样本电子表格
结束语
在本文中,您学习了如何使用 Apache 的 POI 的产品来构建一个应用程序,可以从 DB2 表读取数据并写入 Microsoft Excel 电子表格。POI 是另一个具有代表性的示例,展示了如何利用开放式源代码产品来为您的企业运作创建一些有价值的、强大的应用程序以与您的商业应用程序一起工作,相互促进。可以随意修改 DB2Excel 应用程序以适应您特殊的组织需求。
相关信息
单独下载
描述
文件类型
文件大小
下载方法
db2excel.zip
zip
15 KB
Resources Subgroup of resourcesExplanation of what the resources will provide for the developer. and then list the resources: Title of resource
--关于作者
Kulvir Singh Bhogal 作为 IBM 顾问,在全国的客户站点设计和实现以 Java 为中心的解决方案。您可以通过 kbhogal@us.ibm.com 联系到 Kulvir。