错误读取的Excel .XLSX与Apache POI(Error reading Excel .X

2019-07-30 01:30发布

我使用Apache POI 3.8库读取Web应用程序XLSX文件。 下面的代码工作完全正常从Java控制台应用程序:

InputStream inputFS = new FileInputStream("test.xlsx");
Workbook workbook = new XSSFWorkbook(inputFS); // below exception is thrown on this line
Sheet sheet = workbook.getSheetAt(0);

但在Web应用程序中使用时,抛出一个“读取错误”。 堆栈跟踪的相关摘录粘贴如下:

java.io.IOException: Read error
at java.io.FileInputStream.readBytes(Native Method) ~[na:1.6.0_31]
at java.io.FileInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.FilterInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.PushbackInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readFully(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readLOC(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) ~[na:1.6.0_31]
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:228) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:187) ~[poi-ooxml-3.8-20120326.jar:3.8]
at com.corp.ReportManager.parseExcelReport(ReportManager.java:575) [ReportManager.class:na]

(以相同的顺序)以下的JAR包含在类路径:

poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
xbean.jar
dom4j-1.6.1.jar

似乎没有成为一个记忆相关的问题,因为我收集了一些内存使用率统计只是调用上面的代码之前。 该XLSX文件的大小1.15 MB。

##### Heap utilization statistics [MB] #####
Used Memory:13 MB
Free Memory:9 MB
Total Memory:23 MB
Max Memory:247 MB

Answer 1:

使用上述代码的方法,有一个单一的参数 - 的FileInputStream。 在代码段的第一行是码的非常多的一部分,但在调用方法的一部分。 由于问题的方法没有足够的Excel格式,甚至一个文件扩展名的知识来做出一个猜测,我决定,我将首先尝试使用HSSF API如下阅读的FileInputStream:

Sheet sheet = null;
try {

    POIFSFileSystem poifs = new POIFSFileSystem(inputFS);
    Workbook workbook = new HSSFWorkbook(poifs);
    sheet = workbook.getSheetAt(0);
}
catch (Exception e) {
}

if (sheet == null) {

    try {

        Workbook workbook = new XSSFWorkbook(inputFS);
        sheet = workbook.getSheetAt(0);
    }
    catch (Exception e) {
    }
}

与上面的代码的问题是,所述的状态inputFS对象经由XSSF API打开它的第二次尝试中是未知的。 这产生了一个read error 。 我取代了上述用下面的代码,它工作正常,问题似乎得到解决:

Sheet sheet = null;
try {

    Workbook workbook = WorkbookFactory.create(inputFS);
    sheet = workbook.getSheetAt(0);
}
catch (Exception e) {
}

我既XLS(旧的,二进制)和XLSX(较新的,基于XML)格式测试这和它的作品。 感谢大家的帮助和投入!



Answer 2:

该异常表明有什么东西与您的InputStream。 但是,如果你有一个文件,然后传递到POI直接! 使用一个InputStream需要的一切到内存中,从而消耗了空间的缓冲。 既然你不需要做缓冲,不! 避免缓冲应该反正解决您的问题

如果你使用最新的运行每晚构建POI的,那么它很容易。 您的代码变为:

File file = new File("test.xlsx");
OPCPackage opcPackage = OPCPackage.open(file);
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

否则,它是非常相似的:

File file = new File("test.xlsx");
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

如果你不知道,如果你的文件是一个HSSFWorkbook或XSSFWorkbook,那么你可以使用WorkbookFactory打开相应的一个给你:

File file = new File("test.xlsx");
Workbook workbook = WorkbookFactory.create(file);


Answer 3:

它看起来像你需要使用他们XSSF API



Answer 4:

I have same error, I have just updated the pom dependencies with same version. It worked.
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>


Answer 5:

使用这个jar

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.3.0</version>
</dependency>


文章来源: Error reading Excel .XLSX with Apache POI