Процесс excel не завершается

Необходимо освобождать все используемые COM-объекты с помощью Marshal.ReleaseComObject.

Кроме того, есть такое правило:

Никогда не используйте две точки с объектами COM.

Когда вы пишете:

excel.Workbooks.Open( "1.xlsx");

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

Кроме того, желательно предусмотреть гарантированное освобождение даже в случае исключений.
Финальный код может выглядеть примерно так:

Workbooks workbooks = null;
Workbook workbook = null;

try
{
    workbooks = excel.Workbooks;
    workbook = workbooks.Open( "1.xlsx");
}
finally
{
    Marshal.ReleaseComObject(workbook);
    Marshal.ReleaseComObject(workbooks);
}

Так нужно поступить со всеми используемыми COM-объектами.

Ваш код работы с Excel должен располагаться в блоке try, код закрытия и освобождения всех используемых ресурсов — в блоке finally.

 

Djinn

Пользователь

Сообщений: 69
Регистрация: 30.05.2016

#1

07.02.2019 18:10:01

Добрый вечер всем. Какие могут быть причины? Человек сказал, что офис переустанавливал, не помогло. Процесс не завершается при выходе из любой книги — обычной, с макросами, надстройки. Приходится заходить в диспетчер и убивать процесс, чтобы открыть ранее открытие книги, иначе пишет только для чтения.

office 16 x-64 на win 7 x-64

Изменено: Djinn07.02.2019 18:10:52

   lim9

25.07.16 — 10:54

Попытка

    Эксель = Новый COMОбъект(«Excel.Application»);

    ПолноеИмяФайла=»D:test.xls»;

    Книга = Эксель.WorkBooks.Open(ПолноеИмяФайла); // Ошибка здесь !

    Лист = Книга.ActiveSheet();

    RangeAll = Лист.UsedRange;

    ЧислоКолонок = RangeAll.Columns.Count;

    ЧислоСтрок = RangeAll.Rows.Count;    

    Для с = ПерваяСтрока По ПоследняяСтрока Цикл

        Код = Лист.Cells(с, 1).Value;

    КонецЦикла;

    //закроем Эксель

    //Эксель.ActiveWorkbook.Save();

    Эксель.WorkBooks.close();

    Эксель.Application.Quit();

    Эксель.Quit();

    Лист = неопределено;                    

    Книга = неопределено;

    Эксель = неопределено;

Исключение

    Сообщить(ОписаниеОшибки());    

КонецПопытки;

Права все есть. Делаю на домашнем компе. Вручную файл открывается без проблем.

   Timon1405

1 — 25.07.16 — 10:57

текст ошибки предлагается угадать?

   Fedor-1971

2 — 25.07.16 — 10:58

(0) Эксель.WorkBooks.close(0); — закрыть без дурацких вопросов

   Gary417

3 — 25.07.16 — 10:59

(0) в исключении надо дополнительно сделать

Эксель.Application.Quit();

Эксель.Quit();

иначе при возникновении ошибок загрузки логично что эксель  останется висеть

   lim9

4 — 25.07.16 — 11:00

(1) — а самом деле ошибки нет, это старый комент

   lim9

5 — 25.07.16 — 11:00

(2) (3) — так выполняется без ошибки!

А остается висеть все равно

   lim9

6 — 25.07.16 — 11:01

Попытка

    Эксель = Новый COMОбъект(«Excel.Application»);

    ПолноеИмяФайла=»D:test.xls»;

    Книга = Эксель.WorkBooks.Open(ПолноеИмяФайла);

    Лист = Книга.ActiveSheet();

    RangeAll = Лист.UsedRange;

    ЧислоКолонок = RangeAll.Columns.Count;

    ЧислоСтрок = RangeAll.Rows.Count;    

    Для с = ПерваяСтрока По ПоследняяСтрока Цикл

        Код = Лист.Cells(с, 1).Value;

    КонецЦикла;

    //закроем Эксель

    //Эксель.ActiveWorkbook.Save();

    Эксель.WorkBooks.close();

    Эксель.Application.Quit();

    Эксель.Quit();

    Лист = неопределено;                    

    Книга = неопределено;

    Эксель = неопределено;

Исключение

    Сообщить(ОписаниеОшибки());    

    //закроем Эксель

    //Эксель.ActiveWorkbook.Save();

    Эксель.WorkBooks.close();

    Эксель.Application.Quit();

    Эксель.Quit();

    Лист = неопределено;                    

    Книга = неопределено;

    Эксель = неопределено;

КонецПопытки;

то же самое — остается висеть

   vde69

7 — 25.07.16 — 11:02

http://catalog.mista.ru/public/57401/

Процедура EXCEL_РазорватьСвязь (Соответстие) Экспорт

    Попытка

        Соответстие[«EXCEL»].DisplayAlerts = 0;

        Соответстие[«ExcelФайл»].Close();

        Соответстие[«EXCEL»].DisplayAlerts = 1;

        Соответстие[«EXCEL»].Quit();

        Соответстие[«EXCEL»] = Неопределено;

    Исключение

        #Если Клиент Тогда

            Сообщить(ОписаниеОшибки());

        #КонецЕсли

    КонецПопытки;                  

