实际上我正在编写一个小应用程序(WinForms + C#),我正在阅读Excel文件。退出应用程序并转到任务管理器后,我发现Excel.exe仍在运行。当我多次运行我的应用程序时,我发现在任务管理器中运行了多个Excel.exe实例。
有人可以告诉我每次退出应用程序时要杀死“Excel.exe”需要做什么......
代码有点像这样:
ApplicationClass appClass = new ApplicationClass();
Workbook workBook = appClass.Workbooks.Open(path, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
Worksheet workSheet = (Worksheet) workBook.ActiveSheet;
所有在此命名空间下:Microsoft.Office.Interop.Excel;那是 COM
答案 0 :(得分:9)
您是如何阅读Excel文件的?如果您使用的是COM,则需要在完成后拨打Application.Quit
。
修改 -
//Initializing the application class
ApplicationClass appClass = new ApplicationClass();
try
{
Workbook workBook = appClass.Workbooks.Open(path,0,true,5,"","",true,XlPlatform.xlWindows,"\t",false,false,0,true,1,0);
Worksheet workSheet = (Worksheet)workBook.ActiveSheet;
// do stuff with the workbook
}
finally
{
appClass.Quit();
}
答案 1 :(得分:5)
而不是杀死进程......为什么不正确处理Excel句柄呢?听起来像是打开Excel实例而没有正确关闭它们。 在使用它们之后发布获得的资源通常是一个好主意。
答案 2 :(得分:2)
查看此示例 - http://www.dreamincode.net/code/snippet1543.htm
它使用Process.Kill()方法 - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill.aspx
答案 3 :(得分:2)
此答案假设您通过Process.Start
启动Excel。该代码直到稍后才发布。
在这种情况下,请保持该调用返回的进程句柄,然后使用该句柄调用Process.CloseMainWindow
,然后调用Process.Close
:
Process ExcelProcess; // Declaration
存储流程句柄:
ExcelProcess = Process.Start(...);
然后当您退出申请时:
// Close process by sending a close message to its main window.
ExcelProcess.CloseMainWindow();
// Free resources associated with process.
ExcelProcess.Close();
答案 4 :(得分:2)
Process[] pro = Process.GetProcessesByName("excel");
pro[0].Kill();
pro[0].WaitForExit();
这很容易。你可以按名称,id等进行处理。只需转到你的进程,Kill()和WaitForExit();
答案 5 :(得分:0)
在我的情况下,在某些任务中,excel实例在我执行app.Quit()调用后仍在运行。
我的解决方案是:
application = null;
GC.Collect();
GC.WaitForPendingFinalizers();
将app实例设为null并对GC进行强制调用。
希望这个帮助