我有一个xls文件,我可以在excel中打开,但是当我尝试用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。
我无法共享该文件,因为它包含私人信息,但除了数字和字符串之外别无其他。
我会随时为您提供更多信息。
问候。
编辑:我不知道这是否有所作为,但我忘了说该文件处于兼容模式
答案 0 :(得分:3)
我可以看到两个问题。首先,您使用的是较旧的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,这是一个重写,解决了你的问题