我在程序中有以下内容(用VB.NET编写):
Imports Microsoft.Office.Interop.Excel
Public Class Form1
Dim eApp As New Excel.Application
Dim w As Excel.Workbook
w = eApp.Workbooks.Open( "path.xls", ReadOnly:=True)
.. Processing Code ..
//Attempts at killing the excel application
w.Close()
eApp.Workbooks.Close()
eApp.Quit()
End Class
当我运行这几次时,我在任务管理器中获得了一堆EXCEL.EXE实例。我怎样才能在代码中杀死这些进程?代码中的所有代码都经过了尝试而无法正常工作。
答案 0 :(得分:3)
答案 1 :(得分:3)
我必须在NET 1.1中做一段时间,所以请原谅生锈。
在eApp上,有一个Hwind(一个win32窗口句柄 - http://msdn.microsoft.com/en-us/library/bb255823.aspx)或类似的对象。我必须使用它和pInvoke(http://www.pinvoke.net/default.aspx/user32.GetWindowThreadProcessId)来获取进程ID。有了这个,我就可以在exe上执行Process.Kill()。
现在可能有更好的方法,但这应该有效。
答案 2 :(得分:2)
要退出Excel,您需要调用Application.Quit,并使用以下技术之一。
在您实例化的每个Excel对象上调用Marshal.ReleaseComObject。有一个KnowledgeBase article描述了如何做到这一点。例如,在示例代码“eApp.Workbooks.Open”中实例化Workbooks对象而不为其分配变量。您需要按照知识库文章中的描述分配变量,以便随后可以将其释放。除了最简单的自动化场景之外,很难确定你总是在所有代码路径中释放所有这些对象(例如,通过使用try / finally确保在抛出异常时释放它们)。
释放最后一个Excel对象后,调用GC.Collect和GC.WaitForPendingFinalizers。有些人建议您可能需要两次这样做。
答案 3 :(得分:1)
启动Excel:
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = xlApp.Workbooks.Open(...);
Worksheet ws = (Worksheet)wb.Worksheets[1];
杀死Excel:
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
wb = null;
ws = null;
uint idProcess;
GetWindowThreadProcessId((IntPtr)xlApp.Hwnd, out idProcess);
xlApp.DisplayAlerts = false;
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlApp = null;
xlApp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Process processo = null;
try
{
processo = Process.GetProcessById((int)idProcess);
}
catch { }
if (processo != null)
processo.Kill();
答案 4 :(得分:0)
我几天前发布了一个解决方案: Killing Excel.EXE on server
与StingyJack提到的方法相同;我认识的唯一一个真正有效的人。
答案 5 :(得分:0)
使用使用块
Using eApp As New Excel.Application
Using w As Excel.Workbook
w = eApp.Workbooks.Open( "path.xls", ReadOnly:=True)
.. Processing Code ..
//Attempts at killing the excel application
w.Close()
eApp.Workbooks.Close()
eApp.Quit()
End Using
End Using
类似于在finally中使用丢弃的try / finally块,这将自动处理Excel.Application和Excel.Workbook。
如其他帖子所述,System.Runtime.InteropServices.Marshal.ReleaseComObject(eApp)可能也是必要的????
答案 6 :(得分:0)
在ExcelApplication.Quit()之后添加以下代码。
它将从进程中杀死excel应用程序。
Process[] Proc = Process.GetProcessesByName("Excel");
foreach (Process p in Proc)
{
if (p.MainWindowTitle == "")
p.Kill();
}
答案 7 :(得分:0)
Tagore Peethala解决方案很简单并且有效。基本上确保WorkBook.CLOSE ..然后ExcelApplication.QUIT ...然后只查找excel运行的实例,没有任何打开并关闭它。
myExcelWorksheet = null;
if (myExcelWorkbook != null)
{
myExcelWorkbook.Close();
myExcelWorkbook = null;
}
if (myExcelApp != null)
{
myExcelApp.Quit();
myExcelApp = null;
}
foreach (System.Diagnostics.Process myProcess in System.Diagnostics.Process.GetProcessesByName("Excel"))
{
if (myProcess.MainWindowTitle == "")
{
myProcess.Kill();
}
}
答案 8 :(得分:0)
//Quit Excel application
eApp.Quit();
//Release COM objects (every object you used in eApp,like workbooks, Workbook, Sheets, Worksheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
// Force garbage collector cleaning
GC.Collect();