终止excel流程

时间:2012-03-31 12:05:10

标签: c# winforms excel

在这里读了很多关于在引用excel com对象时不使用双点的线程,我决定实现它。

直到我开始循环才开始工作。

这是我的循环。请注意,如果我对此进行评论,它会起作用:

        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?(第二个回答)

的步骤进行操作

2 个答案:

答案 0 :(得分: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块中,这样即使抛出异常也会执行它们。

答案 1 :(得分:0)

我是按照How do I properly clean up Excel interop objects?中的nightcoder指定的方法完成的。

您不需要引用任何内容,并且所有内容都是最简单的,它会通过ID关闭进程。希望这可以帮助那些来看的人。