2010-02-26 51 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); 
相關問題