在这里读了很多关于在引用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?(第二个回答)
的步骤进行操作答案 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.Collect
和GC.WaitForPendingFinalizers
来电中没有看到这一点,因为您在cell
和fontSetter
超出范围之前制作了它们。
最后,对Marshal.FinalReleaseComObject
的调用可能应该在finally块中,这样即使抛出异常也会执行它们。
答案 1 :(得分:0)
我是按照How do I properly clean up Excel interop objects?中的nightcoder指定的方法完成的。
您不需要引用任何内容,并且所有内容都是最简单的,它会通过ID关闭进程。希望这可以帮助那些来看的人。