2016-07-05 297 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 

我无法找出错误的原因。 我不使用这个else ifcell.getCachedFormulaResult()之外,甚至这适用于所有上述细胞(有相同的公式)

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

你可以这样做,例如里面有一个try/catch(IllegalStateException)

+0

我不需要触发计算,因为excel使用某些第三方库进行公式计算,而这并不适用于我作为插件,这就是为什么我只是读取缓存的值。不管怎么说,多谢拉。 – gaurav5430