Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выгрузка Excel из процессов - C# / 8 сообщений из 8, страница 1 из 1
16.10.2016, 21:24
    #39327850
player95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
Доброго времени суток всем! Заранее прошу прощения если тема создана не в том разделе.
Итак, есть код, который из 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
17.10.2016, 13:40
    #39328167
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
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
17.10.2016, 14:45
    #39328232
player95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
Порядок не особо важен. Без 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
17.10.2016, 14:52
    #39328239
player95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
player95var, потому что так сделал потом уже не исправлял, переделаю, особого значения не имеет.
Неправильно написал, надо правку сообщений тут разрешить) var тут для того чтобы избежать двойного вызова COM объектов, тоже важно для высвобождения. Подробнее тут:
http://stackoverflow.com/questions/17367411/cannot-close-excel-exe-after-interop-process
...
Рейтинг: 0 / 0
17.10.2016, 15:01
    #39328255
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
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
17.10.2016, 18:09
    #39328476
player95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
Уже проверено что в таком случае не выгружается. У меня так сначала было. Код там практически такой же, сути не меняет)
...
Рейтинг: 0 / 0
17.10.2016, 19:17
    #39328507
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
player95в таком случае не выгружаетсяНу странно. У меня выгружается.
...
Рейтинг: 0 / 0
18.10.2016, 09:42
    #39328707
player95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выгрузка Excel из процессов - C#
И в debug тоже работает? Если да то можете скопировать полный код, видимо я не допонял что то.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Выгрузка Excel из процессов - C# / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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