POI-XSSF:单元格类型为FORMULA,但无法获取cachedResultType

时间:2016-07-05 09:04:19

标签: java excel apache-poi xssf

在我的代码中,我正在检查单元格类型,如果单元格类型是公式,那么我正在尝试获取缓存的值,如下所示:

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

最新答案,但是我的XLSM文件也遇到了同样的问题。

你说,

“甚至对前面所有具有相同公式的单元格也适用”。

根据https://bz.apache.org/bugzilla/show_bug.cgi?id=57798当单元格是数组公式的一部分而不是数组公式的第一个单元格时,cell.getCachedFormulaResultType()方法将返回异常。

就我而言,有很多版本的poi和相关的jar散布在许多文件夹中。即使我也添加了最新的罐子,这也导致了问题。 所以我做了一些清理工作,这为我解决了这个问题。希望这对某人有帮助。