none
C#-->Interop-->Excel: 如何完全关闭Excel进程 RRS feed

  • 问题

  • 我做了一个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进程在需要的时候完全关闭?

    2008年8月1日 1:54

答案

全部回复

  • 对每个对象执行

    private void NAR(object o)
    {
    try
    {
    System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch {}
    finally
    {
    o = null;
    }
    }
    参见

    http://support.microsoft.com/kb/317109
    2008年8月1日 2:50
    版主
  •  

    你可以尝试一下

    先执行 close()

    再执行 Quit()

     

    我原来处理 word就是这样写的

    2008年8月1日 4:35
  • 我的经验是工作簿这个对象必须先于APP关闭和资源释放,SHEET就不强求。

     

    希望对你有帮助

     

     

     

    http://blog.sina.com.cn/s/blog_593b4d50010095r0.html
    2008年8月1日 6:55
  • 谢谢各位,我今明两天找时间试试再说。
    2008年8月1日 7:55
  • 再次谢谢以上各位,我昨天晚上试的结果,相同的语句,并不是所有的情况都可以。我在调用Excel之后用以下语句结束进程:

    ReleaseExcel.NAR(wb);
                    if (app != null)
                    {
                        app.Quit();
                    }
                    ReleaseExcel.NAR(app);
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
    NAR方法我放在了一个单独的类里,和E章老大的完全一样。
    在有的窗体里,Excel进程可以完全消失;但有的地方却不行。

    另:原来可以自动结贴啊。

    2008年8月6日 0:33
  •  

    用这个吧,包治百病:

     

    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

    2008年8月21日 6:23
  •  

    这种方法并不完全奏效。
    2008年8月21日 6:27