Member 14571809 Ответов: 1

Я хочу закрыть определенный файл excel среди более чем 1 открытых без убийства процесса excel


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

Что я заметил, так это то, что в диспетчере задач есть только один EXCEL.EXE porcess для всех файлов и на вкладке Details я могу видеть все мои открытые файлы excel с именем.

Что я уже пробовал:

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

and below code does nothing :

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 Ответов

Рейтинг:
2

Maciej Los

Если вы хотите проверить, если Excel уже открыл файлы, вы должны получить экземпляр приложения Excel, а затем цикл через коллекцию книг.

Кстати: вам нужно научиться использовать псевдонимы пространств имен. Видеть: использование директивы - Справочник по C# | Microsoft Docs[^]


//on the top of module
using ExcelNs = Microsoft.Office.Interop.Excel;


//then
ExcelNs.Application oExcelApp =  (ExcelNs.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
foreach(ExcelNs.Workbook wbk in oExcelApp.Workbooks)
{
    if(wbk.Name="nameToFind")
    {
        wbk.Close(SaveChanges=false);
    }
}


Для получения более подробной информации, пожалуйста, смотрите: Запуск Офисных Приложений Программно – Эндрю Уайтчепел[^]