Я хочу закрыть определенный файл Excel среди более чем 2 открытых без процесса Killing Excel - PullRequest
0 голосов
/ 20 сентября 2019

У меня открыты три файла Excel (MS Office 16).Мой код проверяет определенный файл, если он открыт, затем он пытается закрыть его, но закрывает процесс Excel, который в конечном итоге закрывает все файлы Excel.

Что я заметил, в диспетчере задач есть только один EXCEL.EXEporcess для всех файлов и на вкладке Details я вижу все мои открытые файлы Excel с именем.

What I Tried is :

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses("Excel");    
  foreach (Process p in processes)
  {
      if (p.MainWindowTitle == "MyFile.xlsx - Excel")
      {
          p.Kill();
          break;
      }
  }

и код ниже ничего не делает:

 Microsoft.Office.Interop.Excel.Application xlApp = new icrosoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(path);
            //xlWorkbook.Close(false);

            xlWorkbook.Close(true, Type.Missing, Type.Missing);
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
            xlWorkbook = null;
            xlApp = null;

            GC.Collect();

1 Ответ

1 голос
/ 20 сентября 2019

Вместо того, чтобы убивать процесс, отправьте закрытое сообщение в окно:

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses("Excel");    
foreach (Process p in processes)
{
  if (p.MainWindowTitle == "MyFile.xlsx - Excel")
  {
    int hwnd = 0;

    //Get a handle for the Application main window
    hwnd = FindWindow(null, p.MainWindowTitle);

    //send WM_CLOSE system message
    if (hwnd != 0)
      SendMessage(hwnd, WM_CLOSE, 0, IntPtr.Zero); 

    break;
  }
}
...