当前位置: 移动技术网 > IT编程>开发语言>Java > Java使用Apache POI库读取Excel表格文档的示例

Java使用Apache POI库读取Excel表格文档的示例

2019年07月22日  | 移动技术网IT编程  | 我要评论

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数据。

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对象。是根据文件的头部信息去比对进行判断的,此时,就算改了后缀名,还是一样通不过。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网