积极答复者
C#-->Interop-->Excel: 如何完全关闭Excel进程

问题
-
我做了一个Excel自动化的小东西, 进行Excel的自动打开、数据汇总、数据复制、生
成图表之类的操作。
采用MDI窗体作主窗体,然后打开子窗体进行操作。
进行完一个操作后,我用app.Quit()方法(app是指向Excel 对象的变量),但是
Windows任务管理器里的Excel进程并不随之消失。接着进行下一个Excel操作,有时候
会出现冲突(比如“某某文件已经打开,是否需要重新打开”之类)。
后来又试了以下两种方案:
1、if(app!=null)
{
app.Quit();
app=null;}
}
GC.collection();
GC.waitpendingfinalize();
GC.collection();
GC.waitpendingfinalize();
2、System.Diagnostics.Process[] myProcesses;
myProcesses =
System.Diagnostics.Process.GetProcessesByName("Excel");
foreach (System.Diagnostics.Process instance in myProcesses)
{
instance.CloseMainWindow();
instance.Close();
}
但是Excel仍然不会在上述方法调用之后立刻就关闭。
最近使用WebBrowser进行Excel的嵌入式显示,这个问题更严重了,只能调用一次,第
二次就会提示“文件已经打开”,然后整个程序失去响应!
问题:怎样让Excel进程在需要的时候完全关闭?
答案
全部回复
-
-
再次谢谢以上各位,我昨天晚上试的结果,相同的语句,并不是所有的情况都可以。我在调用Excel之后用以下语句结束进程:
ReleaseExcel.NAR(wb);if (app != null)
{
app.Quit();
}
ReleaseExcel.NAR(app);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
NAR方法我放在了一个单独的类里,和E章老大的完全一样。
在有的窗体里,Excel进程可以完全消失;但有的地方却不行。
另:原来可以自动结贴啊。 -
用这个吧,包治百病:
Dim t As Integer = 0
If xlsBook IsNot Nothing Then
Runtime.InteropServices.Marshal.ReleaseComObject(xlsBook)
xlsBook = Nothing
End If
If xlsapp IsNot Nothing Then
t = xlsapp.Hwnd
Runtime.InteropServices.Marshal.ReleaseComObject(xlsapp)
xlsapp = Nothing
End If
GC.Collect(2, GCCollectionMode.Forced)
GC.WaitForPendingFinalizers()
If t > 0 Then
PostMessage(t, &H10, 0, 0) '关闭EXCEL窗体
PostMessage(t, &H12, 0, 0) '退出EXCEL窗体
PostMessage(t, &H2, 0, 0) '摧毁EXCEL窗体
End If