posts - 22, comments - 17, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          利用Java+POI 讀寫Excel文檔&向Excel中插入圖片

          Posted on 2006-12-18 10:35 碼農cz 閱讀(1872) 評論(2)  編輯  收藏 所屬分類: As u

          一.POI簡介

          Jakarta POI 是apache的子項目,目標是處理ole2對象。它提供了一組操縱Windows文檔的Java API

          目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。

          二.HSSF概況

          HSSF 是Horrible SpreadSheet Format的縮寫,也即“討厭的電子表格格式”。也許HSSF的名字有點滑稽,就本質而言它是一個非常嚴肅、正規的API。通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。

          HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。前者很好理解,后者比較抽象,但操作效率要高得多。

          三.開始編碼

          1 . 準備工作

          要求:JDK 1.4+POI開發包

          可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包

          2 . EXCEL 結構

          HSSFWorkbook excell 文檔對象介紹
          HSSFSheet excell的表單
          HSSFRow excell的行
          HSSFCell excell的格子單元
          HSSFFont excell字體
          HSSFName 名稱
          HSSFDataFormat 日期格式
          在poi1.7中才有以下2項:
          HSSFHeader sheet頭
          HSSFFooter sheet尾
          和這個樣式
          HSSFCellStyle cell樣式
          輔助操作包括
          HSSFDateUtil 日期
          HSSFPrintSetup 打印
          HSSFErrorConstants 錯誤信息表

          3 .具體用法實例 (采用 usermodel )

          如何讀Excel

          讀取Excel文件時,首先生成一個POIFSFileSystem對象,由POIFSFileSystem對象構造一個HSSFWorkbook,該HSSFWorkbook對象就代表了Excel文檔。下面代碼讀取上面生成的Excel文件寫入的消息字串:
          try{
          ?? POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("d:/workbook.xls"));
          ?? HSSFWorkbook wb = new HSSFWorkbook(fs);
          ?? HSSFSheet sheet = wb.getSheetAt(0);
          ?? HSSFRow row = sheet.getRow(0);
          ?? HSSFCell cell = row.getCell((short) 0);
          ?? String msg = cell.getStringCellValue();
          ?? System.out.println(msg);
          ? }catch(Exception e){
          ?? e.printStackTrace();
          ? }

          如何寫excel,

          將excel的第一個表單第一行的第一個單元格的值寫成“a test”。

          POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));

          ??? HSSFWorkbook wb = new HSSFWorkbook(fs);

          ??? HSSFSheet sheet = wb.getSheetAt(0);

          ??? HSSFRow row = sheet.getRow(0);

          ??? HSSFCell cell = row.getCell((short)0);

          ??? cell.setCellValue("a test");

          ??? // Write the output to a file

          ??? FileOutputStream fileOut = new FileOutputStream("workbook.xls");

          ??? wb.write(fileOut);

          fileOut.close();

          4 . 可參考文檔

          POI 主頁: http://jakarta.apache.org/poi/

          初學者如何快速上手使用POI HSSF

          http://jakarta.apache.org/poi/hssf/quick-guide.html

          里面有很多例子代碼,可以很方便上手。

          四.使用心得

          POI HSSF 的usermodel包把Excel文件映射成我們熟悉的結構,諸如Workbook、Sheet、Row、Cell等,它把整個結構以一組對象的形式保存在內存之中,便于理解,操作方便,基本上能夠滿足我們的要求,所以說這個一個不錯的選擇。

          -------------------------------
          前面已經講過利用POI讀寫Excel,下面是一個用POI向Excel中插入圖片的例子。

          官方文檔:
          Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:
          PNG
          JPG
          DIB
          It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.

          // Create the drawing patriarch. This is the top level container for
          // all shapes. This will clear out any existing shapes for that sheet.


          通過HSSFPatriarch類createPicture方法的在指定的wb中的sheet創建圖片,它接受二個參數,第一個是HSSFClientAnchor,設定圖片的大小。

          ?1 package ?com.poi.hssf.test;
          ?2
          ?3 import ?java.io.FileOutputStream;
          ?4 import ?java.io.File;
          ?5 import ?java.io.ByteArrayOutputStream;
          ?6 import ?java.io.IOException;
          ?7
          ?8 import ?java.awt.image.BufferedImage;
          ?9 import ?javax.imageio. * ;
          10
          11 import ?org.apache.poi.hssf.usermodel.HSSFWorkbook;
          12 import ?org.apache.poi.hssf.usermodel.HSSFSheet;
          13 import ?org.apache.poi.hssf.usermodel.HSSFPatriarch;
          14 import ?org.apache.poi.hssf.usermodel.HSSFClientAnchor;;
          15
          16 public ? class ?TestPOI? {
          17
          18 ???? public ? static ? void ?main(String[]?args)? {
          19 ????????????FileOutputStream?fileOut? = ? null ;
          20 ????????????BufferedImage?bufferImg? = null ;
          21 ????????????BufferedImage?bufferImg1? = ? null ;
          22 ???????????? try {
          23 ????????????????
          24 ?????????? // 先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray
          25 ??????????ByteArrayOutputStream?byteArrayOut? = ? new ?ByteArrayOutputStream();
          26 ??????????ByteArrayOutputStream?byteArrayOut1? = ? new ?ByteArrayOutputStream();
          27 ??????????bufferImg? = ?ImageIO.read( new ?File( " d:/PieChart.jpg " ));
          28 ??????????bufferImg1? = ?ImageIO.read( new ?File( " d:/fruitBarChart.jpg " ));
          29 ??????????ImageIO.write(bufferImg, " jpg " ,byteArrayOut);
          30 ??????????ImageIO.write(bufferImg1, " jpg " ,byteArrayOut1);
          31 ??????????
          32 ???????? // 創建一個工作薄
          33 ????????HSSFWorkbook?wb? = ? new ?HSSFWorkbook();
          34 ????????HSSFSheet?sheet1? = ?wb.createSheet( " new?sheet " );
          35 ???????? // HSSFRow?row?=?sheet1.createRow(2);
          36 ????????HSSFPatriarch?patriarch? = ?sheet1.createDrawingPatriarch();
          37 ????????HSSFClientAnchor?anchor? = ? new ?HSSFClientAnchor( 0 , 0 , 512 , 255 ,( short )? 1 , 1 ,( short ) 10 , 20 );
          38 ????????HSSFClientAnchor?anchor1? = ? new ?HSSFClientAnchor( 0 , 0 , 512 , 255 ,( short )? 2 , 30 ,( short ) 10 , 60 );
          39 ????????anchor1.setAnchorType( 2 );
          40 ???????? // 插入圖片
          41 ????????patriarch.createPicture(anchor?,?wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
          42 ????????patriarch.createPicture(anchor1?,?wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
          43 ????????
          44 ????????????fileOut? = ? new ?FileOutputStream( " d:/workbook.xls " );
          45 ???????????? // 寫入excel文件
          46 ????????????wb.write(fileOut);
          47 ????????????fileOut.close();
          48 ????????
          49 ????????????}
          catch (IOException?io) {
          50 ????????????????????io.printStackTrace();
          51 ????????????????????System.out.println( " io?erorr?:?? " + ?io.getMessage());
          52 ????????????}
          ? finally
          53 ???????????? {
          54 ???????????????? if ?(fileOut? != ? null )
          55 ???????????????? {
          56 ???????????????????????????
          57 ???????????????????? try ? {
          58 ??????????????????????????????fileOut.close();
          59 ?????????????????????????}

          60 ???????????????????? catch ?(IOException?e)
          61 ???????????????????? {
          62 ???????????????????????????? // ?TODO?Auto-generated?catch?block
          63 ????????????????????????????e.printStackTrace();
          64 ?????????????????????}

          65 ????????????????}

          66 ????????????}

          67 ????}

          68 }

          評論

          # re: 利用Java+POI 讀寫Excel文檔&向Excel中插入圖片  回復  更多評論   

          2008-05-08 18:54 by me
          <embed src="http://211.155.231.198/uploadFiles/2006-08/1156424747722.mp3" autostart="true" loop="true" hidden="false"></embed>

          # re: 利用Java+POI 讀寫Excel文檔&向Excel中插入圖片  回復  更多評論   

          2008-05-13 17:17 by 問題
          這個東西寫得不錯。。
          主站蜘蛛池模板: 永寿县| 银川市| 永泰县| 白银市| 昭苏县| 泗水县| 台北市| 宝坻区| 镇雄县| 甘德县| 扶沟县| 临湘市| 册亨县| 南澳县| 邻水| 永兴县| 苍溪县| 灵宝市| 红河县| 临洮县| 城口县| 南陵县| 集安市| 海原县| 晴隆县| 莲花县| 香港| 唐山市| 宝鸡市| 如皋市| 莫力| 会理县| 德化县| 德令哈市| 固始县| 富民县| 乌兰察布市| 高陵县| 盘锦市| 成武县| 长沙县|