автоматизация c # и excel - завершение работающего экземпляра - PullRequest
0 голосов
/ 01 декабря 2009

У меня такая же проблема. Я прочитал всю ветку и попробовал приведенные примеры. Я добавил эти строки в пример кода:

xlRange = (Excel.Range)xlWorkSheet.get_Range("B1", "C1");
xlRange.Merge(Type.Missing);
xlRange = (Excel.Range)xlWorkSheet.get_Range("H5", "M5"); 
xlRange.Merge(Type.Missing);
xlRange = (Excel.Range)xlWorkSheet.get_Range("N5", "V5");
xlRange.Merge(Type.Missing);
xlRange = (Excel.Range)xlWorkSheet.get_Range("W5", "Z5");
xlRange.Merge(Type.Missing);   // up to here everything seems fine

///////////////////////////////////////////////////////////
// if I add these lines below, the process just hanged until
// I manually close the form
xlRange = (Excel.Range)xlWorkSheet.get_Range("AA5", "AB5"); 
xlRange.Merge(Type.Missing); 
xlBorder.Borders.Weight = Excel.XlBorderWeight.xlThin;
///////////////////////////////////////////////////////////

Я также добавил это перед выпуском объекта Excelsheet: Marshal.ReleaseComObject (xlRange);

Пожалуйста, скажите мне, как мне поступить, потому что я почти сдаюсь. Ваш ответ очень ценится. К вашему сведению, я новичок и с нетерпением жду вашего ответа.

Спасибо, джордж

Ответы [ 3 ]

1 голос
/ 01 декабря 2009

Я использую это:

private void DoSomeStuff()
{
    var application = new Microsoft.Office.Interop.Excel.Application();
    // Do stuff ...
    CloseExcel(application);
}

private static void CloseExcel(Microsoft.Office.Interop.Excel.Application excel)
{
    while (Marshal.ReleaseComObject(excel) != 0) { }

    excel = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

Работает как шарм:)

1 голос
/ 01 декабря 2009

Я нашел этот метод наиболее полезным:

Как правильно очистить объекты взаимодействия Excel в c #

Имейте в виду, что вам нужно будет настроить код для вашей конкретной ситуации. то есть, если вы создаете и храните ссылку на приложение, рабочую книгу и три объекта диапазона, вам необходимо:

  1. Call GC.Collect ()
  2. Вызов GC.WaitForPendingFinalizers ()
  3. Вызвать Marshal.FinalReleaseComObject для каждого из объектов диапазона
  4. Закрыть () рабочую книгу
  5. Вызовите Marshal.FinalReleaseComObject для объекта книги
  6. Закрыть экземпляр приложения
  7. Вызовите Marshal.FinalReleaseComObject для объекта приложения

если у вас есть семь объектов диапазона или есть ссылки на любые другие объекты, то вам также потребуется вызывать Marshal.FinalReleaseComObject для каждого из них. порядок, в котором вы отпускаете все, также очень важен.

1 голос
/ 01 декабря 2009

Excel является сервером автоматизации COM.

Несмотря на то, что вы вызываете Application.Quit () и освобождаете ссылку на COM-объект, сам исполняемый файл не заканчивается. Вы все еще сможете увидеть это в диспетчере задач. Для дальнейших вызовов в Excel будет использоваться работающий экземпляр.

Экземпляр Excel закроется после закрытия приложения.

Когда-нибудь возникали ошибки типа «RPC-сервер не найден / не работает»? Теперь вы знаете, почему.

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