java - 打开xls文件时出现异常

标签 java excel exception apache-poi

我有一个可以在 Excel 中打开的 xls 文件,但是当我尝试使用 Apache POI 打开它时,出现此异常:

java.io.IOException: block[ 3 ] already removed - does your POIFS have circular or duplicate block references?
at org.apache.poi.poifs.storage.BlockListImpl.remove(BlockListImpl.java:89)
at org.apache.poi.poifs.storage.RawDataBlockList.remove(RawDataBlockList.java:34)
at org.apache.poi.poifs.storage.BlockAllocationTableReader.fetchBlocks(BlockAllocationTableReader.java:221)
at org.apache.poi.poifs.storage.BlockListImpl.fetchBlocks(BlockListImpl.java:123)
at org.apache.poi.poifs.storage.RawDataBlockList.fetchBlocks(RawDataBlockList.java:34)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.processProperties(POIFSFileSystem.java:528)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:163)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:327)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:308)
at controlers.ExcelProject2.setBook(ExcelProject2.java:327)
at controlers.ExcelProject2.<init>(ExcelProject2.java:149)
at controlers.ExcelProject2Tests.main(ExcelProject2Tests.java:41)

问题出现在我的代码的这一部分:

FileInputStream fs = new FileInputStream(pathFiles);
Workbook book = new HSSFWorkbook(fs);

如果我在 Excel 中打开文件,“另存为”,然后用 Java 打开新文件,它就可以工作。即使我打开文件并保存,而不更改任何内容,它也可以工作。 我不知道为什么,但新文件比旧文件大。

我尝试使用在谷歌上找到的不同解决方案,例如使用 BOMInputStream 或 NPOI 文件,但它不起作用。 我目前使用的是 poi-3.8-20120326。

我无法共享该文件,因为它包含私有(private)信息,但除了数字和字符串之外没有其他信息。

我随时为您提供更多信息。

问候。

编辑:我不知道这是否有什么不同,但我忘了说该文件处于兼容模式

最佳答案

我发现你有两个问题。首先,您使用的是较旧的 POIFS 实现,已知该实现在某些 block 组合上存在一些问题;其次,您正在使用 an InputStream when you have a File它具有更高的内存占用

获取代码

FileInputStream fs = new FileInputStream(pathFiles);
Workbook book = new HSSFWorkbook(fs);

在 POI 3.12 或更高版本上,简单的解决方法是将其替换为:

Workbook book = WorkbookFactory.create(new File(pathFiles));

这将使用文件而不是流,并将使用 NPOIFS,这是一种重写,可以解决像您遇到的问题

关于java - 打开xls文件时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30476758/

相关文章:

java - HTTP 手动客户端未正确写入磁盘 JAVA

java - 将word doc转换为pdf文件

java - 如何在其运行方法完成后清理线程?

ios - 有什么方法可以禁用iOS市场版本中所有抛出的异常?

java - 中断java线程中的外部方法调用

excel - Excel中如何计算相乘行的总和

excel - SUMPRODUCT( SUMIF() ) - 这是如何工作的?

vba - 选择/分配多个列和行到数组

ruby - 在 Ruby 中引发异常与抛出异常有什么区别?

django - ImportError : libjpeg. so.8: 无法打开共享对象文件: 没有这样的文件或目录