2010-02-26 34 views

回答

4

试试这个:

foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName("EXCEL")) 
     { 
      if (process.MainModule.ModuleName.ToUpper().Equals("EXCEL.EXE")) 
      { 
       process.Kill(); 
       break; 
      } 
     } 
+5

这是相当unhygenic,并可能打破东西如果Excel实例仍有打开的文件。它还会杀死机器上的所有Excel实例 - 包括未由您的程序启动的那些实例(即用户已打开的实例)。根据运行这些任务的用户的特权,它可能会终止属于其他用户的Excel进程 - 想象一下,在终端服务或Citrix服务器上运行它。 – ConcernedOfTunbridgeWells 2010-02-26 10:15:55

+1

@ConcernedOfTunbridgeWells - 是的,它会关闭甚至打开excel文件没有任何问题。只是回答Lalit Dhake的问题:) – 2010-02-26 10:19:39

4

我敢肯定,约99%,你的问题是由悬空COM​​引用防止Excel进程的关闭造成的。 Excel尤其容易出现这种情况,因为它倾向于透明地生成COM引用,而不会让您获取手柄并明确关闭它们。

PIA通过自己设置对底层COM对象的引用来解决这个问题,除非明确地让它们执行,否则它们不会清理。正是出于这个原因,通过PIA工作Excel非常繁琐。

Application.Quit()(IIRC这是它叫什么)关闭过程中如果引用都正确清理。这意味着你必须仔细管理任何持有COM引用的Excel进程的生命周期,并确保所有COM引用都被正确清理。

0

根据您的需求,您可以考虑使用,让你没有COM互操作一个Excel兼容的组件(无挂的情况下,更好的性能,请不要担心Excel中是否安装或安装的是哪个版本的Excel )。

你可以看到C#和VB源here现场ASP.NET样本,了解更多有关的SpreadsheetGear的Windows窗体控件和样品here,如果你想尝试一下自己下载免费试用here

声明:我自己的SpreadsheetGear LLC

+0

而不是一个插件的弱借口。 – jwg 2013-09-16 21:47:41

1
Application app = new Application(); 
... 
EndTask((IntPtr)app.Hwnd, true, true); 

[DllImport("user32.dll")] 
public static extern bool EndTask(IntPtr hwnd, bool shutdown, bool force); 
相关问题