Как полностью прекратить EXCEL.exe от запуска задач в office.interop? - PullRequest
0 голосов
/ 07 января 2020

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

private Excel.Application excelapp;
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
dynamic ExcelInst = Activator.CreateInstance(ExcelType);
this.excelapp = ExcelInst;

this.workbook = this.excelapp.Workbooks.Open(Filename : this.filePath, ReadOnly: true);

Я использовал все методы для закрытия / выхода / удаления открытого процесса (кроме Process.Kill), но они не будут работать. Как полностью прекратить выполнение любых фоновых задач?

Ответы [ 4 ]

0 голосов
/ 08 января 2020

Насколько я понимаю, поскольку взаимодействие использует объекты «COM», вам необходимо «освободить» эти объекты. Что-то вроде…

Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(xlApp);

в таком порядке. Это должно освободить эти объекты от фоновых задач

У меня был успех со следующим подходом при использовании office-interop… Настройте все взаимодействия Excel / Word / Outlook. Et c.… Interop в выражении try/catch/finally. Это должно почти гарантировать, что ваш код будет корректно закрывать и «освобождать» ресурсы, которые он использует, даже если есть исключение. В противном случае код всегда будет подвержен утечке ресурса.

Word.Application app = null;
Word.Document doc = null;
try {
  app = new Word.Application();
  //app.Visible = true;
  doc = app.Documents.Add();
  // do some stuff with the document…
  doc.SaveAs2(filename);
  MessageBox.Show("Document created successfully !");
}
catch (Exception e) {
  MessageBox.Show("ERROR: " + e.Message);
}
finally {
  if (doc != null) {
    doc.Close();
    Marshal.ReleaseComObject(doc);
  }
  if (app != null) {
    app.Quit();
    Marshal.ReleaseComObject(app);
  }
}
0 голосов
/ 07 января 2020

Если вы хотите быть уверены, что процесс EXCEL.EXE уйдет go, есть один способ реализовать это. Может быть, это не элегантное решение, но, по крайней мере, оно работает . Основная идея - поймать дескриптор окна Excel. Имея этот дескриптор, вы можете получить его процесс и закрыть его.

ВНИМАНИЕ: Если вы не сделаете окно Excel видимым, этот метод НЕ БУДЕТ работать!

using System.Diagnostics;
using Excel = Microsoft.Office.Interop.Excel;

void Kill_Excel()
{
    // Create instance of Excel application.
    // If you don't make Excel window visible, this method WILL NOT work!
    Excel.Application excel = new Excel.Application { Visible = true };

    // Catch Excel window handle
    IntPtr hwnd = new IntPtr(excel.Hwnd);
    // Get EXCEL.EXE process
    Process xlproc = Process.GetProcesses().Where(p => p.MainWindowHandle == hwnd).First();

    // Do some operations
    Excel.Workbook book = excel.Workbooks.Add();
    Excel.Worksheet sheet = book.Sheets[1] as Excel.Worksheet;
    sheet.Cells[1, 1] = "Hello!";

    // Close Excel
    book.Close(SaveChanges: false);
    excel.Quit();

    // Garbage collection
    GC.Collect();
    GC.WaitForFullGCComplete();

    // Kill process - FOR SURE! :)
    xlproc.Kill();
}
0 голосов
/ 07 января 2020

Вам просто нужно вызвать метод Quit класса Excel Application, когда вы закончите:

private Excel.Application excelapp;
Type ExcelType = Type.GetTypeFromProgID("Excel.Application");
dynamic ExcelInst = Activator.CreateInstance(ExcelType);
this.excelapp = ExcelInst;

this.workbook = this.excelapp.Workbooks.Open(Filename : this.filePath, ReadOnly: true);

' do whatever you need there

this.workbook.Save();

this.excelapp.Quit();

Если при использовании этого метода открыты несохраненные книги, Excel отображает диалоговое окно с вопросом, хотите ли вы сохранить изменения. Вы можете предотвратить это, сохранив все книги перед использованием метода Quit или установив для свойства DisplayAlerts значение False. Когда это свойство равно False, Excel не отображает диалоговое окно при выходе из несохраненных книг; он завершает работу без их сохранения.

Если вы установили свойство Saved для рабочей книги на True без сохранения рабочей книги на диск, Excel завершит работу, не попросив сохранить рабочую книгу. Примечание: это не сохраняет рабочую книгу; это просто выглядит так, как будто оно сохранено.

0 голосов
/ 07 января 2020

Я использую следующее, чтобы открыть Excel и прочитать / обновить его.

Excel.Application app;
Excel.Workbook wb;
private void openAndRead()
{

 app = new Excel.Application();
 wb = app.Workbooks.Open(YourFileHere);

//do stuff here read or write
//app.ActiveSheet.Cells[1, "A"] = "write this in cell A1";
//string read= app.ActiveSheet.Cells[1, "A"]; 

}

private void closeExcel ()
{
 app.DisplayAlerts = false; //this will stop popup questions from excel
 wb.Close();
 app.Quit();
}
...