2016-09-09 169 views
2

所以我有一些问题获得Apache POI来评估公式。Apache POI公式不评估

下面的代码我打电话写之前评估公式:

complete.getCreationHelper().createFormulaEvaluator().evaluateAll(); 
complete.write(fileOut); 

这里的正在使用的代码,我打电话写信给细胞(证明他们是数字):

try{ 
    cell.setCellValue((Double)grid[i][j]); 
} 
catch(Exception e){ 
    cell.setCellValue((String)grid[i][j]); 
} 

FYI :grid是2D Object阵列,仅包含doubleString类型的条目。

这里是我试图评估公式:

“= G13 - H13”

“= STDEV.P(C1:L1)”

“= I13/G13 “

任何想法为什么当我在Excel中打开我的最终工作簿时,公式没有被评估?另外,当我点击未评估的字段并点击输入时,Excel将识别公式并对其进行评估。散装这是不实际的,但我相信它表明,正在使用的细胞是正确的类型。这可能与String类型的公式有关吗?

编辑:

OK,所以看起来像你应该明确地告诉它你有一个公式的单元格。这里是我修改后的代码做到这一点:

try{ 
    cell.setCellValue((Double)grid[i][j]); 
} 
catch(Exception e){ 
    String val = (String) grid[i][j]; 
    if (val != null && val.startsWith("=")){ 
     val = val.replaceAll("=", ""); 
     cell.setCellType(XSSFCell.CELL_TYPE_FORMULA); 
     cell.setCellFormula(val); 
    } 
    else{ 
     cell.setCellValue(val); 
    } 
} 

不幸的是,你需要删除等号(这是哑)通过公式,然后迫使它保存之前重新评估(这是愚蠢的)。

所致: org.apache.poi.ss.formula.eval.NotImplementedFunctionException: STDEV.P

我试图让它重新评估公式是抱怨,但是,说后想象这意味着Excel已经实施了标准偏差计算,但POI还没有赶上呢?

+2

我看不到任何代码,你设置公式单元格 - 你可以发布,以防万一你的错误? – Gagravarr

+0

设置公式单元格?我觉得这可能是我错过的。我是否需要明确地告诉它“如果你有一个字符串值并且以等号开始,你是一个公式单元格”?因为这是非常愚蠢的,如果是这样的话,但我可以看到区别是必要的。 –

+0

公式单元格以与字符串单元格不同的方式存储在文件中,因此您需要明确 – Gagravarr

回答

2

试试这个:

XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook); 

,或者,如果你正在使用XLS

HSSFFormulaEvaluator.evaluateAllFormulaCells(hssfWorkbook) 

你可能只想保存前调用此。