2015-05-27 3 views
1

У меня есть файл .xls, который я могу открыть в Excel, но когда я пытаюсь открыть его с помощью Apache POI, я получаю это исключение:Исключение при открытии XLS файлов

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, он работает. Даже если я открою файл и сохраню, ничего не меняя, он работает. Я не знаю, почему, но новый файл больше старого.

Я попытался использовать решение differents, которое я нашел в google, например, используя BOMInputStream или файл NPOI, но это не сработало. Я в настоящее время использую poi-3.8-20120326.

Я не могу поделиться файлом, потому что он содержит личную информацию, но там нет ничего, кроме числа и строки.

Я остаюсь в вашем распоряжении для получения дополнительной информации.

С уважением.

EDIT: Я не знаю, если это имеет значение, но я забыл сказать, что файл находится в режиме совместимости

+0

Как было создано xls? Можете ли вы опубликовать этот код? Можете ли вы создать его без личной информации и поделиться им? – Burkhard

+0

Ну, idk, как генерируется xls, потому что он исходит от клиента. И я не могу делиться без личной информации, потому что, если я его изменю, ошибка исчезнет: /. Я думаю, что могу опубликовать экран, если я скрою некоторые данные, но я не знаю, полезно ли это – HRomain

ответ

3

У вас есть две проблемы, которые я могу видеть. Во-первых, что вы используете старую реализацию POIFS, которая, как известно, есть некоторые проблемы в отношении некоторых комбинаций блоков, а во-вторых, что вы используете an InputStream when you have a File, который имеет более высокий объем памяти

Taking код

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

на POI 3.12 или новее, то легко исправить, чтобы заменить это:

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

это будет использовать файл не является потоком, и будет использовать NPOIFS, который является переписана, который устраняет проблемы, как один у вас есть

+0

, это работает как для xls, так и для xlsx? если он работает, я попробую как можно скорее, и я скажу вам результат. – HRomain

+0

Да, отлично работает для '.xls' и' .xlsx' – Gagravarr

+1

Убедитесь, что вы запишитесь в другой/новый файл. На месте писать в настоящее время не поддерживается – Gagravarr

Смежные вопросы