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
sheet=null
wk=null
app.quit
app=null
#3
谢谢
51Crack。
但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉
但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉
#4
还有一个问题,
当有其他Excel文件打开时,会有一个进程。
通过以上程序打开另外一个Excel文件,也会有一个进程。
该如何判断处理的是哪个进程呢?
当有其他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怎么获取?
即,怎么判断Excel.Application产生的进程是哪一个Excel进程,或者产生的进程ID怎么获取?
#9
哎,没处理一次打开一个Excel进程。
知道如何杀掉进程,但又担心关闭了其他正在使用的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);
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
谢谢 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
sheet=null
wk=null
app.quit
app=null
#3
谢谢
51Crack。
但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉
但是有个问题,当我多次选择此Excel打开时,虽然没出错,但是任务管理器中的Excel进程数一直在增加,好像并没将处理完的Excel进程给停掉
#4
还有一个问题,
当有其他Excel文件打开时,会有一个进程。
通过以上程序打开另外一个Excel文件,也会有一个进程。
该如何判断处理的是哪个进程呢?
当有其他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怎么获取?
即,怎么判断Excel.Application产生的进程是哪一个Excel进程,或者产生的进程ID怎么获取?
#9
哎,没处理一次打开一个Excel进程。
知道如何杀掉进程,但又担心关闭了其他正在使用的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);
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
谢谢 csui2008