Ошибка при работе с Excell...
От: Sheridan Россия  
Дата: 01.03.05 08:16
Оценка:
Помогите пожалуйста, уже не знаю что делать...
С помощью экселя(Microsoft.Office.Interop.Excel) создаю отчет. При создании копии шаблона листа
public void AddSheetCopy(int SourceIndex, int PasteAferIndex)
{
    GetSheet(SourceIndex).Copy(Type.Missing, _excelApp.ActiveWorkbook.Sheets[PasteAferIndex]);
}

вылетает ошибка "Ошибка сервера" и все. Причем вылетает при создании 193-194 листа...
Раньше все было ок, сейчас стало глючить... В этот код не лазил... Перегруз машины не помогает...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [silent]
Matrix has you...
Дополнение...
От: Sheridan Россия  
Дата: 01.03.05 08:17
Оценка:
Здравствуйте, Sheridan, Вы писали:
S>
S>public void AddSheetCopy(int SourceIndex, int PasteAferIndex)
S>{
S>    GetSheet(SourceIndex).Copy(Type.Missing, _excelApp.ActiveWorkbook.Sheets[PasteAferIndex]);
S>}
S>

Забыл...
private Worksheet GetSheet(int Index)
{
    return (Worksheet)_excelApp.ActiveWorkbook.Sheets[Index];
}
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [silent]
Matrix has you...
Re: Дополнение...
От: migel  
Дата: 01.03.05 11:31
Оценка:
Здравствуйте, Sheridan, Вы писали:

Ссылочки на временные объекты освобождать не пробывал?
... << RSDN@Home 1.1.4 beta 4 rev. 324>>
Re[2]: Дополнение...
От: Sheridan Россия  
Дата: 01.03.05 11:38
Оценка:
Здравствуйте, migel, Вы писали:

M>Ссылочки на временные объекты освобождать не пробывал?


А сборщик мусора? Или всетаки не так он хорош? В таком случае можно поподробнее?
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — Walk]
Matrix has you...
Re[3]: Дополнение...
От: migel  
Дата: 01.03.05 11:57
Оценка: :))
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, migel, Вы писали:


M>>Ссылочки на временные объекты освобождать не пробывал?


S>А сборщик мусора? Или всетаки не так он хорош? В таком случае можно поподробнее?

Он скорее всего даже и не вызывается
Вообще с COM interop нужно обращаться как написно в инструкции водолаза

Инструкция
1. Спустился под воду берегись акул — встретил ее по мордам ее!
2. Начав работу убедись в отсутствии акул — встретил ее по мордам ее!
3. Закручивая гайку убедись в отсутствии акул — встретил ее по мордам ее!
4...
ну и так далее

... << RSDN@Home 1.1.4 beta 4 rev. 324>>
Re[3]: Дополнение...
От: DuШes  
Дата: 01.03.05 11:58
Оценка: 15 (1)
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, migel, Вы писали:


M>>Ссылочки на временные объекты освобождать не пробывал?


S>А сборщик мусора? Или всетаки не так он хорош? В таком случае можно поподробнее?


В общем случае все объекты, которые ты поюзал в Excel, нужно убивать после использования через System.Runtime.InteropServices.Marshal (range, worksheet, workbook, aplication). GC мало что сделает за тебя по очистке RCW-классов, возможно, ты в процесс работы не очищал занятую помять, вследствии чего и повалились ексепшны...

Вместо GC используй следующую конструкции:

            //    здесь создали ссылку на application
            Excel.ApplicationClass excel = new Excel.ApplicationClass();
            Excel.Workbook  wb = excel.Workbooks.Add(1);
            Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.get_Item(1);

            //    поработали .......
            //    ..................

            //    выгружаем из памяти лист
            if (System.Runtime.InteropServices.Marshal.IsComObject(ws))
            {
                while(    System.Runtime.InteropServices.Marshal.ReleaseComObject(ws)>0){};
                ws = null;
            }

            //    выгружаем из памяти книгу
            //    wb.Close(false,null,null);
            if (System.Runtime.InteropServices.Marshal.IsComObject(wb))
            {
                while(    System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)>0){};
                wb = null;
            }


            //    выгружаем из памяти процесс            
            excel.Quit();
            if (System.Runtime.InteropServices.Marshal.IsComObject(excel))
            {
                while(    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel)>0){};
                excel = null;
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
Re[4]: Дополнение...
От: Sheridan Россия  
Дата: 01.03.05 12:41
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, Sheridan, Вы писали:


