<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Rising Sun

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks

    摘要:

    Apache的Jakata項目的POI子項目,目標是處理ole2對象。目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象
    微軟在桌面系統上的成功,令我們不得不大量使用它的辦公產品,如:Word,Excel。時至今日,它的源代碼仍然不公開已封鎖了我們的進一步應用和開發。然而在要求更高的服務器領域,微軟本身的產品移植性不好,??
    性能不佳。在我們實際的開發中,表現層的解決方案雖然有多樣,但是Ie瀏覽器已成為最多人使用的瀏覽器,因為大家都用Windows。在企業辦公系統中,常常有客戶這樣子要求:你要把我們的報表直接用Excel打開?;蛘呤牵何覀円呀浟晳T用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已經成熟到能夠和足夠我們使用了。另外,無錫永中Office的實現方案也是純java的解決方案,不過那也是完全商業的產品,并不是公開代碼項目。其實,從開發歷史的角度講,在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包中的對象反向導入并根據相互關系作了整理,詳見下面兩圖:

    ??IMG ../upload/article/a2005512101549.jpg[/IMG]

    圖1 基本對象

    從中不難可以發現每一個基本對象都關聯了一個Record對象。Record對象是一個參考Office格式的相關記錄。

    ?? IMG ../upload/article/2005512101631.jpg[/IMG]


    圖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-07-26 15:29 brock 閱讀(317) 評論(0)  編輯  收藏 所屬分類: 處理Excel poi
    主站蜘蛛池模板: 亚洲中文字幕一二三四区苍井空| 99亚洲乱人伦aⅴ精品| 亚洲AⅤ优女AV综合久久久| 亚洲大片免费观看| 亚洲欧洲日产韩国在线| 久久精品亚洲AV久久久无码 | 亚洲精品第一国产综合亚AV| 色吊丝免费观看网站| 成人免费区一区二区三区| 人成午夜免费视频在线观看| 精品久久免费视频| 激情97综合亚洲色婷婷五| 亚洲日本在线观看网址| 青青青国产在线观看免费网站 | 老司机精品视频免费| 亚洲精品无码永久在线观看| 亚洲黄色三级视频| 在线亚洲v日韩v| 成人毛片手机版免费看| 久久精品国产精品亚洲艾草网| 亚洲中文字幕久久精品蜜桃 | 在线观看免费人成视频色| 国产亚洲成人久久| 日韩欧美亚洲国产精品字幕久久久 | 亚洲成a人不卡在线观看| 成人毛片免费观看| 成人免费网站视频www| 波多野结衣在线免费观看| 亚洲中文字幕不卡无码| 免费看又黄又无码的网站| 久久亚洲色一区二区三区| 99视频免费播放| 亚洲欧美国产精品专区久久| 国产在线jyzzjyzz免费麻豆| 在线观看亚洲免费视频| 亚洲人成亚洲人成在线观看| 人妻18毛片a级毛片免费看| 亚洲电影国产一区| 国产成人无码区免费内射一片色欲 | 尤物视频在线免费观看| 亚洲男女一区二区三区|