Убить процесс Excel C#

У меня есть 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();

Это убивает обоих. Я хочу убить только одного... Спасибо.

9 ответов

Решение

Заголовок 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");

Изменить: Проверено и проверено на работу.

Пост kd7 - это отличный ответ, и он хорошо работает, нужно добавить только две вещи,

MainWindowTitle формат - "Filename.xlsx - Excel"

Если ваш документ Excel не виден, то ваш MainWindowTitle будет "" с использованием "" за MainWindowTitle убьет весь процесс зомби Excel ".

Если ваш текущий код работает, эта поправка должна убить первый процесс, который он найдет с именем "EXCEL".

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

Если вы хотите убить определенный процесс, вам нужно будет предоставить немного больше информации.

Скопируйте и вставьте это. Это сделано!

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

Excel всегда будет одним процессом, AFAIK. Один и тот же процесс / окна открывает несколько документов внутри него. То, что вы хотите сделать, это использовать автоматизацию Excel, чтобы ЗАКРЫТЬ документ, который вы хотите. Возможно, это поможет вам начать. http://support.microsoft.com/kb/302084

Надеюсь это поможет.

В разделе пространства имен добавьте этот оператор 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();
            }
        }
    }

Это сработало без сбоев.

Вам нужно проверить файловые дескрипторы, которые открываются процессом, а затем убить его.
Как проверить, какой дескриптор файла удерживается процессом: Как получить список открытых дескрипторов файла по процессу в C#?

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

Попробуйте получить заголовок главного окна

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

Только что сделал быстрый поиск в Google, попробуйте Process.MainWindowTitle() чтобы получить заголовок процесса Excel и решить, какой из них вы хотите убить.

Я не уверен в этом методе, но надеюсь, что это поможет:

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

Используйте приведенную ниже логику для предотвращения процессов 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);
Другие вопросы по тегам