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数据。
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对象。是根据文件的头部信息去比对进行判断的,此时,就算改了后缀名,还是一样通不过。
上一篇: java从字符串中提取数字的简单实例
下一篇: php中时间函数date及常用的时间计算