小弟现在通过程序打开一个excel进程,此时我关闭excel不关闭程序,发现进程excel.exe并没有被关闭。此时如果程序再开excel就会又添加一个excel。
小弟现在想在程序中控制excel进程。
如果关闭excel的话,就把excel.exe进程释放,否则不用考虑。
现小弟的处理的方法:
1,想在开excel的时候,就检测是否有excel的进程,而该进程对应的excel文件又没打开的。就关闭,否则新开一个excel。
2,想让e xcel关闭的时候就自动把进程释放。
如何实现??
另如何添加这个excel进程到一个arraylist中??

解决方案 »

  1.   

    调用API查询进程。然后给它的窗口,发个WM_CLOSE消息。
      

  2.   

    Private Sub killEXCEL() '为进程避免冲突,在调用EXCEL前先杀死现有EXCEL进程.  Dim pProcess() As Process  pProcess = Process.GetProcesses()  Dim i As Integer  For i = 0 To pProcess.Length() - 1    If (pProcess(i).ProcessName = "EXCEL") Then    pProcess(i).Kill() '关闭进程    End If  NextEnd Sub 
      

  3.   

    这样吧: ArrayList arr = new ArrayList();
    Process[] procs = Process.GetProcessesByName("Excel");
    arr.AddRange(procs);

    try
    {
    Application.Run(new MainForm());
    }
    catch (Exception e)
    {
    ExceptionForm.Show(e);
    }

    // 杀掉死掉的 Excel 进程
    procs = Process.GetProcessesByName("Excel");
    foreach (Process proc in procs)
    {
    if (arr.IndexOf(proc) < 0)
    {
    proc.Kill();
    }
    } Process.GetCurrentProcess().Kill();
      

  4.   

    记得用完的对象Book 什么的一定要设置为 Nothing 然后内存回收。
      

  5.   

    Kill 强制终止进程,而 CloseMainWindow 只是请求终止。有图形界面的进程在执行时,其消息循环处于等待状态。每当操作系统向该进程发送 Windows 消息时,该消息循环执行。调用 CloseMainWindow 会向主窗口发送关闭请求,在一个设计规范的应用程序中,该请求会关闭子窗口并撤消此应用程序所有正在运行的消息循环。通过调用 CloseMainWindow 发出的退出进程的请求不强制应用程序退出。应用程序可以在退出前请求用户验证,也可以拒绝退出。若要强制应用程序退出,请使用 Kill 方法。CloseMainWindow 的行为与用户使用系统菜单关闭应用程序主窗口的行为一样。因此,通过关闭主窗口发出的退出进程的请求不强制应用程序立即退出。如果调用 Kill,则可能丢失进程编辑的数据或分配给进程的资源。Kill 导致进程不正常终止,因而只应在必要时使用。CloseMainWindow 使进程能够有序终止并关闭所有窗口,所以对于有界面的应用程序,使用它更好。如果 CloseMainWindow 失败,则可以使用 Kill 终止进程。Kill 是终止没有图形化界面的进程的唯一方法。只能对在本地计算机上运行的进程调用 Kill 和 CloseMainWindow。无法使远程计算机上的进程退出。仅可查看在远程计算机上运行的进程的信息。
      

  6.   

    private void KillProcess(string processName)
    {
    System.Diagnostics.Process myproc= new System.Diagnostics.Process();
    //得到所有打开的进程
        try{
        foreach (Process thisproc in Process.GetProcessesByName(processName)) {
           if(!thisproc.CloseMainWindow()){
    thisproc.Kill();
    }
            }
          }
        catch(Exception Exc)
        {
            msg.Text+= "杀死" + processName + "失败!";
        }
    }
      

  7.   

    同意LoveCherry(最讨厌你们这些要代码的了,一点技术含量都灭有)
      

  8.   

    参考
    http://dotnet.aspx.cc/ShowDetail.aspx?id=299D1529-59A3-42F9-77A7-7BF353754FEA
    老孟高手的做法
      

  9.   

    private void KillProcess(string processName)
    {
    System.Diagnostics.Process myproc= new System.Diagnostics.Process();
    //得到所有打开的进程
    try
    {
    foreach (Process thisproc in Process.GetProcessesByName(processName)) 
    {
    if(!thisproc.CloseMainWindow())
    {
    thisproc.Kill();
    }
    MessageBox.Show("杀死" + processName + "成功!");
    }

    }
    catch(Exception Ex)
    {
    MessageBox.Show("杀死" + processName + "失败!");
    }
    }
      

  10.   

    http://dotnet.aspx.cc/ShowDetail.aspx?id=299D1529-59A3-42F9-77A7-7BF353754FEA
      

  11.   

    在调用Excel的方法之外调用GC.Collect() 就好了,进程列表中Excel的进程在GC.Collect() 后就消失了。
    void DoSomething(){      ...      HandleExcel();      GC.Collect() ;}void HandleExcel(){Excel.Application myExcel = new Excel.Application() ;...myExcel.Quit();}
    保证GC.Collect() 收集垃圾前释放EXCEL对象极其引用,确保垃圾回收器可以回收这些资源。直接杀Excel进程,但是这样有很大的问题(有可能杀掉用户自己打开的Excel)。后来用上面的方式后就好了。本方法在WinForm下的正常,asp.net中在服务器端执行Excel好像不是很好。
      

  12.   

    Excel是一个COM 对象,COM对象有一个引用计数的概念,只要计数不为0,Excel这个进程外COM对象就不会释放。
      

  13.   

    redbb(....Dotneter....欢迎猎头与我联系...) 说得对。
      

  14.   

    如果采用 amendajing(学习+学习+再学习=郁闷) ,smx717616(C#初学者…) ,LoveCherry(最讨厌你们这些要代码的了,一点技术含量都灭有) ,cjjll(潇潇风雨)等同志提供的方法Kill Process 后,会不会造成为保存客户其他Excel数据的调式或损坏。会不会因解决一个问题而引发其他问题!结果是明显的,期待 E章 同志的高见!
      

  15.   

    期待 redbb(....Dotneter....欢迎猎头与我联系...) 同志的进一步见解!
      

  16.   

    前几天做了一个程序,打开EXCEL并保存数据库中,发现Excel进程关不了,后来采取了下面的方法,希望对大家有用:
    using System.Runtime.InteropServices;
    namespace ProduceDayReport
    {
    public class ExceptionReport : System.Windows.Forms.Form
    {
    ..................
    private const int  WM_CLOSE=0x0010;
    private const int  WM_QUIT=0x0012;
    private const int  WM_DESTROY=0x0002;
    .....................................
                      ..............
    delegate DataTable AsynchronousManipulateDelegage();
    private AsynchronousManipulateDelegage amd;[DllImport("user32.dll",CharSet=CharSet.Unicode)] 
    public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
    [DllImport("user32.dll")]
    public static extern bool MessageBeep(BeepType beepType); 
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);.....................//关键是下面的话excel.DisplayAlerts =false;
    PostMessage(excel.HWND,WM_CLOSE,new IntPtr(0),new IntPtr(0));
    PostMessage(excel.HWND,WM_DESTROY,new IntPtr(0),new IntPtr(0));///////////
    以上是我从程序内拷贝的一部分,希望大家知道该么做!
    如果你用的不是officeXP,则在打开EXCEL后,做这样的工作:
    excel.Workbooks.Open (.......);
    String WndClassCaption="Microsoft Excel - "+xlsName.Substring(xlsName.LastIndexOf (@"\")+1);
    IntPtr hwnd_win = FindWindow("XLMAIN", WndClassCaption);
    if(hwnd_win==IntPtr.Zero)
    {
    hwnd_win = FindWindow("MS-SDIa",xlsName.Substring(xlsName.LastIndexOf (@"\")+1));
    if(hwnd_win==IntPtr.Zero)
    {MessageBox.Show ("没找到窗口类   "+xlsName.Substring(xlsName.LastIndexOf (@"\")+1));
    return null;
    }
    }
    ...................
    并作如下更改:
    excel.DisplayAlerts =false;
    PostMessage((IntPtr)hwnd_win,WM_CLOSE,new IntPtr(0),new IntPtr(0));
    PostMessage((IntPtr)hwnd_win,WM_DESTROY,new IntPtr(0),new IntPtr(0));
      

  17.   

    use  tmeteor()  's method is enough
      

  18.   

    这两天做项目去了。太忙,没来得及看。不好意思!首先感谢大家的热心帮助。小弟谢谢了!
     JasonHeung(拥有一切也只不过这样笑着哭) 
     smx717616(C#初学者…) 
     这样把其他不是程序打开的excel关闭了。。不好。 LoveCherry(最讨厌你们这些要代码的了,一点技术含量都灭有) 
    这样只能在让程序不同监听程序是否关闭才能释放excel进程。而我想是不是可以让excel一关闭的时候就释放,就和事件响应一样?redbb(....Dotneter....欢迎猎头与我联系...) 
    Excel是一个COM 对象,COM对象有一个引用计数的概念,只要计数不为0,Excel这个进程外COM对象就不会释放。
    能不能举个例子来抓这个引数,和修改这个引数?不过这方法也和LoveCherry(最讨厌你们这些要代码的了,一点技术含量都灭有) 一样。需要监视进程窗口关闭了没有?
    heiding(黑麒麟) 提出的问题,强顶,期待高手帮忙解决哦。。
      

  19.   

    void DoSomething(){      ...      HandleExcel();      GC.Collect() ;}void HandleExcel(){Excel.Application myExcel = new Excel.Application() ;...myExcel.Quit();}