2014-12-30 51 views
1

我正在使用SpreadsheetGear將工作表上的一個範圍複製到另一個工作表的「輸入」範圍中,並手動重新計算WorkbookSet。有沒有辦法輕鬆檢查重新計算後是否有公式或計算錯誤?在SpreadsheetGear中,如何檢查公式或計算錯誤?

目標工作簿很複雜,其中包含許多依賴於複製的工作表的公式,因此找到任何計算錯誤的簡單全局方法將會很有幫助。

回答

1

「錯誤」我認爲你的意思是一個Excel公式的錯誤值,如#NUM!,#VALUE,#NAME?等?不幸的是,沒有財產可以檢查以確定工作簿是否包含重新計算後的一個或多個。要做到這一點,唯一的方法是手動迭代工作簿中的任何相關單元格並檢查ValueType of Error。對於一本龐大而複雜的工作簿,我知道這可能不可行。無論如何,對於這樣的方法,如果可能的話,我最好的建議是將這個錯誤檢查限制在一個更小的範圍或你感興趣的一組範圍內。其次,你可以考慮使用「高性能」API在SpreadsheetGear.Advanced下。 Cells命名空間可以使這個例程的性能稍微好一些,而使用傳統的IRange接口則可能會慢一些。下面是一個演示這種方法的例子。隨時根據需要修改您的要求:

using SpreadsheetGear.Advanced.Cells; 
... 
private bool RangeContainsErrors(IRange range) 
{ 
    // We obtain a "high performance" IValues object by casting a worksheet 
    // to IValues. 
    IValues values = (IValues)range.Worksheet; 

    // Setup some indexes to help clarify and shorten the for loops. 
    int startRow = range.Row; 
    int startCol = range.Column; 
    int endRow = startRow + range.RowCount; 
    int endCol = startCol + range.ColumnCount; 

    // Loop through rows of desired range. 
    for (int row = startRow; row < endRow; row++) 
    { 
     // Now loop through columns of desired range. 
     for (int col = startCol; col < endCol; col++) 
     { 
      // Get an IValue object for this cell. 
      IValue val = values[row, col]; 

      // Check to ensure this cell even as a value and if so, check 
      // for an Error value type. 
      if(val != null && 
       val.Type == SpreadsheetGear.Advanced.Cells.ValueType.Error) 
      { 
       return true; 
      } 
     } 
    } 

    // If we made it this far there weren't any errors. 
    return false; 
} 
+0

是的,我想檢測任何公式錯誤。感謝代碼示例,並確認沒有此類錯誤的「全局」指示符。 –

0

我對這種轉移有幾點建議。

  1. 有點偏離主題,但設置workbookSet.Calculation = SpreadsheetGear.Calculation.Manual; 和觸發計算明確手動每當你需要用workbookSet.Calculate();
  2. @Tim安德森的回答顯示瞭如何訪問IValue。從那裏你可以閱讀TextNumber屬性讀出正確的值類型
  3. 如果你想設置,你可以說SetTextSetNumnber
  4. 如果單元格爲空,則IValue將爲空!

高級接口不同於常規,我還沒有想出如何通過範圍名稱來處理單元格。看起來接口不允許這樣做,您可以通過基於0的行列索引來索引單元格。