更新2:出於某種原因,我完全忘記提及我試圖訪問的單元實際上是總結包含公式的單元格。這些細胞含有SUMIF
式這樣:使用Apache POI獲取Excel中公式的計算值3.14
= SUMIF( 'Sheet 1中'!B2:B4,DATE(2016,8,31), 'Sheet 1中' E2:E4)
所以我的推理是,我必須評估這些單元之前評估我需要的實際單元格,這是FormulaEvaluator
不正常工作的地方。換句話說,簡單的SUM
函數正在按照預期進行評估,但是從包含SUMIF
函數的單元格錯誤地總結了0.0
。每次我更新一個包含SUMIF
函數的單元格時,我都嘗試使用evaluator.sumInCell()
,但同時也在計算0.0
。
這是否與不支持SUMIF
函數的庫有關?或者,也許我應該改變這種狀況?
============================================== ===========================
更新:好吧,所以我只設法通過手動打開Excel獲得正確的值文件,然後關閉它。當我實際上沒有做任何事情時,我會得到提示來保存對文件的更改。我想我的生成和操作文件有什麼問題。
private void createDataFile(File dataFile) throws IOException {
FileOutputStream fos = new FileOutputStream(dataFile);
XSSFWorkbook workBook = new XSSFWorkbook();
//
// Code to create and populate rows and cells
//
workBook.write(fos);
fos.close();
}
private void updateSheet(File dataFile) throws IOException {
Workbook workBook = WorkbookFactory.create(new FileInputStream(dataFile));
Sheet sheet = workBook.getSheet(0);
//
// Code to update and manipulate cells
//
FileOutputStream fos = new FileOutputStream(dataFile);
workBook.write(fos);
fos.close();
}
注:我只能通過cell.getNumericCellValue()
讀取值,FormulaEvaluator
仍然無法正常工作或方式。
============================================== ===========================
您好,我正在嘗試讀取使用Excel表格中的公式計算出的值。 該公式是一個簡單的求和函數,如下所示:SUM(B2:B6)
。
使用Apache POI 3.14圖書館,我想出了下面的代碼片段:
public Double getCellValue() throws IOException, InvalidFormatException{
Workbook workBook = WorkbookFactory.create(new FileInputStream(new File("data.xlsx")));
Sheet sheet = workBook.getSheetAt(0);
// i only need one specific cell, at the last row in my sheet
Row row = sheet.getRow(sheet.getLastRowNum());
Cell cell = row.getCell(1);
// this is where I am stuck
FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
CellValue cellValue = evaluator.evaluate(cell);
return cellValue.getNumberValue();
}
我確信,我採用的是正確的電池,但是此方法返回0.0
而不是正確的計算值。
我最初嘗試了使用cell.getNumericCellValue()
而不是FormulaEvaluator
的不同方法,但是這給了我相同的錯誤結果,0.0
。
經過網上的文檔,我沒有找到我的問題的解釋,任何有關此事的見解將不勝感激。
乾杯。
您確定您認爲電子表格的最後一行實際上是電子表格的最後一行嗎?存儲在文件中?您是否嘗試打印出行號以確保? – Gagravarr
行/單元格基於索引0,因此行「1」在索引0等等,您是否考慮到了這一點?看看cell.toString(),看看它是否實際返回公式。 – centic
是的,我已經完成了這些故障排除步驟。我能夠打印出單元格中保存的公式,正確的行和列號,但不是從公式計算出的實際值@Gagravarr –