Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.019 c
4-43940
prabbit
2004-01-07 21:28
2004.03.14
Не выходит передать нажатие клавиш...


14-43763
ИМХО
2004-02-19 01:14
2004.03.14
Новый агент 007


6-43708
Hkr
2004-01-08 03:57
2004.03.14
TraceRoute


1-43543
satron
2004-02-27 19:01
2004.03.14
подскажите компонент


7-43932
Kerk
2003-12-18 11:44
2004.03.14
PhysicalMemory





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский