Текущий архив: 2004.03.14;
Скачать: CL | DM;
ВнизExcel и StringGrid Найти похожие ветки
← →
Builder (2004-03-01 19:16) [0]Господа, поскажите:
я переписываю StringGrid в Excel:
XLApp.WorkBooks[1].WorkSheets[1].Cells[1,1] := StringGrid1.Cells[1,1]; //так все нормально, но если:
FOR i:=0 TO 5 DO
FOR j:=0 TO 5 DO
XLApp.WorkBooks[1].WorkSheets[1].Cells[i,j] := StringGrid1.Cells[i,j]; //то - ошибка, что то связанное с OLE..
Разобраться никак не могу...
← →
Тимохов (2004-03-01 19:17) [1]
> Builder (01.03.04 19:16)
читайте хелп по cells :)))))
индексы с 1 :)))))
← →
Тимохов (2004-03-01 19:18) [2]уточнение cells в экселе, а не гриде :))))
← →
Builder (2004-03-01 19:19) [3]т.е всего навсего в Excel"e нет нулевых позиций :)??? Хм..спасибо, как-то такая мысль даже в голову не пришла...
← →
Тимохов (2004-03-01 19:22) [4]в хелпе это было (недавно видел)
← →
YurikGl (2004-03-01 19:22) [5]Кусок рабочего кода. (правда для БД)
{E1=excelapplication}
l:=1
if ADODataSet1.RecordCount>0 then begin
Repeat
if ADODataSet1.Fields[3].value<>null then
E1.Range["A"+IntToStr(l),"A"+IntToStr(l)].formula:=ADODataSet1.Fields[3].value;
if ADODataSet1.Fields[2].value<>null then
E1.Range["B"+IntToStr(l),"B"+IntToStr(l)].formula:=ADODataSet1.Fields[2].value;
if ADODataSet1.Fields[4].value<>null then
E1.Range["C"+IntToStr(l),"C"+IntToStr(l)].formula:=ADODataSet1.Fields[4].value;
if ADODataSet1.Fields[1].value<>null then
E1.Range["D"+IntToStr(l),"D"+IntToStr(l)].formula:=ADODataSet1.Fields[1].value;
if ADODataSet1.Fields[5].value<>null then
E1.Range["E"+IntToStr(l),"E"+IntToStr(l)].formula:=ADODataSet1.Fields[5].value;
inc(l)
ADODataSet1.Next;
until ADODataSet1.Eof;
end;
← →
Builder (2004-03-01 19:25) [6]пардон, Range - это ...?
← →
jack128 (2004-03-01 19:27) [7]
> FOR i:=0 TO 5 DO
> FOR j:=0 TO 5 DO
> XLApp.WorkBooks[1].WorkSheets[1].Cells[i,j] := StringGrid1.Cells[i,j];
> //то - ошибка, что то связанное с OLE..
никогда так не делай - используй вариантные массивы
см http://delphimaster.net/view/1-1077974718/ - там я давал пример. Прочитай серию статей на Королевстве про взаимодействие с Excel
← →
YurikGl (2004-03-01 19:27) [8]Какая разница? Просто несколько лет назад мне не удалось добраться до cell и я использовал range. С тех пор, использую старые заготовки. Главное - работает.
← →
jack128 (2004-03-01 19:34) [9]
> Какая разница? Просто несколько лет назад мне не удалось
> добраться до cell и я использовал range. С тех пор, использую
> старые заготовки. Главное - работает.
Вызов интерфейсов OLE - весьма ресурсоемкая операция, лудше сделать 1 вызов, чем 36 ;-)
← →
Тимохов (2004-03-01 19:37) [10]
> никогда так не делай - используй вариантные массивы
> см http://delphimaster.net/view/1-1077974718/
> - там я давал пример. Прочитай серию статей на Королевстве
> про взаимодействие с Excel
Спортное утверждение.
Вариантные массивы хороши для скорости. Но все же как ни бейся, равно работает достаточно медленно, когда нужно делать форматирование (бордюрчики, шрифт и все такое).
Для меня этот тип просто не подошел, т.к. нельзя создать вариантный массив в элементом типа TDecimal (вариант типа 14) :(((
Имхо, через XML все делать надо - вобщем случае раз в 1000 быстрее получается.
← →
YurikGl (2004-03-01 19:37) [11]1) Пока выходные таблицы (в моей проге) маленькие и большими быть не планируются.
2) Этот пример показывал пошаговое заполнение таблицы с инкрементацией нумерации и не более. Через массив - эффективнее, не спорю.
← →
Builder (2004-03-01 19:39) [12]т.е. если я делаю i от 1 до 1000 и j также, то ресурсы полный аллес?
← →
Тимохов (2004-03-01 19:40) [13]
> Builder © (01.03.04 19:39) [12]
попробуйте.
10000 значений в эксель у меня выводятся минут 10
← →
YurikGl (2004-03-01 19:44) [14]Используй EnableEvents:=false;
← →
Builder (2004-03-01 19:45) [15]Хм...это на какой машине или в принципе не важно, да и попутный вопрос, у меня Office XP, а если у пользователя стоит 97?
И массивами все - таки намного быстрее?
← →
jack128 (2004-03-01 19:46) [16]
> равно работает достаточно медленно, когда нужно делать форматирование
> (бордюрчики, шрифт и все такое).
Ха, а что ж ты хочешь, то? В динамике оформление делать. Обычно шаблоны делают зарание. В крайнем случаи для выполнения большого количества операций лудше макрос написать..
> т.к. нельзя создать вариантный массив в элементом типа TDecimal
> (вариант типа 14
А чем Double не подходит?
> Имхо, через XML все делать надо - вобщем случае раз в 1000
> быстрее получается.
То есть ты вручную формирушь XML - документ и загружаешь его в XL ? А формат в котором Excel сохраняет свои таблицы в XML открыт? К тому же не у всех есть ExcelXP ;-)
> И массивами все - таки намного быстрее?
а самому эксперемент провести? У меня на порядки..
← →
Builder (2004-03-01 19:46) [17]после "не важно" забыл поставить вопрос, извиняюсь...
← →
YurikGl (2004-03-01 19:47) [18]Re [15] Зависит от размера таблицы
← →
Тимохов (2004-03-01 19:53) [19]
> YurikGl © (01.03.04 19:44) [14]
Процентов 10 дает выигрыша.
← →
Builder (2004-03-01 19:55) [20]так все-таки как с взаимодействием приложения с разными версиями Excel?
← →
YurikGl (2004-03-01 19:58) [21]У меня проблем не возникало. Хотя я читал про проблемы вызываемые тем, что в русском Excell функции называются по русски а в англицком по английски
← →
Builder (2004-03-01 20:00) [22]шутку понял...смешно... ладно спасибо буду пробовать...
← →
jack128 (2004-03-01 20:08) [23]
> Процентов 10 дает выигрыша.
?????
sg - StringGrid - 100 на 100 ячеек
procedure TForm1.Button1Click(Sender: TObject);
var
XL,
WB: OleVariant;
WS: OleVariant;
Data, r: OleVariant;
i, j: integer;
t: Cardinal;
begin
t := GetTickCount;
try
XL := CreateOleObject("Excel.Application");
WB := XL.Workbooks.Add;
Data := VarArrayCreate([0, sg.RowCount - 1, 0, sg.ColCount -1], varOleStr);
for i := 0 to sg.ColCount - 1 do
for j := 0 to sg.RowCount - 1 do
// т.к. в excel"е cells[Row, Col], а в sg.Cells[Col, Row]
Data[j, i] := sg.Cells[i, j];
WS := WB.WorkSheets.Add;
r := WS.Range[WS.Cells[1, 1], WS.Cells[sg.RowCount, sg.ColCount]];
r.Value := Data;
XL.Visible := True;
except
XL.Quit;
raise;
end;
Caption := IntToStr(GetTickCount - t);
end;
procedure TForm1.FormCreate(Sender: TObject);
var i, j : integer;
begin
for i := 0 to sg.ColCount - 1 do
for j := 0 to sg.RowCount - 1 do
sg.Cells[i, j] := Format("Col = %d, Row = %d", [i, j]);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
XL,
WB: OleVariant;
WS: OleVariant;
Data, r: OleVariant;
i, j: integer;
t: Cardinal;
begin
t := GetTickCount;
try
XL := CreateOleObject("Excel.Application");
WB := XL.Workbooks.Add;
WS := WB.WorkSheets.Add;
for i := 0 to sg.ColCount - 1 do
for j := 0 to sg.RowCount - 1 do
// т.к. в excel"е cells[Row, Col], а в sg.Cells[Col, Row]
WS.Cells[j + 1, i + 1].Value := sg.Cells[i, j];
XL.Visible := True;
except
XL.Quit;
raise;
end;
Caption := IntToStr(GetTickCount - t);
end;
При использовании массива от 1 до 5 секунд, в цикле более минуты..
← →
Тимохов (2004-03-01 20:47) [24]
> jack128 © (01.03.04 20:08) [23]
Я не про массив, а про EnableEvents
Страницы: 1 вся ветка
Текущий архив: 2004.03.14;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.014 c