打开 xls 文件时出现异常

Exception when open xls files

我有一个可以在 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、"Save as" 打开文件,然后用 Java 打开新文件,就可以了。即使我打开文件并保存,不做任何更改,它也能正常工作。 不知道为什么新文件比旧文件大

我曾尝试使用我在 google 上找到的不同解决方案,例如使用 BOMInputStream 或 NPOI 文件,但它没有用。 我目前正在使用 poi-3.8-20120326。

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

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

此致。

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

我看到你有两个问题。首先,您使用的是较旧的 POIFS 实现,已知它在某些块组合上存在一些问题,其次,您使用的 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,这是一种重写,可以修复您遇到的问题