POI-XSSF: тип ячейки — FORMULA, но невозможно получить cachedResultType

В моем коде я проверяю тип ячейки, и если тип ячейки является формулой, то я пытаюсь получить кешированное значение, например:

else if(cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA){
        System.out.println("formula result type:" +cell.getCachedFormulaResultType());
        switch(cell.getCachedFormulaResultType()){
            case XSSFCell.CELL_TYPE_NUMERIC:
                    ....    
                    ....        
            break;

Он отлично работает для некоторых ячеек, но в одной из ячеек я получаю ИСКЛЮЧЕНИЕ НЕЗАКОННОГО СОСТОЯНИЯ:

java.lang.IllegalStateException: Only formula cells have cached results

Не могу выяснить причину ошибки. Я не использую cell.getCachedFormulaResult() за пределами этого else if, и даже это работает для всех предыдущих ячеек (которые имеют одну и ту же формулу)


person gaurav5430    schedule 05.07.2016    source источник
comment
Какую версию Apache POI вы используете? И если это не последняя версия, что произойдет при обновлении?   -  person Gagravarr    schedule 05.07.2016
comment
Также, пожалуйста, добавьте полную трассировку стека, чтобы мы видели, где именно выдается исключение.   -  person centic    schedule 06.07.2016


Ответы (2)


Если кешированный результат недоступен, возможно, это поможет явно запустить вычисление:

Workbook wb = ...
Sheet sheet = wb.getSheetAt(0);
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

// suppose your formula is in B3
CellReference cellReference = new CellReference("B3"); 
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol()); 

CellValue cellValue = evaluator.evaluate(cell);

Вы можете сделать что-то вроде этого, например. внутри try/catch(IllegalStateException)

person geert3    schedule 06.07.2016
comment
Мне не нужно запускать вычисление, так как Excel использует какую-то стороннюю библиотеку для формул, которая недоступна для меня в виде плагина, поэтому я просто читаю кэшированное значение. В любом случае спасибо. - person gaurav5430; 10.08.2016

Поздний ответ, но я также столкнулся с той же проблемой с моим файлом XLSM.

Вы сказали,

«и даже это работает для всех предыдущих ячеек (которые имеют ту же формулу)».

Согласно https://bz.apache.org/bugzilla/show_bug.cgi?id=57798, Метод cell.getCachedFormulaResultType() возвращает исключение, если ячейка является частью формулы массива и не является первой ячейкой формулы массива.

В моем случае старые версии пои и связанные с ними баночки лежали разбросанными по многим папкам. Это вызывало проблему, хотя я также добавил последние банки. Поэтому я сделал некоторую очистку, и это решило проблему для меня. Надеюсь, это поможет кому-то.

person schan    schedule 25.06.2018