выход из Excel с C # (при использовании автоматизации Excel) - PullRequest
1 голос
/ 18 марта 2011

Я использую c # для чтения / записи данных в таблицу Excel.

Я использую эти три оператора, чтобы открыть мой файл Excel

 Excel.Application excelapp = new Excel.Application();
 Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;
 Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet;

И эти две строкизакрыть / сохранить лист.

  workbook.Save();
  workbook.Close();

У меня проблема в том, что процесс EXCEL все еще активен.(Я использовал диспетчер задач для проверки.) И после чтения / записи данных на рабочий лист у меня как 20 активных процессов EXCEL.

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

Большое спасибо, Аарон.

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

Просто позвоните

excelapp.Quit();

после всей работы с Excel.

Если процессы все еще выполняются, попробуйте использовать Marshal.ReleaseComObject на всех объектах Excel и форсировать немедленную сборку мусора:

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp);
excelapp = null;
GC.Collect();
GC.WaitForPendingFinalizers();

Обратите внимание, что вам нужно использовать ReleaseComObject не только с вашим excelapp объектом, но также с каждой рабочей книгой и рабочим листом, которые вы использовали.

4 голосов
/ 19 марта 2011

Archer находится на правильном пути с ReleaseComObject, но если вам нужно возиться с сборкой мусора, то вы допустили ошибку в своем коде автоматизации.

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

Например, если вы делаете что-то вроде:

Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1;

Тогда вы создадите ссылки на рабочую книгу., Sheet и Range (и, может быть, и коллекцию Sheets тоже?), ни один из которых вы не можете выпустить должным образом.

Таким образом, вместо этого вы должны разбить его на этапы с чем-то вроде этого (записанным полностью из памяти ис точки зрения позднего связывания, и я мог упустить что-то еще, что вам нужно выпустить):

object wb = Workbooks("Book1");
object sheet = wb.Sheets("Sheet1");
object range = sheet.Range("A1:A2");
range.Value = 1;

Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(wb);

В обычных условиях вам не нужно останавливать процесс или принудительно собирать мусор, и толькоя могу вспомнить, когда мне приходилось делать это, когда в моем коде были ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...