一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java使用Apache POI庫讀取Excel表格文檔的示例

Java使用Apache POI庫讀取Excel表格文檔的示例

2020-05-15 10:57it_wangxiangpan JAVA教程

POI庫是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫,這里我們就來看一下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解決方案。

  • HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能。
  • XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。
  • HWPF - 提供讀寫Microsoft Word DOC格式檔案的功能。
  • HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
  • HDGF - 提供讀Microsoft Visio格式檔案的功能。
  • HPBF - 提供讀Microsoft Publisher格式檔案的功能。
  • HSMF - 提供讀Microsoft Outlook格式檔案的功能。

讀取Excel文檔示例
我們使用POI中的HSSFWorkbook來讀取Excel數據。

?
1
2
3
4
5
6
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來讀取,如下:

?
1
2
3
4
5
6
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接口。代碼如下:

?
1
Workbook wb = WorkbookFactory.create(is);

可想而知,在WorkbookFactory.create()函數中,肯定有做過對文件類型的判斷,一起來看一下源碼是如何判斷的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
   * 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對象。是根據文件的頭部信息去比對進行判斷的,此時,就算改了后綴名,還是一樣通不過。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品suv一区二区三区 | 国产99精品视频 | 亚洲精品一区二区久久久久 | 500福利第一巨人导航 | 日本三级在线观看免费 | 男生和老师一起差差差 | 91久操 | 二次元美女挤奶漫画 | 日韩视频免费观看 | 亚洲九九爱 | 国产一区私人高清影院 | 91交换论坛| 精品在线免费观看 | 帅老头恋帅老头同性tv | 欧美18一19性高清hd4k | 国产欧美日韩精品一区二区三区 | 国产精品国产精品国产三级普 | 全肉np巨肉一女np高h双龙 | 美女翘臀内疯狂进出 | 久久中文电影 | 逼毛片| 国产免费小视频在线观看 | 成人私人影院www片免费高清 | 狠狠的撞击发泄h | 91动漫在线观看 | 欧美另类变态 | 国士李风起全文在线阅读 | 精品久久久久久久高清 | 千金奴隶在线 | 动漫人物差差插曲漫画 | 免费一级特黄特色大片∵黄 | 2018天天拍拍拍免费视频 | 午夜影院c绿象 | 国产亚洲福利精品一区二区 | 6080伦理久久精品亚洲 | 99免费在线视频 | ck7788免费视频 | 亚洲国产精品91 | 日本高清有码视频 | 日韩精品一区二区三区视频 | 四虎在线网站 |