Java應用Apache POI庫讀取Excel表格文檔的示例。本站提示廣大學習愛好者:(Java應用Apache POI庫讀取Excel表格文檔的示例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java應用Apache POI庫讀取Excel表格文檔的示例正文
Apache POI 是用Java編寫的收費開源的跨平台的 Java API,Apache POI供給API給Java程式對Microsoft Office格局檔案讀和寫的功效。
項面前目今載頁:http://poi.apache.org/download.html
Apache POI 是創立和保護操作各類相符Office Open XML(OOXML)尺度和微軟的OLE 2復合文檔格局(OLE2)的Java API。用它可使用Java讀取和創立,修正MS Excel文件.並且,還可使用Java讀取和創立MS Word和MSPowerPoint文件。Apache POI 供給Java操作Excel處理計劃。
讀取Excel文檔示例
我們應用POI中的HSSFWorkbook來讀取Excel數據。
public void test(File file) throws IOException { InputStream inp = new FileInputStream(file); HSSFWorkbook workbook = new HSSFWorkbook(inp); // workbook...遍歷操作 }
上邊代碼,讀取Excel2003(xls)的文件沒成績,然則一旦讀取的是Excel2007(xlsx)的文件,就會報異常:“The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”
查閱了材料,Excel2007版本的Excel文件須要應用XSSFWorkbook來讀取,以下:
public void test(File file) throws IOException { InputStream inp = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(inp); // workbook...遍歷操作 }
留意:XSSFWorkbook須要額定導入poi-ooxml-3.9-sources.jar和poi-ooxml-schemas-3.9.jar。
如許,Excel2007的導入沒成績了,然則導入Excel2003又報異常。
所以,在導入Excel的時刻,盡可能能斷定導入Excel的版本,挪用分歧的辦法。
我想到過應用文件後綴名來斷定類型,然則假如有人將xlsx的後綴改成xls時,假如應用xlsx的函數來讀取,成果是報錯;固然後綴名對了,然則文件內容編碼等都纰謬。
最初,推舉應用poi-ooxml中的WorkbookFactory.create(inputStream)來創立Workbook,由於HSSFWorkbook和XSSFWorkbook都完成了Workbook接口。代碼以下:
Workbook wb = WorkbookFactory.create(is);
可想而知,在WorkbookFactory.create()函數中,確定有做過對文件類型的斷定,一路來看一下源碼是若何斷定的:
/** * Creates the appropriate HSSFWorkbook / XSSFWorkbook from * the given InputStream. * Your input stream MUST either support mark/reset, or * be wrapped as a {@link PushbackInputStream}! */ public static Workbook create(InputStream inp) throws IOException, InvalidFormatException { // If clearly doesn't do mark/reset, wrap up if(! inp.markSupported()) { inp = new PushbackInputStream(inp, 8); } if(POIFSFileSystem.hasPOIFSHeader(inp)) { return new HSSFWorkbook(inp); } if(POIXMLDocument.hasOOXMLHeader(inp)) { return new XSSFWorkbook(OPCPackage.open(inp)); } throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream"); }
可以看到,有依據文件類型來分離創立適合的Workbook對象。是依據文件的頭部信息去比對停止斷定的,此時,就算改了後綴名,照樣一樣通不外。