2012-02-16 202 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 { } 
     } 
    }