源代码

    1. if (POIFSFileSystem.hasPOIFSHeader(in)) {
    2. new HSSFWorkbook(in);
    3. }
    4. if (POIXMLDocument.hasOOXMLHeader(in)) {
    5. new XSSFWorkbook(OPCPackage.open(in));
    6. }

    当使用xls格式文件时报错,由于是xls格式,第一个判断成立,会执行new HSSFWorkbook(in),poi是将xls文件内容一次性加载进内存的,读取完成后会将流关闭,当进入第二个判断时会出现流关闭异常,异常堆栈如下。

    1. Exception in thread "main" java.io.IOException: Stream closed
    2. at java.io.PushbackInputStream.ensureOpen(PushbackInputStream.java:74)
    3. at java.io.PushbackInputStream.read(PushbackInputStream.java:166)
    4. at org.apache.poi.util.IOUtils.readFully(IOUtils.java:121)
    5. at org.apache.poi.util.IOUtils.readFully(IOUtils.java:106)
    6. at org.apache.poi.POIXMLDocument.hasOOXMLHeader(POIXMLDocument.java:121)