怎么强制关闭Excel进程。

时间:2022-08-06 23:53:21
Winform中,读取Excel某个sheet中的内容,常见方法如下:

 Dim app As New Excel.Application
 Dim wk As Excel.Workbook
 Dim sheet As Excel.Worksheet
 wk = app.Workbooks.Open(filename)
 sheet = wk.Worksheets("sheet2")
 。。。
 app.Quit() 

上面做的缺点是,只有当Winform应用程序结束的时候,此Excel进程才会关闭。
但是我想在用完Excel后,则强制关闭此进程,该怎么做呢?


但是不能关闭所有的Excel进程,比如说有其他Excel文件正在打开中。

13 个解决方案

#1


 protected void killAllProcess()
        {
            System.Diagnostics.Process[] myPs;
            myPs = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in myPs)
            {
                if (p.Id != 0)
                {
                    try
                    {
                        if (p.Modules != null)
                            if (p.Modules.Count > 0)
                            {
                                System.Diagnostics.ProcessModule pm = p.Modules[0];
                                if (pm.ModuleName.ToLower() == "winexcel.exe")
                                    p.Kill();
                            }
                    }
                    catch
                    { }
                    finally
                    {
                        ;
                    }
                }
            }
        }

#2


app.Workbooks.Close
sheet=null
wk=null
app.quit
app=null

#3


谢谢  51Crack

但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉

#4


还有一个问题,

当有其他Excel文件打开时,会有一个进程。
通过以上程序打开另外一个Excel文件,也会有一个进程。
该如何判断处理的是哪个进程呢?

#5



 // 强行关闭指定的Excel进程    public static void Kill(Microsoft.Office.Interop.Excel.Application theApp)    {        int iId = 0;        IntPtr intptr = new IntPtr(theApp.Hwnd);        System.Diagnostics.Process p = null;         try        {            GetWindowThreadProcessId(intptr, out iId);            p = System.Diagnostics.Process.GetProcessById(iId);             if (p != null)            {                p.Kill();                p.Dispose();            }         }        catch (Exception e)        {            throw e;        }    } 
摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201007/52851.html

#7


可以只存在一个进程的,你只要获取那个Excel的进程,然后强制类型转换到Excel.Application,就可以*控制那个打开的Excel进程了。

#8


不好意思,能说的详细点吗?最好有代码了。

即,怎么判断Excel.Application产生的进程是哪一个Excel进程,或者产生的进程ID怎么获取?

#9


哎,没处理一次打开一个Excel进程。

知道如何杀掉进程,但又担心关闭了其他正在使用的Excel。

#10


建议直接杀掉   最简单的    你的进程关闭操作  反正没有什么临时措施

#11


 System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                    book.Close(oMissing, oMissing, oMissing);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
                    app.Workbooks.Close();
                    System.GC.Collect(System.GC.GetGeneration(app));
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app.Workbooks);
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

#12


这是我前一个项目用过的,正好有关于Excel的操作。

这是一些参数定义:

/// <summary>
/// 
/// </summary>
private Excel.ApplicationClass m_xApp;

private Excel.Workbooks m_xBooks;

private Excel.Workbook m_xBook;
/// <summary>
/// 当前活动
/// </summary>
private Excel.Worksheet m_xSheet;
/// <summary>
/// Excel单元格集合
/// </summary>
private Excel.Range m_xRange;
/// <summary>
/// 缺少Object
/// </summary>
private object m_Missing = Missing.Value;



