我有一个可以在 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/