Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Sheridan, Вы писали:
S>>Здравствуйте, Sheridan, Вы писали:
S>>>Я уже вааабще не знаю куды беч... Помогите пожалуйста.
S>>Короче я так понял тут настолько крутые программеры, что такие мелочи их не интересуют... S>>Народ, ну хоть какие идеи, а? Я уже че тока не перепробывал...
A>Посмотри http://www.rsdn.ru/Forum/Message.aspx?mid=1004160&only=1
. Если этот код заработает, используй его как отправную точку. У меня он работает превосходно.
Делал я релизкомобжект, пофигу...
У меня чуть по другому, я сейчас решил попробовать наоборот, кешировать это дело...
Вот например 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 быстрее
Здравствуйте, 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. У меня он работает просто как часы!
Здравствуйте, Andrbig, Вы писали: A>Вот пример, который копирует и потом удаляет лист 200 раз подряд (тебе вроде как это было нужно). У меня это все работает (примечательно, что без GC.Collect() ). A>Если это не то что тебе нужно, тогда сформулируй точнее задачу в части, касающейся Excel. У меня он работает просто как часы!
Мне нужно скопировать лист гдето более 350 раз. Удалять не нужно... Если хочеш я тебе зашлю исходники.
Здравствуйте, Andrbig, Вы писали:
A>Тебе надо создать книгу Excel с 350 листами? Думаю, этого он не понятнет. Лично у меня Excel рухнул на 336 странице.
Здравствуйте, Sheridan, Вы писали:
S>Млин, да ведь делал же! От он гад!
Боюсь что тут нет решения. Даже если открыть .xls с 335 страницами и добавить одну (т.е. 336-ю), то все падает. Кстати, из самого Excel добавляется без проблем! Спасибо M$...
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Sheridan, Вы писали:
S>>Млин, да ведь делал же! От он гад!
A>Боюсь что тут нет решения. Даже если открыть .xls с 335 страницами и добавить одну (т.е. 336-ю), то все падает. Кстати, из самого Excel добавляется без проблем! Спасибо M$...
Вот такой код на машине с 1 Gb нормально открывает все 800 закладок
Посему резюме :
Осовобождай все объекты!
Не забывай что все что возвращается методами екселевских объектов тоже есть COM объекты (коллекции тоже!!!!)
Кэшировать странички особой нужды нет. Если критична скорость то меняй архитектуру — вместо заполнения ячеек из программы делай в шаблоне макрос и заполняй ячейки с помощью его — резку снизиш затраты на маршаллинг.
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, migel, Вы писали:
M>>Вот такой код на машине с 1 Gb нормально открывает все 800 закладок
A>Дело не в добавлении нового, а в копировании листа. Если сможешь сделать 800 копий листа, приведи код.