КонецПроцедуры

   Fedor-1971

8 — 25.07.16 — 11:06

(6) блин, ты читать умеешь?

   Эксель.WorkBooks.close(); — где 0 в параметре как в (2)? В интерактивном режиме он тебя спрашивает «Точно хочешь закрыть?» (дальше много нецензурных слов)

    Эксель.Application.Quit(); — вот этим ты ему порвал шаблон, у тебя Эксель уже Application

    Эксель.Quit(); — ну а тут правильно закрыл

И перед экспериментами поснимай все задачи Экселя, для чистоты системы.

   lim9

9 — 25.07.16 — 11:14

Попытка

    Эксель = Новый COMОбъект(«Excel.Application»);

    ПолноеИмяФайла=»D:test.xls»;

    Книга = Эксель.WorkBooks.Open(ПолноеИмяФайла);

    Лист = Книга.ActiveSheet();

    RangeAll = Лист.UsedRange;

    ЧислоКолонок = RangeAll.Columns.Count;

    ЧислоСтрок = RangeAll.Rows.Count;    

    Для с = ПерваяСтрока По ПоследняяСтрока Цикл

        Код = Лист.Cells(с, 1).Value;

    КонецЦикла;

    //закроем Эксель

    //Эксель.ActiveWorkbook.Save();

    Эксель.DisplayAlerts = 0;

    Книга.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.DisplayAlerts = 0;

    Эксель.WorkBooks.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.Application.Quit();

    Эксель.Quit();

    Лист = неопределено;                    

    Книга = неопределено;

    Эксель = неопределено;

Исключение

    Сообщить(ОписаниеОшибки());    

    //закроем Эксель

    //Эксель.ActiveWorkbook.Save();

    Эксель.DisplayAlerts = 0;

    Книга.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.DisplayAlerts = 0;

    Эксель.WorkBooks.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.Application.Quit();

    Эксель.Quit();

    Лист = неопределено;                    

    Книга = неопределено;

    Эксель = неопределено;

КонецПопытки;

— НЕ ПОМОГЛО.

Все процессы предварительно закончил

   vde69

10 — 25.07.16 — 11:18

пробуй так:

Попытка

    Эксель = Новый COMОбъект(«Excel.Application»);

    ПолноеИмяФайла=»D:test.xls»;

    Книга = Эксель.WorkBooks.Open(ПолноеИмяФайла);

    Лист = Книга.ActiveSheet();

    RangeAll = Лист.UsedRange;

    ЧислоКолонок = RangeAll.Columns.Count;

    ЧислоСтрок = RangeAll.Rows.Count;    

    Для с = ПерваяСтрока По ПоследняяСтрока Цикл

        Код = Лист.Cells(с, 1).Value;

    КонецЦикла;

    Лист = неопределено;                    

    Эксель.DisplayAlerts = 0;

    Книга.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.Quit();

    Эксель = неопределено;

Исключение

    Сообщить(ОписаниеОшибки());    

КонецПопытки;

   Fedor-1971

11 — 25.07.16 — 11:19

(9) да уж, вот это:

    Эксель.DisplayAlerts = 0;

    Книга.close(0); — закрыл книгу

    Эксель.DisplayAlerts = 1;

    Эксель.DisplayAlerts = 0;

    Эксель.WorkBooks.close(0); — опять закрыл книгу

    Эксель.DisplayAlerts = 1;

    Эксель.Application.Quit(); — порвал шаблон Экселю

    Эксель.Quit(); — попытался закрыть оный

просто 5. Слов нет, буквы пока ещё есть.

Вот тебе счасце:

    Книга.close(0);

    Эксель.Quit();

Когда копипастишь код, хотя бы удосужься его понять.

   vde69

12 — 25.07.16 — 11:20

(10) +

и перед пробой посмотри в процессах ексель, он может висеть без видимых форм — тогда прибей все процессы екселя перед пробой

   vde69

13 — 25.07.16 — 11:21

(11) у него не закрывался так как «Лист» это COM который нужно убить раньше всего….

   lim9

14 — 25.07.16 — 11:21

(11) — а так сделал потому как уже блин задолбался

(12) — все убил! написал в (9)

   vde69

15 — 25.07.16 — 11:22

и еще занули «RangeAll» перед листом !!!!!!

   vde69

16 — 25.07.16 — 11:24

