2016-09-09 39 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) 

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