簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI

              近期為完成一個(gè)簡(jiǎn)單的報(bào)表模塊,需求很簡(jiǎn)單,從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)導(dǎo)出到已寫(xiě)好的Excel模版中。
               一開(kāi)始準(zhǔn)備用jfreeReport實(shí)現(xiàn),偶然調(diào)試spring的demo時(shí)發(fā)現(xiàn),countries的例子很好,既有web分頁(yè),又有excel,pdf的輸出,經(jīng)分析例子,spring封裝了poi實(shí)現(xiàn)excel導(dǎo)出,itext實(shí)現(xiàn)pdf輸出。
               1,先來(lái)分析一下poi的一些背景。POI的主頁(yè):
          http://jakarta.apache.org/poi。POI HSSF是當(dāng)今市面上最強(qiáng)大的處理EXCEL表格的java工具,比韓國(guó)人寫(xiě)的那個(gè)JExcelApi或其它幾種工具都要好。而且它是Apache的開(kāi)源項(xiàng)目。當(dāng)然POI HSSF也有缺點(diǎn):不能直接支持EXCEL圖表,API文檔粗糙簡(jiǎn)略,有些類(lèi)和方法需要引用Apache項(xiàng)目中的其它一些包,包與包之間依賴(lài)關(guān)系比較復(fù)雜等等。
          Apache的Jakata項(xiàng)目的POI子項(xiàng)目,目標(biāo)是處理ole2對(duì)象。目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對(duì)象。它不象我們僅僅是用csv生成的沒(méi)有格式的可以由Excel轉(zhuǎn)換的東西,而是真正的Excel對(duì)象,你可以控制一些屬性如sheet,cell等等。這是一個(gè)年輕的項(xiàng)目,所以象HDF這樣直接支持Word對(duì)象的好東西仍然在設(shè)計(jì)中。其它支持word格式的純java方案還有itext,不過(guò)也是仍在奮斗中。但是HSSF已經(jīng)成熟到能夠和足夠我們使用了。另外,無(wú)錫永中Office的實(shí)現(xiàn)方案也是純java的解決方案,不過(guò)那也是完全商業(yè)的產(chǎn)品,并不是公開(kāi)代碼項(xiàng)目。其實(shí),從開(kāi)發(fā)歷史的角度講,在80年代中期starOffice的原作者在德國(guó)成立了StarOffice suite公司,然后到1999年夏天starOffice被sun收購(gòu),再到2000年6月starOffice5.2的發(fā)布;并且從starOffice6.0開(kāi)始,starOffice建立在OpenOffice的api的基礎(chǔ)上,這個(gè)公開(kāi)代碼的office項(xiàng)目已經(jīng)進(jìn)行了很長(zhǎng)的時(shí)間。雖然那是由C++寫(xiě)的,但是POI的代碼部分也是由openOffice改過(guò)來(lái)的。所以,應(yīng)該對(duì)POI充滿足夠的信心。國(guó)內(nèi)已經(jīng)有部分公司在他們的辦公自動(dòng)化等Web項(xiàng)目中使用poi了,如日恒的ioffice,海泰的HTOffice等。java當(dāng)初把核心處理設(shè)成Unicode,帶來(lái)的好處是另代碼適應(yīng)了多語(yǔ)言環(huán)境。然而由于老外的英語(yǔ)只有26個(gè)字母,有些情況下,一些程序員用8位的byte處理,一不小心就去掉了CJK的高位。或者是由于習(xí)慣在程序中采用硬編碼,還有多種原因,使得許多java應(yīng)用在CJK的處理上很煩惱。還好在POI HSSF中考慮到這個(gè)問(wèn)題,可以設(shè)置encoding為雙字節(jié)。編譯好的jar主要有這樣4個(gè):poi包,poi Browser包,poi hdf包,poi hssf例程包。實(shí)際運(yùn)行時(shí),需要有poi包就可以了。如果用Jakarta ant編譯和運(yùn)行,下載apache Jakarta POI的release中的src包,它里面已經(jīng)為你生成好了build文件了。只要運(yùn)行ant就可以了(ant 的安裝和使用在此不說(shuō)了)。如果是用Jbuilder 運(yùn)行,請(qǐng)?jiān)谛陆ǖ捻?xiàng)目中加入poi包。以Jbuilder6為例,選擇Tools菜單項(xiàng)的config libraries...選項(xiàng),新建一個(gè)lib。在彈出的菜單中選擇poi包,如這個(gè)jakarta-poi-1.5.1-final-20020820.jar,把poi添加到j(luò)builder中。然后,右鍵點(diǎn)擊你的項(xiàng)目,在project的properties菜單中path的required Libraries中,點(diǎn)add,添加剛才加入到j(luò)builder中的poi到你現(xiàn)在的項(xiàng)目中。如果你僅僅是為了熟悉POI hssf的使用,可以直接看POI的samples包中的源代碼,并且運(yùn)行它。hssf的各種對(duì)象都有例程的介紹。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14個(gè),生成的目標(biāo)xls都是workbook.xls。如果你想看更多的例程,可以參考hssf的Junit test cases,在poi的包的源代碼中有。hssf都有測(cè)試代碼。
               2 ,poi提供了一個(gè)不錯(cuò)的tutor,教初學(xué)者如何快速上手使用POI HSSF:http
          ://jakarta.apache.org/poi/hssf/quick-guide.html
           建一個(gè)poiDemo的工程,然后把tutor首頁(yè)的例子運(yùn)行一遍,入門(mén)級(jí)別就夠了。其中包括:新建excel文件(WorkBook);新建sheet;開(kāi)辟cell;設(shè)置cell數(shù)據(jù)類(lèi)型和格式;設(shè)置輸出的樣式如對(duì)齊方式,顏色,字體,邊框等;合并單元格;讀取已有excel文件;設(shè)置打印區(qū)域;設(shè)置頁(yè)碼和頁(yè)腳;調(diào)用公式;選中sheet;屏幕縮放;繪圖;插入圖像等等。
             3, spring的對(duì)poi的封裝。在spring-framework-1.2-rc2\src\org\springframework\web\servlet\view\document下有兩個(gè)類(lèi)AbstractExcelView.java和AbstractPdfView.java,其中前者是處理excel的抽象類(lèi),繼承它的時(shí)候,需要實(shí)現(xiàn)抽象方法buildExcelDocument,實(shí)例代碼如下:

           1 protected void buildExcelDocument(
           2
               Map model, HSSFWorkbook workbook,
           3     HttpServletRequest request, HttpServletResponse response) 
          {
           4

           5   //
           Go to the first sheet.
           6   //
           getSheetAt: only if workbook is created from an existing document
           7         // HSSFSheet sheet = workbook.getSheetAt(0);

           8         HSSFSheet sheet = workbook.createSheet("Spring");
           9         sheet.setDefaultColumnWidth(12
          );
          10

          11   // Write a text at A1.

          12   HSSFCell cell = getCell(sheet, 00);
          13   setText(cell, "Spring POI test"
          );
          14

          15   // Write the current date at A2.

          16   HSSFCellStyle dateStyle = workbook.createCellStyle();
          17   dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"
          ));
          18   cell = getCell(sheet, 10
          );
          19   cell.setCellValue(new
           Date());
          20
             cell.setCellStyle(dateStyle);
          21

          22   // Write a number at A3

          23   getCell(sheet, 20).setCellValue(458);
          24

          25   // Write a range of numbers.

          26   HSSFRow sheetRow = sheet.createRow(3);
          27   for (short i = 0; i < 10; i++
          {
          28     sheetRow.createCell(i).setCellValue(i * 10
          );
          29   }

          30 }
          4, 通過(guò)web程序調(diào)用,很多情況需要把生成的excel文件通過(guò)網(wǎng)絡(luò)連接來(lái)輸出,這些spring已經(jīng)替你做好了,所以只要按照spring的調(diào)用標(biāo)準(zhǔn)就可以,我使用的是spring的mvc,實(shí)例代碼如下:
          1protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
          2        List list = (List) request.getSession().getAttribute("list"); //從session中取數(shù)據(jù)list
          3        Map model=new HashMap(); 
          4        model.put("list",list); //將list封裝傳到excelView中
          5        ExcelView ev = this.getExcelView();//ExcelView繼承了AbatractExcelView
          6         return new ModelAndView(ev,model); //跳轉(zhuǎn)頁(yè)面
          7    }
          ok,整個(gè)簡(jiǎn)單的過(guò)程就完成了,你可以根據(jù)自己的需求靈活的在各個(gè)環(huán)節(jié)coding!漂亮的報(bào)表會(huì)讓你興奮不已!


          posted on 2005-12-15 10:05 beyondduke 閱讀(7396) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): 編程隨筆

          評(píng)論

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI 2006-09-14 15:11 gemsword

          非常感謝,正需要這個(gè)東東  回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI 2006-10-08 11:36 wyz

          能發(fā)一個(gè)完整的例子到我的郵箱嗎.萬(wàn)分感謝.
          w-y-z2008@163.com  回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI 2006-12-11 17:26 wr

          能發(fā)一個(gè)完整的例子到我的郵箱嗎.萬(wàn)分感謝.
            回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI[未登錄](méi) 2007-01-18 09:37 Daisy

          http://jakarta.apache.org/poi/hssf/quick-guide.html#FrillsAndFills
          這個(gè)網(wǎng)站還不錯(cuò),可以看看
            回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI 2007-08-09 14:06 tanguojun

          能發(fā)一個(gè)完整的例子到我的郵箱嗎.萬(wàn)分感謝.
          email: guojuntan@126.com  回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI 2007-08-17 12:55 感激...

          感激...  回復(fù)  更多評(píng)論   

          # re: 簡(jiǎn)單EXCEL報(bào)表方案:Spring+POI[未登錄](méi) 2009-08-18 12:02 無(wú)名

          非常感謝  回復(fù)  更多評(píng)論   

          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          公告


          MSN聯(lián)系

          常用鏈接

          留言簿(2)

          隨筆分類(lèi)

          隨筆檔案

          我的連接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 怀宁县| 武城县| 济宁市| 吉林市| 鞍山市| 仙桃市| 玛多县| 龙江县| 五寨县| 无为县| 沿河| 柯坪县| 泽库县| 增城市| 晋江市| 兰西县| 洛扎县| 府谷县| 安溪县| 黎平县| 嘉善县| 柳州市| 五河县| 内江市| 康保县| 庆安县| 自贡市| 时尚| 赣榆县| 东海县| 阳西县| 白银市| 台南县| 隆尧县| 梨树县| 宝坻区| 中阳县| 紫阳县| 桂平市| 绥芬河市| 巴南区|