我正在使用Microsoft.Office.Interop.Excel来从excel获取数据。即使我清除COM对象,它仍然在后台留下EXEL.EXE的一些实例。检查下面的代码。
finally
{
if (cells != null) Marshal.FinalReleaseComObject(cells);
if (range != null) Marshal.FinalReleaseComObject(range);
if (sheets != null) Marshal.FinalReleaseComObject(sheets);
if (workSheet != null) Marshal.FinalReleaseComObject(workSheet);
if (excelWorkBook != null)
{
excelWorkBook.Close(Type.Missing, Type.Missing, Type.Missing);
Marshal.FinalReleaseComObject(excelWorkBook);
}
if (excelWorkbooks != null) Marshal.FinalReleaseComObject(excelWorkbooks);
if (excel != null)
{
excel.Quit();
Marshal.FinalReleaseComObject(excel);
}
cells = null;
range = null;
sheets = null;
workSheet = null;
excelWorkBook = null;
excelWorkbooks = null;
excel = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
请告诉我哪里出错了。
答案 0 :(得分:1)
唯一未发布的变量是sheets
,定义为:
sheets = excelWorkBook.Worksheets;
然后再次使用工作表,因此可以完全省略工作表,因为工作表被指定为:
workSheet = (Worksheet)excelWorkBook.Worksheets["Sheet1"]; //doesn't use sheets, so sheets can be omitted
或者如果需要工作表,如果它已经发布,我的测试显示excel流程关闭(在应用程序结束之前,在应用程序结束之后它总是成功关闭)
Marshal.FinalReleaseComObject(sheets);