在我的代码中,我正在检查单元格类型,如果单元格类型是公式,那么我正在尝试获取缓存的值,如下所示:
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
,甚至这适用于所有前面的单元格(具有相同的公式)
答案 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散布在许多文件夹中。即使我也添加了最新的罐子,这也导致了问题。 所以我做了一些清理工作,这为我解决了这个问题。希望这对某人有帮助。