一滴水
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
一滴水
閱讀(1022)
評論(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基本配置---[環境搭建](4950)
2.?Ibtis基本配置--[添加ibatis Dao支持](2567)
3.?Struts 中文亂碼問題 Filter解決(1073)
4.?Jakata Poi HSSF:純Java的Excel解決方案 [zz](1022)
5.?FCKEditor 在JSP中使用(857)
主站蜘蛛池模板:
一级做a爰黑人又硬又粗免费看51社区国产精品视
|
亚洲精品午夜视频
|
黄网站色视频免费观看45分钟
|
日韩免费a级毛片无码a∨
|
91亚洲视频在线观看
|
国内精自视频品线六区免费
|
亚洲伊人色一综合网
|
成年女人毛片免费观看97
|
久久水蜜桃亚洲AV无码精品
|
免费v片在线观看无遮挡
|
gogo免费在线观看
|
久久亚洲成a人片
|
69免费视频大片
|
亚洲中文字幕一区精品自拍
|
免费在线观看视频a
|
男女一进一出抽搐免费视频
|
亚洲国产精品高清久久久
|
久久精品免费观看
|
亚洲中文字幕久在线
|
四虎影在线永久免费观看
|
国产在线精品一区免费香蕉
|
亚洲国产精品一区二区久久
|
一二三四在线播放免费观看中文版视频
|
亚洲综合视频在线
|
一个人在线观看视频免费
|
国产成人高清亚洲一区91
|
亚洲人成网站在线播放vr
|
91视频免费网址
|
亚洲av成人一区二区三区观看在线
|
亚洲AⅤ无码一区二区三区在线
|
中文字幕在线视频免费观看
|
亚洲色图视频在线观看
|
免费一级毛片免费播放
|
99久久精品免费视频
|
亚洲AV噜噜一区二区三区
|
国产亚洲无线码一区二区
|
国产精品免费观看久久
|
大地影院MV在线观看视频免费
|
亚洲综合久久一本伊伊区
|
久久亚洲中文字幕精品一区四
|
1000部拍拍拍18勿入免费凤凰福利
|