一滴水
java 2006年1月新开始:)
随笔 - 10, 文章 - 2, 评论 - 6, 引用 - 0
数据加载中……
Jakata Poi HSSF:纯Java的Excel解决方案 [zz]
微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel。时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发。然而在要求更高的服务器领域,微软本身的产品移植性不好,性能不佳。
在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开。
或者是:我们已经习惯用Excel打印。这样子如果用.net开发是没有问题的,但是有J2EE这个比.net更有前途的开放式的开发环境,难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做,第2种方案的问题是牺牲了代码的可移植性和稳定性。如果让客户端只负责处理生成好的报表,那将是一种诱人的选择。
Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。
这是一个年轻的项目,所以象HDF这样直接支持Word对象的好东西仍然在设计中。其它支持word格式的纯Java方案还有itext,不过也是仍在奋斗中。但是HSSF已经成熟到能够和足够我们使用了。
其实,从开发历史的角度讲,在80年代中期starOffice的原作者在德国成立了StarOffice suite公司,然后到1999年夏天starOffice被sun收购,再到2000年6月starOffice5.2的发布;并且从starOffice6.0开始,starOffice建立在OpenOffice的api的基础上,这个公开代码的office项目已经进行了很长的时间。虽然那是由C++写的,但是POI的代码部分也是由openOffice改过来的。所以,应该对POI充满足够的信心。国内已经有部分公司在他们的办公自动化等Web项目中使用poi了,如日恒的ioffice,海泰的HTOffice等。
Java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。然而由于老外的英语只有26个字母,有些情况下,一些程序员用8位的byte处理,一不小心就去掉了CJK的高位。或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多Java应用在CJK的处理上很烦恼。还好在POI HSSF中考虑到这个问题,可以设置encoding为双字节。
POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。
如果用Jakarta ant编译和运行,下载apache Jakarta POI的release中的src包,它里面已经为你生成好了build文件了。只要运行ant就可以了(ant 的安装和使用在此不说了)。如果是用Jbuilder 运行,请在新建的项目中加入poi包。
以Jbuilder6为例,选择Tools菜单项的config libraries...选项,新建一个lib。在弹出的菜单中选择poi包,如这个jakarta-poi-1.5.1-final-20020820.jar,把poi添加到jbuilder中。然后,右键点击你的项目,在project的properties菜单中path的required Libraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。
如果你仅仅是为了熟悉POI hssf的使用,可以直接看POI的samples包中的源代码,并且运行它。hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。
这里只对部分例程的实现做介绍。
HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:
HSSFWorkbook excell的文档对象
HSSFSheet excell的表单
HSSFRow excell的行
HSSFCell excell的格子单元
HSSFFont excell字体
HSSFName 名称
HSSFDataFormat 日期格式
在poi1.7中才有以下2项:
HSSFHeader sheet头
HSSFFooter sheet尾
和这个样式
HSSFCellStyle cell样式
辅助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
仔细看org.apache.poi.hssf包的结构,不难发现HSSF的内部实现遵循的是MVC模型。
这里我用Rose把org.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理,详见下面两图:
图1 基本对象
从中不难可以发现每一个基本对象都关联了一个Record对象。Record对象是一个参考Office格式的相关记录。
图2 HSSFWorkbook
HSSFWorkbook即是一个Excell对象。这幅类图体现的是HSSFWorkbook和基本对象的相互关系。可见,许多对象中也建立了Workbook的引用。还需要注意的是在HSSFWorkbook和HSSFSheet中建立了log机制POILogger,而且POILogger也是使用apache Log4J实现的。
先看poi的examples包中提供的最简单的例子,建立一个空xls文件。
import
org.apache.poi.hssf.usermodel.HSSFWorkbook;
import
java.io.FileOutputStream;
import
java.io.IOException;
public
class
NewWorkbook
{
public
static
void
main(String[] args)
throws
IOException
{
HSSFWorkbook wb
=
new
HSSFWorkbook();
//
建立新HSSFWorkbook对象
FileOutputStream fileOut
=
new
FileOutputStream(
"
workbook.xls
"
);
wb.write(fileOut);
//
把Workbook对象输出到文件workbook.xls中
fileOut.close();
}
}
通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。
import
org.apache.poi.hssf.usermodel.
*
;
import
java.io.FileOutputStream;
import
java.io.IOException;
public
class
CreateCells
{
public
static
void
main(String[] args)
throws
IOException
{
HSSFWorkbook wb
=
new
HSSFWorkbook();
//
建立新HSSFWorkbook对象
HSSFSheet sheet
=
wb.createSheet(
"
new sheet
"
);
//
建立新的sheet对象
//
Create a row and put some cells in it.
Rows are
0
based.
HSSFRow row
=
sheet.createRow((
short
)
0
);
//
建立新行
//
Create a cell and put a value in it.
HSSFCell cell
=
row.createCell((
short
)
0
);
//
建立新cell
cell.setCellvalue(
1
);
//
设置cell的整数类型的值
//
Or do it on one line.
row.createCell((
short
)
1
).setCellvalue(
1.2
);
//
设置cell浮点类型的值
row.createCell((
short
)
2
).setCellvalue(
"
test
"
);
//
设置cell字符类型的值
row.createCell((
short
)
3
).setCellvalue(
true
);
//
设置cell布尔类型的值
HSSFCellStyle cellStyle
=
wb.createCellStyle();
//
建立新的cell样式
cellStyle.setDataFormat
(HSSFDataFormat.getFormat(
"
m/d/yy h:mm
"
));
//
设置cell样式为定制的日期格式
HSSFCell dCell
=
row.createCell((
short
)
4
);
dCell.setCellvalue(
new
Date());
//
设置cell为日期类型的值
dCell.setCellStyle(cellStyle);
//
设置该cell日期的显示格式
HSSFCell csCell
=
row.createCell((
short
)
5
);
csCell.setEncoding(HSSFCell.ENCODING_UTF_16);
//
设置cell编码解决中文高位字节截断
csCell.setCellvalue(
"
中文测试_Chinese Words Test
"
);
//
设置中西文结合字符串
row.createCell((
short
)
6
).setCellType
(HSSFCell.CELL_TYPE_ERROR);
//
建立错误cell
//
Write the output to a file
FileOutputStream fileOut
=
new
FileOutputStream(
"
workbook.xls
"
);
wb.write(fileOut);
fileOut.close();
}
}
我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子,我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。
尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。
其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。
如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。
另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。
因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯Java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。
posted on 2006-01-20 13:52
一滴水
阅读(1017)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
Powered by:
BlogJava
Copyright © 一滴水
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2006年1月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔分类
java(4)
(rss)
jsf(1)
(rss)
ORM(3)
(rss)
Spring
(rss)
webwork
(rss)
开发总结(2)
(rss)
文章分类
java(1)
(rss)
java站点
BEA dev2dev 在线
Java examples
Java World
java 开源大全
Java视线论坛
Matrix 与JAVA共舞
SpringFramework中文论坛
搜索
最新评论
1. re: Struts 中文乱码问题 Filter解决[未登录]
呵呵
--测试
2. re: Ibatis基本配置---[环境搭建]
要是有多个sqlMap怎么办??????
--hellodyy
3. re: Ibatis基本配置---[环境搭建]
评论内容较长,点击标题查看
--一滴水[匿名]
4. re: Ibatis基本配置---[环境搭建]
Person.xml文件放到哪个地方
--南极小鸭
5. re: 读取资源文件
评论内容较长,点击标题查看
--Tang Anping
阅读排行榜
1. Ibatis基本配置---[环境搭建](4936)
2. Ibtis基本配置--[添加ibatis Dao支持](2561)
3. Struts 中文乱码问题 Filter解决(1069)
4. Jakata Poi HSSF:纯Java的Excel解决方案 [zz](1017)
5. FCKEditor 在JSP中使用(853)