2012-03-31 53 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