如何释放为Excel创建的对象(C#)

How to release objects which are created for Excel (C#)

本问题已经有最佳答案,请猛点这里访问。

我使用一些对象,如工作簿、工作表、Excel任务应用程序。在使用完Excel之后,我尝试通过下面的代码释放它们。毕竟,我仍然在任务管理器中看到excel.exe。为什么它不能完全释放?

我的Excel任务类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Excel._Application app = new Excel.Application();
Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Excel._Worksheet worksheet = null;
app.Visible = true;

worksheet.Cells[1, 1] ="test string";

workbook.SaveAs("C:\testfile.xlsx");

object misValue = System.Reflection.Missing.Value;
workbook.Close(true, misValue, misValue);
app.Quit();

releaseObject(worksheet2);
releaseObject(workbook);
releaseObject(app);

ReleaseObject类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Unable to release the Object" + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }

Excel.exe仍在任务管理器中:enter image description here


已回答请参阅:

如何正确清理Excel Interop对象?

基本上,COM对象是非托管对象(DUH),当它们超出范围时不会被释放。System.Runtime.InteropServices.Marshal.ReleaseComObject()可用于在最终确定之前(在垃圾收集器中)释放它们,但必须确保保留对所有对象的引用:excelapp.worksheets.open()创建两个对象:集合"worksheets"和用open()方法打开的"worksheet"。


使用过程可以很容易地从任务管理器中删除Excel对象,请参见下面的享受。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Kill the all EXCEL obj from the Task Manager(Process)
System.Diagnostics.Process[] objProcess = System.Diagnostics.Process.GetProcessesByName("EXCEL");

if (objProcess.Length > 0)
{
    System.Collections.Hashtable objHashtable = new System.Collections.Hashtable();

    // check to kill the right process
    foreach (System.Diagnostics.Process processInExcel in objProcess)
    {
        if (objHashtable.ContainsKey(processInExcel.Id) == false)
        {
             processInExcel.Kill();
        }
    }
    objProcess = null;
}

//In case of you want to quit what you have created the Excel object from your application //just use below condition in above,

    if(processInExcel.MainWindowTitle.ToString()=="")


这是一个我无法解决的问题。我以前看过所有这些答案,我已经实现了所有这些答案,但Excel并没有结束。我不得不用蛮力做事。我所做的是创建一个BAT文件并从我的程序中运行它。以下是文件的内容:

1
Taskkill /F /IM excel.exe

这将使你所有的优秀运动员都能跑起来。如果你找不到不同的解决方案,我会用这个。


我已经有一段时间没有做过Office Interop了(实际上我在Outlook中使用它,但是概念应该是相同的)。唯一能完全释放一切的方法就是:

2

试一试……


您需要这样做来关闭Excel应用程序,因为它在后台打开Excel程序….

1
app .Application.Quit();

在代码中添加上述行代码,方法如下:

1
2
3
4
    object misValue = System.Reflection.Missing.Value;
    workbook.Close(true, misValue, misValue);
    app .Application.Quit();
    app.Quit();