杀死进程Excel C#

问题描述 投票:9回答:9

我必须2处理excel。例如:

1)example1.xlsx 2)example2.xlsx

如何杀死第一个“example1.xlsx”?

我用这个代码:

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

那杀了两个。我想杀一个......谢谢。

c# process kill
9个回答
9
投票

ProcessMainWindow Title将为您完成,它将“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");

编辑:测试并验证工作。


2
投票

如果您当前的代码正在运行,则此修订应该使用名称“EXCEL”终止它找到的第一个进程。

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

如果你想杀死一个特定的进程,你将不得不提供更多的信息。


2
投票

kd7's帖子是一个很棒的答案,效果很好,只需添加两件事,

MainWindowTitle格式是 - "Filename.xlsx - Excel"

如果您的excel文档不可见,那么您的MainWindowTitle将使用"" ""MainWindowTitle将杀死所有zombie excel进程'。


1
投票

Excel将永远是一个单一的过程,AFAIK。相同的进程/窗口在其中打开多个文档。您要做的是使用Excel自动化来关闭您想要的文档。也许这会让你开始。 http://support.microsoft.com/kb/302084

希望这可以帮助。


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 { }
         }
     }

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
投票

尝试获取主窗口标题

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

0
投票

刚刚在Google上进行了快速搜索,尝试使用Process.MainWindowTitle()来获取Excel进程的标题,然后决定要杀死哪一个。

我不确定这种方法,但希望这会有所帮助:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainwindowtitle.aspx


0
投票

使用以下逻辑来防止任务管理器中的Zombie 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);
© www.soinside.com 2019 - 2024. All rights reserved.