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

Java POI-XSSF:单元格类型为公式,但无法获取cachedResultType,java,excel,apache-poi,xssf,Java,Excel,Apache Poi,Xssf,在我的代码中,我正在检查单元格类型,如果单元格类型是formula,那么我将尝试获取缓存值,如下所示: else if(cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA){ System.out.println("formula result type:" +cell.getCachedFormulaResultType()); switch(cell.getCachedFormulaResultType()){

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

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
我无法找出错误的原因。
我没有使用
单元格。getCachedFormulaResult()
在这个
之外,否则如果
,即使这对前面的所有单元格都有效(公式相同)

如果缓存的结果不可用,可能它有助于显式触发计算:

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)

延迟回答中,但我的XLSM文件也面临同样的问题

你说

“甚至这也适用于前面的所有单元格(公式相同)”

根据,, 当单元格是数组公式的一部分且不是数组公式的第一个单元格时,getCachedForMularResultType()方法返回异常

在我的例子中,poi和相关JAR的旧版本分散在许多文件夹中。尽管我也添加了最新的jar,但这是问题的根源。
所以我做了一些清理,为我解决了这个问题。希望这对其他人有所帮助。

您使用的是什么版本的Apache POI?如果它不是最新的,升级时会发生什么?请添加完整的stacktrace,以便我们了解异常的确切位置。我不需要触发计算,因为excel使用了一些第三方公式库,我无法将其作为插件使用,这就是我只读取缓存值的原因。无论如何,谢谢你。