2016-07-05 1 views
1

В моем коде я проверяю тип ячейки, и если тип ячейки является формулой, тогда я пытаюсь получить кешированное значение, например: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, и даже это работает для всех предшествующих клеток (которые имеют ту же самую формулу)

+2

Какую версию Apache POI вы используете? И если это не последнее, что происходит при обновлении? – Gagravarr

+2

Также, пожалуйста, добавьте полный стек, чтобы мы увидели, где именно выбрано исключение. – centic

ответ

1

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

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); 

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

+0

Мне не нужно запускать вычисление, поскольку excel использует некоторую стороннюю библиотеку для формул, которая недоступна мне как плагин, поэтому Я просто прочитал кешированное значение. В любом случае спасибо. – gaurav5430