S>>Здравствуйте, migel, Вы писали:


M>>>Ссылочки на временные объекты освобождать не пробывал?


S>>А сборщик мусора? Или всетаки не так он хорош? В таком случае можно поподробнее?


DШ>В общем случае все объекты, которые ты поюзал в Excel, нужно убивать после использования через System.Runtime.InteropServices.Marshal (range, worksheet, workbook, aplication). GC мало что сделает за тебя по очистке RCW-классов, возможно, ты в процесс работы не очищал занятую помять, вследствии чего и повалились ексепшны...

Код переделал в
public void AddSheetCopy(int SourceIndex, int PasteAferIndex)
{
    Worksheet sh = GetSheet(SourceIndex);
    Worksheet csh = GetSheet(PasteAferIndex);
    sh.Copy(Type.Missing, csh);
    if (Marshal.IsComObject(sh))    while(Marshal.ReleaseComObject(sh)>0);
    if (Marshal.IsComObject(csh))    while(Marshal.ReleaseComObject(csh)>0);    
}

Потому как пишу собственную упрощенную обертку вокруг интеропа экселя.
Не помогает...
Кстати эксель после ошибки ведет себя более чем странно... На события в документе не реагирует совершенно (выделение, смена листа, итд), хотя главное меню реагирует на телодвижения мышой. И закрыть себя позволяет только через идиты, тоесть через снятие задачи... Что самое обидное — ведь работало же до обеда... А после обеда добавил еще пару строк в вывод и перебилдил.
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — Fucking hostile]
Matrix has you...
Re[5]: Дополнение...
От: DuШes  
Дата: 01.03.05 12:44
Оценка:
Здравствуйте, Sheridan, Вы писали:

[...]
Попробуй обновить Reference на typelib твоей версии Excel, опять таки проконтролируй список процессов, не осталось ли там незавершенных процессов с предыдущими сенсами работы...
Re[6]: Дополнение...
От: Sheridan Россия  
Дата: 01.03.05 12:48
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, Sheridan, Вы писали:


DШ>[...]

DШ>Попробуй обновить Reference на typelib твоей версии Excel
Удалить — заново добавить Microsoft.Office.Interop.Excel reference в проекте? Делал.
DШ>опять таки проконтролируй список процессов, не осталось ли там незавершенных процессов с предыдущими сенсами работы...
Ясное дело, слежу... Больше 3х не оставляю...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — Hollow]
Matrix has you...
Re[7]: Дополнение...
От: DuШes  
Дата: 01.03.05 13:12
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, DuШes, Вы писали:


DШ>>Здравствуйте, Sheridan, Вы писали:


DШ>>[...]

DШ>>Попробуй обновить Reference на typelib твоей версии Excel
S>Удалить — заново добавить Microsoft.Office.Interop.Excel reference в проекте? Делал.
DШ>>опять таки проконтролируй список процессов, не осталось ли там незавершенных процессов с предыдущими сенсами работы...
S>Ясное дело, слежу... Больше 3х не оставляю...

Если есть вожможность, пришли код...сам всегода отчеты в excele лепил, ниразу не сталкивался с такой проблемой...
Re[8]: Дополнение...
От: Sheridan Россия  
Дата: 01.03.05 13:19
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Если есть вожможность, пришли код...сам всегода отчеты в excele лепил, ниразу не сталкивался с такой проблемой...


Аську включи...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — Walk]
Matrix has you...
Re[6]: Дополнение...
От: Sheridan Россия  
Дата: 02.03.05 05:40
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, Sheridan, Вы писали:


DШ>[...]

DШ>Попробуй обновить Reference на typelib твоей версии Excel, опять таки проконтролируй список процессов, не осталось ли там незавершенных процессов с предыдущими сенсами работы...

Дальше больше... Теперь эксель... мммать... просто вылетает гад. Причем в томже месте...
Вот что использую...
public void AddSheetCopy(string SourceCaption, int PasteAferIndex)
{
    Worksheet sh = GetSheet(SourceCaption);
    Worksheet csh = GetSheet(PasteAferIndex);
    sh.Copy(Type.Missing, csh); // Здесь
    FreeCOMObject(sh);
    FreeCOMObject(csh);
}
private Worksheet GetSheet(string Caption)
{
    return (Worksheet)_excelApp.Sheets.get_Item(Caption);
}
private void FreeCOMObject(object O)
{
    if (Marshal.IsComObject(O))    
        while(Marshal.ReleaseComObject(O)>0);
}

