亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

讓POI架起Java與Office之間的橋梁一

2019-11-18 12:26:58
字體:
來源:轉載
供稿:網友

  本文將闡述如何用POI來讀取/寫入完整的Excel文件。
  
  約定:POI項目2.0版現在已經接近正式發行階段,開發進度迅速,不斷有新的功能集成到原有的系統,同時也有對原有系統的修改。
  
  為了保證本文的及時性,本文將按照最近的1.9開發版說明。雖然編譯最近的發行版源代碼也能正常運行,但現在的代碼和2.0的發行版會有一些出入。
  
  一、Excel基礎
  
  Microsoft Excel 97文件格式也被稱為BIFF8,最近版本的Excel只對該格式作了少量的改動。增加對新格式的支持除了增加項目的復雜性之外,唯一的效果也許只是不得不使每個用戶升級代碼,沒有什么實際的好處。
  
  因此,在下文說明中,凡是提到Excel 97格式的地方其實都是指Excel從97到XP的格式。
  
  二、HSSF概況
  
  POI項目實現的Excel 97文件格式稱為HSSF??也許你已經猜到,HSSF是Horrible SPReadSheet Format的縮寫,也即“討厭的電子表格格式”(微軟使某些原本簡單的事情過分復雜,同時又過分簡單地處理了某些原本需要靈活性的事情,讓人不勝佩服?。?br />  
  也許HSSF的名字有點滑稽,就本質而言它是一個非常嚴厲、正規的API。通過HSSF,你可以用純java代碼來讀取、寫入、修改Excel文件。
  
  前面一篇文章提到了POIFS,那么HSSF和POIFS又有什么關系呢?就象其他POI的API一樣,HSSF建立在POIFS的基礎上,因此在HSSF內的有些代碼和前文的某些代碼很相似。不過,當我們編寫基于HSSF API的代碼時,一般不需要了解POIFS API的細節。
  
  HSSF為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。前者很好理解,后者比較抽象,但操作效率要高得多。usermodel主要有org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包實現(在HSSF的早期版本中,org.apache.poi.hssf.eventusermodel屬于eventmodel包)。
  
  usermodel包把Excel文件映射成我們熟悉的結構,諸如Workbook、Sheet、Row、Cell等,它把整個結構以一組對象的形式保存在內存之中。eventusermodel要求用戶熟悉文件格式的底層結構,它的操作風格類似于xml的SAX API和AWT的事件模型(這就是eventusermodel名稱的起源),要把握竅門才能用好。
  
  另外,eventusermodel的API只提供讀取文件的功能,也就是說不能用這個API來修改文件。
  
  三、通過usermodel讀取文件
  
  用HSSF的usermodel讀取文件很簡單。首先創建一個InputStream,然后創建一個HSSFWorkbook:
  
  InputStream myxls = new FileInputStream("workbook.xls"));
  HSSFWorkbook wb   = new HSSFWorkbook(myxls);
  
  有了HSSFWorkbook實例,接下來就可以提取工作表、工作表的行和列,例如:
  
  HSSFSheet sheet = wb.getSheetAt(0);    // 第一個工作表
  HSSFRow row   = sheet.getRow(2);    // 第三行
  HSSFCell cell  = row.getCell((short)3); // 第四個單元格
  
  上面這段代碼提取出第一個工作表第三行第四單元格。利用單元格對象可以獲得它的值,提取單元格的值時請注重它的類型:
  
  if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
  ("單元格是字符串,值是: " + cell.getStringCellValue());
  } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
  ("單元格是數字,值是: " + cell.getCellValue());
  } else () {
  ("單元格的值不是字符串或數值。");
  }
  
  假如搞錯了數據類型,程序將碰到異常。非凡地,用HSSF處理日期數據要小心。Excel內部以數值的形式保存日期數據,區別日期數據的唯一辦法是通過單元格的格式(假如你曾經在Excel中設置過日期格式,應該明白這是什么意思)。
  
  因此,對于包含日期數據的單元格,cell.getCellType()將返回HSSFCell.CELL_TYPE_NUMERIC,不過利用工具函數HSSFDateUtil.isCellDateFormatted(cell)可以判定出單元格的值是否為日期。isCellDateFormatted函數通過比較單元格的日期和Excel的內置日期格式得出結論??可以想象,按照這種判定方法,很多時候isCellDateFormatted函數會返回否定的結論,存在一定的誤判可能。
  
  本文附錄包含了一個在Servlet環境中利用HSSF創建和返回Excel工作簿的實例。
  
  四、通過usermodel寫入文件
  
  寫入XLS文件比讀取XLS文件還要簡單。創建一個HSSFWorkbook實例,然后在適當的時候創建一個把文件寫入磁盤的OutputStream,但延遲到處理結束時創建OutputStream也可以:
  
  HSSFWorkbook wb = new HSSFWorkbook();
  FileOutputStream fileOut
  = new FileOutputStream("workbook.xls");
  wb.write(fileOut);
  fileOut.close();
  
  創建工作表及其內容必須從相應的父對象出發,例如:
  
  HSSFSheet sheet = wb.createSheet();
  HSSFRow row   = sheet.createRow((short)0);
  HSSFCell cell  = row.createCell((short)0);
  cell.setCellValue(1);
  row.createCell((short)1).setCellValue(1.2);
  row.createCell((short)2).setCellValue("一個字符串");
  row.createCell((short)3).setCellValue(true);
  
  假如要設置單元格的樣式,首先要創建一個樣式對象,然后把它指定給一個單元格??或者把它指定給多個具有相同樣式的單元格,例如,假如Excel表格中有一個摘要行,摘要行的數據必須是粗體、斜體,你可以創建一個summaryRowStyle樣式對象,然后把這個樣式指定給所有摘要行上的單元格。
  
  注重,CellFormat和CellStyle對象是工作簿對象的成員,單元格對象只是引用它們。
  ...
  HSSFCellStyle style = workbook.createCellStyle();
  style.setDataFormat
  (HSSFDataFormat.getBuiltinFormat("($#,##0_);[Red]($#,##0)"));
  style.setFillBackgroundColor(HSSFColor.AQUA.index);
  style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
  ...
  someCell.setCellStyle(style);
  someOtherCell.setCellStyle(style);
  
  版本較新的HSSF答應使用數量有限的Excel公式。這一功能目前還是“Beta級質量”,正式使用之前務必仔細測試。指定公式的方式類如:someCell.setCellFormula(SUM(A1:A2:);。
  
  當前,公式中已經可以調用所有內建的函數或操作符,但邏輯操作符和函數(例如IF函數)除外,這部分功能目前還在開發之中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜女人视频在线| 亚洲视频999| 亚洲第一福利网站| 自拍偷拍免费精品| 欧美夫妻性生活视频| 亚洲最大在线视频| 久久亚洲精品国产亚洲老地址| 日本国产一区二区三区| 国内精久久久久久久久久人| 亚洲第一网站男人都懂| 国产精品久久二区| 亚洲性av在线| 91嫩草在线视频| 国产午夜精品理论片a级探花| 久久成人精品电影| 久久色在线播放| 亚洲国产精品嫩草影院久久| 精品成人国产在线观看男人呻吟| 精品视频久久久| 久久av在线看| 97色伦亚洲国产| 最近中文字幕mv在线一区二区三区四区| 欧美亚洲免费电影| 日韩av中文字幕在线| 国产精品www色诱视频| 欧美高清自拍一区| 国产伦精品一区二区三区精品视频| 久久噜噜噜精品国产亚洲综合| 亚洲欧美精品在线| 久久久av电影| 亚洲欧美激情在线视频| 日韩av在线一区| 亚洲欧美国产精品专区久久| 国产一区二区三区在线视频| 亚洲免费视频观看| 九九热r在线视频精品| 亚洲国产成人精品久久| 91精品久久久久久综合乱菊| 亚洲精品视频二区| 久国内精品在线| 亚洲视频在线免费观看| 日韩精品中文字幕视频在线| 55夜色66夜色国产精品视频| 亚洲一区二区少妇| 欧美午夜精品久久久久久人妖| 欧美成人午夜激情| 日韩av手机在线观看| 色综合久久88色综合天天看泰| 久久久精品国产网站| 亚洲国产欧美久久| 日本在线观看天堂男亚洲| 亚洲午夜色婷婷在线| 91精品国产高清久久久久久| 日韩免费av一区二区| 久久精品国产久精国产一老狼| 亚洲精品ady| 性欧美亚洲xxxx乳在线观看| www.日本久久久久com.| 欧美一区二区三区艳史| 国产精品久久久久久久久免费看| 亚洲精品视频在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情亚洲激情| 日韩av免费一区| 成人久久一区二区三区| 国产成人亚洲精品| 日本不卡高字幕在线2019| 亚洲激情第一页| 欧美成人全部免费| 欧美大片免费观看| 午夜伦理精品一区| 精品中文字幕视频| 青青久久av北条麻妃黑人| 久久香蕉精品香蕉| 亚洲深夜福利在线| 91精品国产色综合久久不卡98| 亚洲欧美另类在线观看| 久久人体大胆视频| 国产精品夜间视频香蕉| 日韩精品久久久久久久玫瑰园| 日韩在线观看成人| 国产亚洲成精品久久| 欧美视频一二三| 亚洲国产精品国自产拍av秋霞| 亚洲一区二区三区久久| 久久久国产精品视频| 欧美黑人性猛交| 亚洲国产欧美一区二区丝袜黑人| 狠狠干狠狠久久| 91在线|亚洲| 欧美性xxxxx极品| 福利一区福利二区微拍刺激| 国产精品网站入口| 91免费综合在线| 亚洲欧美日韩精品| 97视频com| 综合久久五月天| 国产精品91久久| 欧美国产日韩xxxxx| 国产91色在线| 欧美激情视频三区| 欧美一区第一页| 欧美日韩亚洲系列| 日韩免费中文字幕| 欧美午夜美女看片| 91精品久久久久久久久青青| 亚洲欧美在线免费观看| 亚洲一区二区自拍| 97视频在线观看免费高清完整版在线观看| 中文字幕久精品免费视频| 亚洲成人精品视频| 日韩高清中文字幕| 欧美成aaa人片免费看| 国产精品一二三在线| 国产精品视频午夜| 97激碰免费视频| 久久久av网站| 欧美电影院免费观看| 91系列在线观看| 国产精品黄页免费高清在线观看| 久久精品视频99| 成人精品在线观看| 国产va免费精品高清在线观看| 另类少妇人与禽zozz0性伦| 亚洲精品女av网站| 国产精品爱啪在线线免费观看| 国产一区二中文字幕在线看| 日本视频久久久| 日韩av有码在线| 亚洲精品久久久久久下一站| 色婷婷成人综合| 国产精品99久久久久久www| 伊人久久久久久久久久| www国产精品com| 日韩美女av在线免费观看| 国产精品欧美日韩久久| 一区二区三区精品99久久| 色哟哟入口国产精品| 永久免费精品影视网站| 欧洲午夜精品久久久| 国产在线高清精品| 亚洲已满18点击进入在线看片| 欧美日韩一区二区精品| 久久久久久久一区二区三区| 久久久精品免费| 萌白酱国产一区二区| 亚洲国产精品yw在线观看| 国产a级全部精品| 国产日韩欧美中文| 久久久精品影院| 亚洲字幕一区二区| 久色乳综合思思在线视频| 国产精品美女久久久免费| 国产精品最新在线观看| 性欧美xxxx视频在线观看| 国产精品一区二区在线| 亚洲一区二区久久| 亚洲第一男人天堂| 亚洲欧美制服综合另类| 国产精品狼人色视频一区| 美女扒开尿口让男人操亚洲视频网站| 国产97在线|日韩| 欧美日韩国产页| 在线视频中文亚洲|