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();
Ошибка при работе с 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[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
. Если этот код заработает, используй его как отправную точку. У меня он работает превосходно.
Re[9]: Дополнение...
От: Sheridan Россия  
Дата: 03.03.05 08:48
Оценка:
Здравствуйте, Andrbig, Вы писали:

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


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


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


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

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

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

Делал я релизкомобжект, пофигу...
У меня чуть по другому, я сейчас решил попробовать наоборот, кешировать это дело...
Вот например Worksheets.cs
using System;
using Microsoft.Office.Interop.Excel;

namespace Bng.Office.SimpleOffice
{
    /// <summary>
    /// Summary description for WorkSheets.
    /// </summary>
    public class WorkSheets : WorkItems
    {
        private ApplicationClass _excelApp;
        public WorkSheets(ApplicationClass ExcelApp)
        {
            _excelApp = ExcelApp;
        }

        public void Add(Worksheet Sheet)
        {
            Add(Sheet,Sheet.Index,Sheet.Name);
        }

        new public Worksheet this[int Index]
        {
            get 
            {
                if (Exists(Index))
                    return (Worksheet)base[Index];
                else
                {
                    Worksheet sh = (Worksheet)_excelApp.Sheets.get_Item(Index);
                    Add(sh);
                    return sh;
                }
            }
        }

        public void CreateCopy(int SourceIndex, int DestinationIndex, bool PasteAfter)
        {
            if (PasteAfter)
                this[SourceIndex].Copy(Type.Missing, this[DestinationIndex]); // Вылетает здесь
            else
                this[SourceIndex].Copy(this[DestinationIndex], Type.Missing);
            MoveIndexes(DestinationIndex,1);
        }

        public string GetName(int Index)
        {
            return this[Index].Name;
        }

        public void SetName(int Index, string NewName)
        {
            this[Index].Name = NewName;
            SetCaption(Index,NewName);
        }

        new public Worksheet this[string Caption]
        {
            get 
            {
                if (Exists(Caption))
                    return (Worksheet)base[Caption];
                else
                {
                    Worksheet sh = (Worksheet)_excelApp.Sheets.get_Item(Caption);
                    Add(sh);
                    return sh;
                }
            }
        }
    }
}

... и один фиг не помогает, хотя теперь работает перед вылетом раза в 3 быстрее
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [Craig Armstrong — Inhaler]
Matrix has you...
Re[10]: Дополнение...
От: Andrbig  
Дата: 03.03.05 12:15
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Делал я релизкомобжект, пофигу...

S>У меня чуть по другому, я сейчас решил попробовать наоборот, кешировать это дело...

Вот пример, который копирует и потом удаляет лист 200 раз подряд (тебе вроде как это было нужно). У меня это все работает (примечательно, что без GC.Collect() ).
using System;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelTest
{
    public class Copy
    {
        public static void Run()
        {
            Excel.ApplicationClass excel = new Excel.ApplicationClass();
            excel.Visible = true;

            // вытащить wb 
            Excel.Workbooks books = excel.Workbooks;
            Excel.Workbook wb = books.Add (Type.Missing);
            System.Runtime.InteropServices.Marshal.ReleaseComObject (books);

            // вытащить ws1 и ws2 
            Excel.Sheets sheets = wb.Worksheets;
            Excel.Worksheet ws1 = (Excel.Worksheet)sheets.get_Item(1);
            Excel.Worksheet ws2 = (Excel.Worksheet)sheets.get_Item(2);
            System.Runtime.InteropServices.Marshal.ReleaseComObject (sheets);

            // копирование и удаление 200 раз
            for (int i = 0; i < 200; i++)
            {
                ws1.Copy (Type.Missing, ws2);
                Excel.Worksheet w = (Excel.Worksheet) ws2.Next;
                w.Delete();
                System.Runtime.InteropServices.Marshal.ReleaseComObject (w);
            }

            System.Runtime.InteropServices.Marshal.ReleaseComObject (ws2);
            System.Runtime.InteropServices.Marshal.ReleaseComObject (ws1);

            wb.Close (false, null, null);
            System.Runtime.InteropServices.Marshal.ReleaseComObject (wb);

            excel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject (excel);

//            GC.Collect();
//            GC.WaitForPendingFinalizers();
        }
    }
}

Если это не то что тебе нужно, тогда сформулируй точнее задачу в части, касающейся Excel. У меня он работает просто как часы!
Re[11]: Дополнение...
От: Sheridan Россия  
Дата: 03.03.05 12:22
Оценка:
Здравствуйте, Andrbig, Вы писали:
A>Вот пример, который копирует и потом удаляет лист 200 раз подряд (тебе вроде как это было нужно). У меня это все работает (примечательно, что без GC.Collect() ).
A>Если это не то что тебе нужно, тогда сформулируй точнее задачу в части, касающейся Excel. У меня он работает просто как часы!
Мне нужно скопировать лист гдето более 350 раз. Удалять не нужно... Если хочеш я тебе зашлю исходники.
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [silent]
Matrix has you...
Re[12]: Дополнение...
От: Andrbig  
Дата: 03.03.05 12:49
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Мне нужно скопировать лист гдето более 350 раз. Удалять не нужно... Если хочеш я тебе зашлю исходники.


Тебе надо создать книгу Excel с 350 листами? Думаю, этого он не понятнет. Лично у меня Excel рухнул на 336 странице.
Re[13]: Дополнение...
От: Sheridan Россия  
Дата: 03.03.05 13:35
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Тебе надо создать книгу Excel с 350 листами? Думаю, этого он не понятнет. Лично у меня Excel рухнул на 336 странице.


Млин, да ведь делал же! От он гад!
-=RSDN@Home 1.1.4 beta 4 rev. 347=- [silent]
Matrix has you...
Re[14]: Дополнение...
От: Andrbig  
Дата: 03.03.05 15:30
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Млин, да ведь делал же! От он гад!


Боюсь что тут нет решения. Даже если открыть .xls с 335 страницами и добавить одну (т.е. 336-ю), то все падает. Кстати, из самого Excel добавляется без проблем! Спасибо M$...
Re[15]: Дополнение...
От: migel  
Дата: 04.03.05 08:26
Оценка:
Здравствуйте, Andrbig, Вы писали:

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


S>>Млин, да ведь делал же! От он гад!


A>Боюсь что тут нет решения. Даже если открыть .xls с 335 страницами и добавить одну (т.е. 336-ю), то все падает. Кстати, из самого Excel добавляется без проблем! Спасибо M$...

Вот такой код на машине с 1 Gb нормально открывает все 800 закладок
        public void CreateSheets()
        {
            Sheets shs = null;
            try
            {
                shs = _excelApp.Worksheets;
                object wsh = null;

                int failCount = 0;
                Exception failEx = null;
                for (int i = 0; i < 800; i++)
                {
                    try
                    {
                        wsh = shs.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                    }
                    catch (Exception e)
                    {
                        failEx = e;
                        failCount = i;
                        break;
                    }
                    finally
                    {
                        FreeCOMObject(wsh);
                    }
                }
                if (failCount != 0)
                    System.Diagnostics.Debugger.Break();
                else
                    _excelApp.Visible = true;
            }
            finally
            {
                FreeCOMObject(shs);
            }
        }


Посему резюме :
Осовобождай все объекты!
Не забывай что все что возвращается методами екселевских объектов тоже есть COM объекты (коллекции тоже!!!!)
Кэшировать странички особой нужды нет. Если критична скорость то меняй архитектуру — вместо заполнения ячеек из программы делай в шаблоне макрос и заполняй ячейки с помощью его — резку снизиш затраты на маршаллинг.
... << RSDN@Home 1.1.4 beta 4 rev. 324>>
Re[16]: Дополнение...
От: Andrbig  
Дата: 04.03.05 09:23
Оценка:
Здравствуйте, migel, Вы писали:

M>Вот такой код на машине с 1 Gb нормально открывает все 800 закладок


Дело не в добавлении нового, а в копировании листа. Если сможешь сделать 800 копий листа, приведи код.
Re[17]: Дополнение...
От: migel  
Дата: 04.03.05 09:45
Оценка:
Здравствуйте, Andrbig, Вы писали:

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


M>>Вот такой код на машине с 1 Gb нормально открывает все 800 закладок


A>Дело не в добавлении нового, а в копировании листа. Если сможешь сделать 800 копий листа, приведи код.

    for (int i = 0; i < 800; i++)
    {
        try
        {
            wshCopy = shs[1];
            ((Worksheet)wshCopy).Copy(Type.Missing, wshCopy);
        }
        catch (Exception e)
        {
            failEx = e;
            failCount = i;
            break;
        }
        finally
        {
            FreeCOMObject(wshCopy);
        }
    }


Сам Excel упал на 490 закладке
Так что программа не при чем — видать слишком сложные странички получаються
... << RSDN@Home 1.1.4 beta 4 rev. 324>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.