Я уже вааабще не знаю куды беч... Помогите пожалуйста.
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — Mounth for war]
Matrix has you...
Re[7]: Дополнение...
От: Sheridan Россия  
Дата: 02.03.05 12:23
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Я уже вааабще не знаю куды беч... Помогите пожалуйста.


Короче я так понял тут настолько крутые программеры, что такие мелочи их не интересуют...
Народ, ну хоть какие идеи, а? Я уже че тока не перепробывал...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — A new level]
Matrix has you...
Re[8]: Дополнение...
От: migel  
Дата: 02.03.05 13:52
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Sheridan, Вы писали:


S>>Я уже вааабще не знаю куды беч... Помогите пожалуйста.


S>Короче я так понял тут настолько крутые программеры, что такие мелочи их не интересуют...

S>Народ, ну хоть какие идеи, а? Я уже че тока не перепробывал...
Тестовый проект прислать могеш?
... << RSDN@Home 1.1.4 beta 4 rev. 324>>
Re[9]: Дополнение...
От: Sheridan Россия  
Дата: 02.03.05 13:56
Оценка:
Здравствуйте, migel, Вы писали:
M>Тестовый проект прислать могеш?
Могу. Куда?
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Pantera -==- — This love]
Matrix has you...
Re[10]: Дополнение...
От: migel  
Дата: 02.03.05 14:23
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, migel, Вы писали:

M>>Тестовый проект прислать могеш?
S>Могу. Куда?
migel(dot)
geo
(dog)
yahoo
(dot)
com
... << RSDN@Home 1.1.4 beta 4 rev. 324>>
Re[8]: Дополнение...
От: Джафар-дракон Россия  
Дата: 02.03.05 17:48
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Sheridan, Вы писали:


S>>Я уже вааабще не знаю куды беч... Помогите пожалуйста.


S>Короче я так понял тут настолько крутые программеры, что такие мелочи их не интересуют...

S>Народ, ну хоть какие идеи, а? Я уже че тока не перепробывал...
Ну прям не знаю %))
Если дело действительно в том, что ссылки на объекты Excel не были освобождены, то только вызов ReleaseComObject не сильно поможет. Дело в том, что сборщик мусора убирает мусор не сразу!!! Может помочь явный вызов "уборки": CG.Collect(). Если поможет — отпиши — самому интересно, можно сказать, что хобби у меня такое — собирать глюки Excel %))
Не судите строго и не кидайтесь тапками, после многих лет работы с виндоус и нескольких лет работы с .NET пришлось перейти к linux и вернуться к забытым с/с++.
Re[9]: Дополнение...
От: Sheridan Россия  
Дата: 03.03.05 05:32
Оценка:
Здравствуйте, Джафар-дракон, Вы писали:

ДД>Ну прям не знаю %))

ДД>Если дело действительно в том, что ссылки на объекты Excel не были освобождены, то только вызов ReleaseComObject не сильно поможет. Дело в том, что сборщик мусора убирает мусор не сразу!!! Может помочь явный вызов "уборки": CG.Collect().
Не помогает...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Craig Armstrong — Himn 2]
Matrix has you...
Re[11]: Дополнение...
От: Sheridan Россия  
Дата: 03.03.05 05:50
Оценка:
Ушло...
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Craig Armstrong — Sea song]
Matrix has you...
Re[8]: Дополнение...
От: Andrbig  
Дата: 03.03.05 08:34
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, Sheridan, Вы писали:


S>>Я уже вааабще не знаю куды беч... Помогите пожалуйста.


S>Короче я так понял тут настолько крутые программеры, что такие мелочи их не интересуют...

S>Народ, ну хоть какие идеи, а? Я уже че тока не перепробывал...

Посмотри http://www.rsdn.ru/Forum/Message.aspx?mid=1004160&amp;only=1
Автор: Andrbig
Дата: 26.01.05
. Если этот код заработает, используй его как отправную точку. У меня он работает превосходно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.