2015-10-15 69 views
2

嘗試遍歷Excel電子表格中的行和單元格,刪除空行。我正在使用下面的例程來做到這一點。Office Interop讀取不正確的單元格值

foreach(Range row in sheet.UsedRange.Rows) 
{ 
    for (int i = 0; i < row.Columns.Count; i++) 
    { 
     Range cell = row.Cells[1, i + 1]; 
     if (cell.Value == null || String.IsNullOrEmpty(cell.Value.ToString())) 
     { 
      cell.Delete(); 
     } 
    } 
} 

對前兩行工作正常。然而,它似乎變得不合時宜。

第三行是完全空的。然而,當它遍歷列時,當這個循環到達「I」列時,它在那裏讀取一個值。該值實際上在第4行「J」列中。

之後,它變得更糟,缺少整行並從它找到的行中讀取不正確的值。

我對此感到莫名其妙。有沒有明顯的我已經錯過了?

+0

你能解釋一下你想要做什麼?如果你想檢查行,首先檢查行,然後刪除所有單元格。 (仍然需要'我 - '然後) –

+1

我只是試圖從電子表格中刪除空單元格。我懷疑這個問題的關鍵在於你的回答,你暗示當單元格被刪除時,自動選擇移位是「上」。我需要它是「左」。我看到刪除方法有一個參數,它有望解決問題。 –

+0

@PatrickHofman是的,這是關鍵。我將編輯您的答案以包含它,然後接受它。謝謝你的幫助。 –

回答

1

是的,你錯過了一些非常明顯的東西。您正在刪除單元格。在那個操作之後,你選擇哪個單元的計算不再起作用。

如果刪除一個單元格,所有其他單元格將向上移動。這會導致您的row.Cells[1, i + 1]錯誤。例如,如果刪除第2行中的一個單元格,則第3行中同一列中單元格的值將永遠不會被檢查,因爲它在第2行。

刪除方向的移位也可能是一個因素 - 您可以通過將參數傳遞給刪除功能來控制它。

簡單地重新檢查同一列,當你刪除一個:

foreach (Range row in Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet.UsedRange.Rows) 
{ 
    for (int i = 0; i < row.Columns.Count; i++) 
    { 
     Range cel = row.Cells[1, i + 1]; 
     if (cel.Value == null || String.IsNullOrEmpty(cel.Value.ToString())) 
     { 
      // default shift is up 
      cel.Delete(); 
      // to shift left use cel.Delete(XlDeleteShiftDirection.xlShiftToLeft); 
      i--; // this will do 
     } 
    } 
}