源代码
if (POIFSFileSystem.hasPOIFSHeader(in)) {
new HSSFWorkbook(in);
}
if (POIXMLDocument.hasOOXMLHeader(in)) {
new XSSFWorkbook(OPCPackage.open(in));
}
当使用xls格式文件时报错,由于是xls格式,第一个判断成立,会执行new HSSFWorkbook(in),poi是将xls文件内容一次性加载进内存的,读取完成后会将流关闭,当进入第二个判断时会出现流关闭异常,异常堆栈如下。
Exception in thread "main" java.io.IOException: Stream closed
at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:74)
at java.io.PushbackInputStream.read(PushbackInputStream.java:166)
at org.apache.poi.util.IOUtils.readFully(IOUtils.java:121)
at org.apache.poi.util.IOUtils.readFully(IOUtils.java:106)
at org.apache.poi.POIXMLDocument.hasOOXMLHeader(POIXMLDocument.java:121)