2012-03-10 92 views
1

我有一個從工作簿中提取數據的程序。其中一個工作表中有一個單元格,它從包含來自同一工作簿的另一工作表的公式中獲取其數據。該工作簿被稱爲「11.xls周」,該工作表被稱爲Sat AP。我試圖用下面這段代碼:Apache POI中的公式評估器

HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(myWorkbook); 
    HSSFCell cell = myWorkbook.getSheetAt(11).getRow(10).getCell(3); 
    CellValue cv = fe.evaluate(cell); 

我得到它不能解析外部工作簿一週11個sat.xls看起來好像它試圖當它應該開周11個sat.xls錯誤試圖開放11.xls。我的工作簿使用它其他功能,它工作正常,所以我知道它沒有指向錯誤的文件。任何幫助將非常感激。謝謝!

+0

你真的需要評估細胞嗎?你正在對文件進行任何更改,或者只是閱讀文件? (如果你沒有進行更改,那麼有一個更簡單的方法來做到這一點) – Gagravarr 2012-03-12 12:55:30

+0

感謝您的迴應,我沒有對單元格做任何更改,但是當我嘗試通過其他方法獲取單元格值時,它會返回錯誤的數量,單元格中的公式是「H7 +'Fri AP'!D11」,但是當我嘗試獲取該值時,它僅返回來自Fri AP D11的值。 – GNic24 2012-03-14 20:13:53

回答

5

根據您的需要,有兩種方法可以處理POI中的公式單元格。由於性能方面的原因,當Excel編寫公式單元格時,它會計算當前值並將其與公式一起存儲。

如果您沒有對文件進行更改,那麼您可以簡單地從Excel上次處理文件時檢索緩存的值,然後使用該值。您將獲得與Excel中顯示的相同的值,並且您不需要執行任何評估。你的代碼看起來像

if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { 
switch(cell.getCachedFormulaResultType()) { 
    case HSSFCell.CELL_TYPE_STRING: 
    HSSFRichTextString str = cell.getRichStringCellValue(); 
    if(str != null && str.length() > 0) { 
     text.append(str.toString()); 
    } 
    break; 
    case HSSFCell.CELL_TYPE_NUMERIC: 
    HSSFCellStyle style = cell.getCellStyle(); 
    if(style == null) { 
     text.append(cell.getNumericCellValue()); 
    } else { 
     text.append(
       _formatter.formatRawCellContents(
        cell.getNumericCellValue(), 
        style.getDataFormat(), 
        style.getDataFormatString() 
      ) 
     ); 
    } 
    break; 
    case HSSFCell.CELL_TYPE_BOOLEAN: 
    text.append(cell.getBooleanCellValue()); 
    break; 
    case HSSFCell.CELL_TYPE_ERROR: 
    text.append(ErrorEval.getText(cell.getErrorCellValue())); 
    break; 
} 

(此代碼是從POI,ExcelExtractor Excel的文本提取碼拍攝,如果你想看到在使用它的例子)

否則,如果你是首先更改單元格的值,則需要重新評估公式值。這主要在formula evaluation page on the POI site中涵蓋。如果您有外部工作簿引用(看起來像是從錯誤消息中看到的那樣),請不要忘記告訴POI公式評估程序如何找到每個外部工作簿的基礎文件。