打开xls文件时例外

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

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打开新文件,它的工作原理。 即使我打开文件并保存,而不改变任何东西,它的工作原理。 我不知道为什么,但新文件比旧文件大。

我试图使用不同的解决scheme,我发现谷歌,就像使用BOMInputStream或NPOI文件,但没有奏效。 我目前正在使用poi-3.8-20120326。

我不能共享文件,因为它包含私人信息,但除了数字和string以外没有别的。

我将继续为您提供更多信息。

问候。

编辑:我不知道这是否有所作为,但我忘了说,该文件是在兼容模式

你可以看到两个问题。 首先,您正在使用旧的POIFS实现,这种实现已知在某些块组合上存在一些问题,其次, 当您有一个具有较高内存占用量的文件时 ,您正在使用InputStream

取代码

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

在POI 3.12或更新版本上,简单的解决方法是用下面的代码replace:

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

这将使用一个文件而不是stream,并将使用NPOIFS,这是一个重写,它修复了像你有一个问题