【问题标题】:Kill Process Excel C#杀死进程 Excel C#
【发布时间】:2012-02-16 17:35:53
【问题描述】:

我必须 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();

杀死一个两者。 我只想杀一个... 谢谢。

【问题讨论】:

  • 刚刚在谷歌上快速搜索了一下,尝试 Process.MainWindowTitle() 获取 Excel 进程的标题,然后决定要杀死哪个进程。
  • 正确的方法是跟踪和释放应用程序 COM 对象及其所有依赖项。

标签: c# process kill


【解决方案1】:

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");

编辑:经过测试和验证可以正常工作。

【讨论】:

  • 你的意思是它不起作用,你是否尝试打开example1.xlsx并查看它是否关闭它?您是否使用其他导致多个 EXCEL.exe 产生的代码使 Excel 自动化
  • 如果您打开了两个 excel 文档,并且如果您运行此代码,则关闭两者....
  • 我有这个:Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlBook = xlApp.Workbooks.Open("c:\\teste.xlsx", 0, false, format, null, null, false, Excel.XlPlatform.xlWindows, null, true, false, 0, true, false , 错误的);这行得通...但是为什么 MainWindowTitle 等于空字符串但不等于“Microsoft Excel - teste.xlsx”???
【解决方案2】:

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

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

如果您的 excel 文档不可见,那么您的 MainWindowTitle 将是 """" 用于MainWindowTitle 将杀死所有僵尸excel 进程。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        复制并粘贴此内容。完成!

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

        【讨论】:

          【解决方案6】:

          您需要检查由进程打开的文件句柄,然后将其杀死。
          如何检查哪个文件句柄进程正在持有: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;
              }
           }
          

          【讨论】:

          • HasFileHandle 定义了什么库?谢谢你
          • 这是一个伪方法,你可以在我提到的stackoverflow链接中找到实现。
          【解决方案7】:

          尝试获取主窗口标题

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

              使用以下逻辑来防止任务管理器中的僵尸 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);
              

              【讨论】:

              • 此脚本将保留在您的应用程序启动之前打开的其他 Excel。
              【解决方案10】:

              在命名空间部分添加这个 using 语句。

              using System.Diagnostics;
              

              这个例子用这个实例化了 Excel:

              _Application excel = new _Excel.Application();
              

              此方法通过使用窗口句柄终止正确的 Excel 任务。

                  public void Kill()
                  {
                      Int32 ExcelHwnd = excel.Hwnd;
                      Process[] localExcel = Process.GetProcessesByName("EXCEL");
                      foreach (Process Pgm in localExcel)
                      {
                          // xlMinimized keeps the screen from flashing when the user interface is made 
                          // visible with the excel.visible needed to set the MainWindowHandle
                          excel.WindowState = XlWindowState.xlMinimized;
                          excel.Visible = true;
                          if ((Pgm.ProcessName == "EXCEL") && (ExcelHwnd == Pgm.MainWindowHandle.ToInt32()))
                          {
                              Pgm.Kill();
                          }
                      }
                  }
              

              这成功了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-07-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多