2016-08-22 296 views
0

更新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

經過網上的文檔,我沒有找到我的問題的解釋,任何有關此事的見解將不勝感激。

乾杯。

+0

您確定您認爲電子表格的最後一行實際上是電子表格的最後一行嗎?存儲在文件中?您是否嘗試打印出行號以確保? – Gagravarr

+1

行/單元格基於索引0,因此行「1」在索引0等等,您是否考慮到了這一點?看看cell.toString(),看看它是否實際返回公式。 – centic

+0

是的,我已經完成了這些故障排除步驟。我能夠打印出單元格中保存的公式,正確的行和列號,但不是從公式計算出的實際值@Gagravarr –

回答

1

隨着

data.xlsx content

這個工作對我來說:

import org.apache.poi.ss.usermodel.*; 

import java.io.File; 
import java.io.FileInputStream; 

public final class Demo { 

    public static void main(final String[] args) throws Exception { 
     System.out.println(getCellValue()); 
    } 

    public static Double getCellValue() throws Exception { 
     final Workbook workBook = WorkbookFactory.create(new FileInputStream(new File("data.xlsx"))); 
     final Sheet sheet = workBook.getSheetAt(0); 

     // i only need one specific cell, at the last row in my sheet 
     final Row row = sheet.getRow(1); 
     final Cell cell = row.getCell(0); // formula in A2 
     System.err.println(cell.getCellFormula()); 

     // this is where I am stuck 
     final FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator(); 
     final CellValue cellValue = evaluator.evaluate(cell); 
     return cellValue.getNumberValue(); 
    } 
} 

輸出:

SUM(B2:B6) 
15.0 

所以我認爲有一些問題用自己的方式來獲得細胞,或xlsx內容。使用調試器,您應該能夠找出錯誤的原因