/// <summary>
/// 释放所引用的COM对象。注意:这个过程一定要执行。
/// </summary>
public void Dispose()
{
    Release(m_xSheet);
    Release(m_xBook);
    Release(m_xBooks);
    //Release(m_xApp);
    KillSpecialExcel();
    System.GC.Collect();
    System.GC.WaitForPendingFinalizers();
}
/// <summary>
/// 释放对象,内部调用
/// </summary>
/// <param name="o">将释放的对象</param>
private void Release(object o)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch
    { }
    finally { o = null; }
}
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
/// <summary>
/// 找到Excel的进程ID,然后杀死这个进程
/// </summary>
public void KillSpecialExcel()
{
    try
    {
        if (m_xApp != null)
        {
            int lpdwProcessId;
            IntPtr intPtr = new IntPtr(m_xApp.Hwnd);
            GetWindowThreadProcessId(intPtr, out lpdwProcessId);

            System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Delete Excel Process Error:" + ex.Message);
    }
}

#13


搞定了。先获得此APP的句柄再获得它的ProcessID,再关闭即可。

谢谢  csui2008

#1


 protected void killAllProcess()
        {
            System.Diagnostics.Process[] myPs;
            myPs = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in myPs)
            {
                if (p.Id != 0)
                {
                    try
                    {
                        if (p.Modules != null)
                            if (p.Modules.Count > 0)
                            {
                                System.Diagnostics.ProcessModule pm = p.Modules[0];
                                if (pm.ModuleName.ToLower() == "winexcel.exe")
                                    p.Kill();
                            }
                    }
                    catch
                    { }
                    finally
                    {
                        ;
                    }
                }
            }
        }

#2


app.Workbooks.Close
sheet=null
wk=null
app.quit
app=null

#3


谢谢  51Crack

但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉

#4


还有一个问题,

当有其他Excel文件打开时,会有一个进程。
通过以上程序打开另外一个Excel文件,也会有一个进程。
该如何判断处理的是哪个进程呢?

#5



 // 强行关闭指定的Excel进程    public static void Kill(Microsoft.Office.Interop.Excel.Application theApp)    {        int iId = 0;        IntPtr intptr = new IntPtr(theApp.Hwnd);        System.Diagnostics.Process p = null;         try        {            GetWindowThreadProcessId(intptr, out iId);            p = System.Diagnostics.Process.GetProcessById(iId);             if (p != null)            {                p.Kill();                p.Dispose();            }         }        catch (Exception e)        {            throw e;        }    } 
摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201007/52851.html

#6


#7


可以只存在一个进程的,你只要获取那个Excel的进程,然后强制类型转换到Excel.Application,就可以*控制那个打开的Excel进程了。

#8


不好意思,能说的详细点吗?最好有代码了。

即,怎么判断Excel.Application产生的进程是哪一个Excel进程,或者产生的进程ID怎么获取?

#9


哎,没处理一次打开一个Excel进程。

知道如何杀掉进程,但又担心关闭了其他正在使用的Excel。

#10


建议直接杀掉   最简单的    你的进程关闭操作  反正没有什么临时措施

#11


 System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                    book.Close(oMissing, oMissing, oMissing);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
                    app.Workbooks.Close();
                    System.GC.Collect(System.GC.GetGeneration(app));
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app.Workbooks);
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

#12


这是我前一个项目用过的,正好有关于Excel的操作。

这是一些参数定义:

/// <summary>
/// 
/// </summary>
private Excel.ApplicationClass m_xApp;

private Excel.Workbooks m_xBooks;

private Excel.Workbook m_xBook;
/// <summary>
/// 当前活动
/// </summary>
private Excel.Worksheet m_xSheet;
/// <summary>
/// Excel单元格集合
/// </summary>
private Excel.Range m_xRange;
/// <summary>
/// 缺少Object
/// </summary>
private object m_Missing = Missing.Value;



/// <summary>
/// 释放所引用的COM对象。注意:这个过程一定要执行。
/// </summary>
public void Dispose()
{
    Release(m_xSheet);
    Release(m_xBook);
    Release(m_xBooks);
    //Release(m_xApp);
    KillSpecialExcel();
    System.GC.Collect();
    System.GC.WaitForPendingFinalizers();
}
/// <summary>
/// 释放对象,内部调用
/// </summary>
/// <param name="o">将释放的对象</param>
private void Release(object o)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch
    { }
    finally { o = null; }
}
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
/// <summary>
/// 找到Excel的进程ID,然后杀死这个进程
/// </summary>
public void KillSpecialExcel()
{
    try
    {
        if (m_xApp != null)
        {
            int lpdwProcessId;
            IntPtr intPtr = new IntPtr(m_xApp.Hwnd);
            GetWindowThreadProcessId(intPtr, out lpdwProcessId);

            System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Delete Excel Process Error:" + ex.Message);
    }
}

#13


搞定了。先获得此APP的句柄再获得它的ProcessID,再关闭即可。

谢谢  csui2008