powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выгрузка Excel из процессов - C#
8 сообщений из 8, страница 1 из 1
Выгрузка Excel из процессов - C#
    #39327850
player95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем! Заранее прошу прощения если тема создана не в том разделе.
Итак, есть код, который из Excel передает все данные на форму в dataGridView1. Естественно после работы с Эксель нужно выгрузить все его барахло для того чтобы он не висел в процессах.
Весь код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
private void button3_Click(object sender, EventArgs e)
        {
            test();
           
        }
        public void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }
        public void test()
        {
            dsTest dSet = new dsTest();
            Excel.Application ExcelApp = new Excel.Application();
            Excel.Worksheet ExcelWorkSheet;
            Excel.Workbook ExcelWorkBook;
            Excel.Range ExcelRange;
 
            var workbooks = ExcelApp.Workbooks;
            ExcelWorkBook = workbooks.Open(@"D:\\Эксель.xlsm", 0, false);
            ExcelWorkSheet = ExcelWorkBook.ActiveSheet;
            ExcelRange = ExcelWorkSheet.UsedRange;
 
            for (int Rnum = 2; Rnum <= ExcelRange.Rows.Count - 2; Rnum++)
            {
                DataRow dr = dSet.DataTable1.NewRow();
                for (int Cnum = 1; Cnum <= ExcelRange.Columns.Count; Cnum++)
                {
                    if ((ExcelRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                    {
                        dr[Cnum - 1] =
            (ExcelRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                    }
                }
                dSet.DataTable1.Rows.Add(dr);
                dSet.DataTable1.AcceptChanges();
            }
 
            dataGridView1.DataSource = dSet.DataTable1;
            dataGridView1.Visible = true;
            ExcelWorkBook.Close(true, null, null);
            ExcelApp.Quit();
            releaseObject(ExcelApp);
            releaseObject(workbooks);
            releaseObject(ExcelWorkBook);
            releaseObject(ExcelWorkSheet);
            releaseObject(ExcelRange);
        }


Проблема заключается вот в этой строке:
Код: c#
1.
ExcelWorkBook = workbooks.Open(@"D:\\Эксель.xlsm", 0, false);



Понадобилось путь к файлу засунуть в отдельную переменную. Записал:

Код: c#
1.
string fullPath = "D:\\Эксель.xlsm";



И после того как я вместо пути прописываю fullpath у меня Excel остается висеть в процессах. Если вернуть все как было, то есть путь напрямую, то все корректно работает. В чем тут может быть проблема?
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328167
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
player95,

уверены, что в правильном порядке выгружаете:
Код: c#
1.
2.
3.
4.
5.
releaseObject(ExcelApp);
releaseObject(workbooks);
releaseObject(ExcelWorkBook);
releaseObject(ExcelWorkSheet);
releaseObject(ExcelRange);


может надо наоборот? Сначала выгрузить объекты низшего уровня иерархии, а потом объект приложения?

P.S. @"D:\\Эксель.xlsm" - что-то мне кажется, что здесь лишний слеш. Если есть собака перед путем - слеши задваивать не надо. Или ошибаюсь?
И почему
Код: vbnet
1.
var workbooks


? Почему не Excel.Workbooks?
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328232
player95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Порядок не особо важен. Без 2 палочек была ошибка у меня. Может собачка и лишняя) var, потому что так сделал потом уже не исправлял, переделаю, особого значения не имеет. В общем, решение найдено. Проблема заключалась в том что я запускал все это дело в Debug. Из за этого ссылки не освобождались. Нужно было делать это в релизе. Подробнее тут:
http://stackoverflow.com/questions/3937181/when-to-use-releasecomobject-vs-finalreleasecomobject
http://stackoverflow.com/questions/15728676/proper-way-of-releasing-com-objects/38111137#38111137
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328239
player95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
player95var, потому что так сделал потом уже не исправлял, переделаю, особого значения не имеет.
Неправильно написал, надо правку сообщений тут разрешить) var тут для того чтобы избежать двойного вызова COM объектов, тоже важно для высвобождения. Подробнее тут:
http://stackoverflow.com/questions/17367411/cannot-close-excel-exe-after-interop-process
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328255
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
player95,

не понял в чем суть. Там код другой. Через Interop Вы получаете доступ к модели - ничего еще не создается. Вы создаете экземпляр этой строкой:
Код: c#
1.
Excel.Application ExcelApp = new Excel.Application();


главное при этом, чтобы в объявлениях Using было другое имя, не ExcelApp.
И что по мне, то как раз var может провоцировать создание доп.ссылок, т.к. это динамический тип. Что если так попробовать?
Код: c#
1.
ExcelWorkBook = ExcelApp.Workbooks.Open(@"D:\\Эксель.xlsm", 0, false);


без
Код: plaintext
var workbooks = ExcelApp.Workbooks;
?
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328476
player95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже проверено что в таком случае не выгружается. У меня так сначала было. Код там практически такой же, сути не меняет)
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328507
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
player95в таком случае не выгружаетсяНу странно. У меня выгружается.
...
Рейтинг: 0 / 0
Выгрузка Excel из процессов - C#
    #39328707
player95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И в debug тоже работает? Если да то можете скопировать полный код, видимо я не допонял что то.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выгрузка Excel из процессов - C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]