Попытка

    Эксель = Новый COMОбъект(«Excel.Application»);

    ПолноеИмяФайла=»D:test.xls»;

    Книга = Эксель.WorkBooks.Open(ПолноеИмяФайла);

    Лист = Книга.ActiveSheet();

    RangeAll = Лист.UsedRange;

    ЧислоКолонок = RangeAll.Columns.Count;

    ЧислоСтрок = RangeAll.Rows.Count;    

    Для с = ПерваяСтрока По ПоследняяСтрока Цикл

        Код = Лист.Cells(с, 1).Value;

    КонецЦикла;

    // порядок прибития переменных хранящих COM важен !!!

    RangeAll = неопределено;

    Лист = неопределено;                    

    Эксель.DisplayAlerts = 0;

    Книга.close(0);

    Эксель.DisplayAlerts = 1;

    Эксель.Quit();

    Эксель = неопределено;

Исключение

    Сообщить(ОписаниеОшибки());    

КонецПопытки;

   lim9

17 — 25.07.16 — 11:24

Сделал как в (11) :

Книга.close(0);

Эксель.Quit();

— не помогло!

(10) — тоже делал — ничего не изменилось.

   Fedor-1971

18 — 25.07.16 — 11:28

(17) перезагрузи комп

(13) обычно, достаточно закрыть книгу, Лист — это просто переменная, СОМ — Эксель, при открытой книге не завершается.

  

lim9

19 — 25.07.16 — 11:32

помогла перезагрузка! Всем спасибо!

….. блиин такая тупость ваще

Manual memory management like this just never works. This is a problem that’s been known for very a long time and the core reason that garbage collectors were invented. Programmers just forever forget to release memory.

It gets extra hard when you can’t see the memory being used. Which is certainly the case in your code, the xlWorkSheet.Cells(i + 1, j + 1) expression uses no less than three references. One for the range object returned by the Cells property, one for a sub-range object selected by i+1 and another for the sub-range object selected by j+1. Very nice syntax sugar provided by the VB.NET language, writing COM code without it is pretty doggone painful. But not helpful to let you see the references. Not only can’t you see it in your source code, there is absolutely nothing the debugger can do to help you see them either.

This is very much a solved problem in .NET, it has a garbage collector and it can see everything. The most basic problem is that you don’t give it a chance to solve your problem. The mistake you made is that you stopped. Probably by setting a breakpoint on the last statement and then looking in Task Manager and seeing Excel.exe still running. Yes, that’s normal. Garbage collection is not instant.

Calling GC.Collect() is supposed to make it instant, but that doesn’t work in the specific case of running the Debug build of your project. The lifetime of local variables gets then extended to the end of the method, help you see them in the Autos/Locals/Watch window. In other words, GC.Collect() doesn’t actually collect any of the interface references. More about that behavior in this post.

The simple workaround is to not stop. Keep doing useful things to give the garbage collector a reason to run. Or letting your program terminate since it is done, Excel terminates when the finalizer thread runs for the last time. Which works because the local variables that had the references are not in scope anymore.

But everybody wants the instant fix anyway. You get it by deleting all the releaseObject() calls. And doing it like this instead:

converToExcel(path, dset)
GC.Collect()
GC.WaitForPendingFinalizers()

Or in other words, force a collection after the method has returned. The local variables are no longer in scope so they can’t hold on to an Excel reference. It will now also work when you debug it, like it already did when you ran the Release build without a debugger.

0 / 0 / 0

Регистрация: 21.07.2016

Сообщений: 119

1

15.04.2017, 19:01. Показов 9329. Ответов 4


Студворк — интернет-сервис помощи студентам

В течении для файл Excel получает с сайта информацию. Бывает момент когда сайт на несколько секунд становится недоступен. Вот тогда Ехсел полностью зависает и уже обратно не отвисает. Приходиться каждый раз завeршать процесс Excel через диспетчер задач (Ctrl + Alt + Del).
Вопрос: можно ли создать файл (.еxe или др формат) чтобы при выполнении его он автоматически завершал процесс EXCEL.



0



Joey

Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

16.04.2017, 13:13

2

Лучший ответ Сообщение было отмечено tankwar121 как решение

Решение

tankwar121, откройте блокнот и в нем напишите

Windows Batch file
1
taskkill /f /im excel.exe

Сохраните его с расширением «.bat», например «killexcel.bat». Запуск этого файла закроет все открытые экземпляры Excel



1



0 / 0 / 0

Регистрация: 21.07.2016

Сообщений: 119

16.04.2017, 14:05

 [ТС]

3

Joey, не закрывает. На доли секунд выскакивает CMD… по фото ниже видно
На компе установлена Windows 7, Excel 2016.

Миниатюры

Завершить процесс зависшего Excel
 



0



Джоуи

1073 / 635 / 240

Регистрация: 05.05.2015

Сообщений: 3,546

Записей в блоге: 2

16.04.2017, 14:09

4

tankwar121, Вы неточно переписали, Вы написали taskkill f im без слешей, а надо /f /im



0



0 / 0 / 0

Регистрация: 21.07.2016

Сообщений: 119

16.04.2017, 14:13

 [ТС]

5

Joey, Допустил ошибку. Все норм Закрывает! СПАСИБО!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

16.04.2017, 14:13

5

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

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

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии