2012-03-31 91 views
1

在閱讀了關於在引用excel com對象時不使用雙點的許多線程之後,我決定實現它。終止excel過程

它一直工作,直到我來循環做。

這是我的循環。請注意,它的作品,如果我對此發表評論:

 for (int i = 1; i < dgv.Columns.Count + 1; i++) 
     { 
      excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 

      var cell = excelWorkbook.Cells[1, i]; 
      var fontSetter = cell.Font; 
      fontSetter.Bold = true; //Bolds the header row 

      // Garbage collecting 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      Marshal.FinalReleaseComObject(fontSetter); 
      Marshal.FinalReleaseComObject(cell); 
     } 

不應該我的代碼正確地處理它們的變量嗎?

這裏是我的全碼:

[Code removed] 

我試圖按照步驟在上How do I properly clean up Excel interop objects?(第二個答案)

回答

1

這並不容易得到這個權利。但是我很驚訝以下甚至編譯:

excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

也許你的意思是:

excelWorkbook.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

這應改爲:

var cell = excelWorkbook.Cells[1, i]; 
cell.Value = dgv.Columns[i - 1].HeaderText; 

我沒有看到你的點GC.CollectGC.WaitForPendingFinalizers來電,因爲您在cellfontSetter超出範圍之前進行了呼叫。

最後,Marshal.FinalReleaseComObject的調用可能應該放在finally塊中,這樣即使拋出異常也會執行它們。

+0

我試圖通過puttng完整的循環嘗試,然後使用finally,但它無法找到變量。也許是因爲它們是在循環中聲明的? – TheGateKeeper 2012-03-31 12:17:54

+0

是的,try/finally將不得不在循環中。每次通過外觀,你都會引用一個新的單元格和它的字體,並且你必須釋放所有的單元格。 – Joe 2012-03-31 15:45:34

+0

我做了一個更簡單的方法,如下所示 – TheGateKeeper 2012-03-31 16:33:11