java - 使用 Apache POI 读取 Excel .XLSX 时出错

标签 java apache-poi xlsx

我正在使用 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

最佳答案

使用上述代码的方法只有一个参数 - 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) {
    }
}

上述代码的问题在于,在第二次尝试通过 XSSF API 打开它时,inputFS 对象的状态是未知的。这产生了一个读取错误。我用以下代码替换了上面的代码,它工作正常并且问题似乎已解决:

Sheet sheet = null;
try {

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

我用 XLS(旧的,二进制的)和 XLSX(新的,基于 XML 的)格式测试了这个并且它有效。感谢大家的帮助和意见!

关于java - 使用 Apache POI 读取 Excel .XLSX 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145323/

相关文章:

java - 引用的 Javadoc 未显示在 Eclipse 中

java - Oracle WCC NoClassDefFoundError : org/xml/sax/EntityResolver when running Apache POI in Custom Component

javascript - xlsx 到 json 并带有空单元格

php - 如何使用 php 生成 .xlsx

java - 如何找出 eclipse 项目中使用了哪些版本的 JAR

java - Hibernate - 表或 View 不存在错误

java - http : in main method - why no errors? 奇怪的行为

java - 使用 Apache POI 在 Excel 中创建条形图

java - 如何将货币类型设置为 POI 中的列

c# - 如何使用 NPOI 2.0 在 excel 2010+ 中保存