2012-02-16 150 views
8

我必須2個進程excel。例如:殺死進程Excel C#

1)example1.xlsx 2)example2.xlsx

如何先殺掉 「example1.xlsx」?

我用這個代碼:

foreach (Process clsProcess in Process.GetProcesses()) 
    if (clsProcess.ProcessName.Equals("EXCEL")) //Process Excel? 
      clsProcess.Kill(); 

殺死一兩個。 我想殺了一個... 謝謝。

+0

只是做了谷歌快速搜索,嘗試過程。MainWindowTitle()獲取Excel進程的標題,並決定要殺死哪一個。 – JXITC 2012-02-16 17:45:07

+1

正確的方法是跟蹤和釋放Application COM對象及其所有依賴項。 – Motes 2013-12-23 14:21:44

回答

7

的ProcessMainWindow標題會爲你做它,它追加「Microsoft Excel中 - 」將文件的名稱:

所以基本上(快速碼):

private void KillSpecificExcelFileProcess(string excelFileName) 
    { 
     var processes = from p in Process.GetProcessesByName("EXCEL") 
         select p; 

     foreach (var process in processes) 
     { 
      if (process.MainWindowTitle == "Microsoft Excel - " + excelFileName) 
       process.Kill(); 
     } 
    } 

用途:

KillSpecificExcelFileProcess("example1.xlsx"); 

編輯:測試和認證工作。下面邏輯

+0

是不行的...我有很多過程Excel運行... – Eriksson 2012-02-16 18:17:47

+0

你是什麼意思,它不起作用,你試着打開example1.xlsx,看看它是否關閉它?您是否使用其他代碼自動運行Excel,導致多個EXCEL.exe產生 – kd7 2012-02-16 19:36:36

+0

如果您打開了兩個excel文檔,並且運行此代碼,則會關閉這兩個文件。 – Eriksson 2012-02-16 22:09:45

1

Excel將永遠是一個單獨的過程,AFAIK。相同的進程/窗口打開其中的多個文檔。你想要做的是使用Excel自動化來關閉你想要的文檔。也許這會讓你開始。 http://support.microsoft.com/kb/302084

希望這有助於。

2

如果您當前的代碼工作,這項修正案應該殺了它的名稱爲「EXCEL」找到的第一個過程。

foreach (Process clsProcess in Process.GetProcesses()) 
{ 
    if (clsProcess.ProcessName.Equals("EXCEL")) 
    { 
    clsProcess.Kill(); 
    break; 
    } 
} 

如果你想殺死一個特定過程中,你將不得不給多一點信息。

0

你需要檢查的文件句柄,由進程打開,然後殺死它。
如何檢查的文件處理過程中保持:How do I get the list of open file handles by process in C#?

foreach (Process clsProcess in Process.GetProcesses()) 
{ 
    if (clsProcess.ProcessName.Equals("EXCEL") && HasFileHandle(fileName, clsProcess)) 
    { 
     clsProcess.Kill(); 
     break; 
    } 
} 
+0

定義了什麼庫HasFileHandle?謝謝你 – Eriksson 2012-02-16 18:18:39

+0

這是一個僞裝的方法,你可以在我提到的stackoverflow鏈接中找到實現。 – Giedrius 2012-02-20 07:00:20

0

嘗試讓主窗口標題

foreach (Process clsProcess in Process.GetProcesses()) 
    { 
     if (clsProcess.ProcessName.Equals("EXCEL")&& clsProcess.MainWindowTitle =="example") 
     { 
      clsProcess.CloseMainWindow(); 
      break; 
     } 
    } 
0

使用,以防止殭屍的Excel程序在任務管理器

List<int> GetAllExcelProcessID() 
    { 
     List<int> ProcessID = new List<int>(); 
     if (currentExcelProcessID == -1) 
     { 
      List<System.Diagnostics.Process> currentExcelProcessList = System.Diagnostics.Process.GetProcessesByName("EXCEL").ToList(); 
      foreach(var item in currentExcelProcessList) 
      { 
       ProcessID.Add(item.Id); 
      } 
     } 
     return ProcessID; 
    } 
int GetApplicationExcelProcessID(List<int> ProcessID1, List<int> ProcessID2) 
    { 
     foreach(var processid in ProcessID2) 
     { 
      if (!ProcessID1.Contains(processid)) { currentExcelProcessID = processid; } 
     } 
     return currentExcelProcessID; 
    } 
void KillExcel() 
    { 
     System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessById(currentExcelProcessID); 
     process.Kill(); 
    } 
List<int> ProcessID1 = GetAllExcelProcessID(); 
       excel = new Excel.Application(); 
       List<int> ProcessID2 = GetAllExcelProcessID(); 
       currentExcelProcessID = GetApplicationExcelProcessID(ProcessID1, ProcessID2); 
+0

此腳本將保留在應用程序啓動之前打開的其他excel。 – user3255770 2014-01-31 03:01:53

1

複製並粘貼此。完成!

System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel"); 
    foreach (System.Diagnostics.Process p in process) 
    { 
     if (!string.IsNullOrEmpty(p.ProcessName)) 
     { 
      try 
      { 
       p.Kill(); 
      } 
      catch { } 
     } 
    }