Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

передать данные в excel   Найти похожие ветки 

 
АндрейБ   (2003-03-11 13:58) [0]

есть массив строковый. Нужно передать его в excel. Подскажите каким методом это можно сделать максимально быстро.


 
andrey_pst ©   (2003-03-11 14:08) [1]

Через (по скорости работы):
1) Interface
2) DispInterface
3) OleVariant


 
АндрейБ   (2003-03-11 14:51) [2]

to andrey_pst © (11.03.03 14:08)
Спасибо, а можно чуть подробнее об Interface


 
andrey_pst ©   (2003-03-11 15:12) [3]

кинь мне письмо на andrey_pst@rambler.ru
я модуль с примером вышлю, писать многовато будет.


 
Palladin ©   (2003-03-11 16:37) [4]


uses DDEMan;
...
var
xlApp:OleVariant;
xlDDE:TDDEClientConv;
strSheetName,
strBuffer:string;
...
strBuffer:="";
for i:=0 to m_Strings.Count-1 do strBuffer:=strBuffer+m_Strings[i]+#13#10;
if strBuffer<>"" then SetLength(strBuffer,Length(strBuffer)-2);
xlDDE:=TDDEClientConv.Create(nil);
xlDDE.SetLink("EXCEL", strSheetName);
xlDDE.PokeData(OLEVariant(xlApp.Range[координаты прямоугольника для вставки напиример "A1:A"+inttostr(m_Strings.Count)]).Address[ReferenceStyle:=xlR1C1],PChar(strBuffer));
xlDDE.free;
...


 
Style   (2003-03-11 16:45) [5]

Можно проще через VarArrayCreate

например

var
a: variant;

VarArrayCreate(10,10,varVariant)

//загружаеш в массив a что тебе надо и отправляешь в Excel

ExcelApplication.Range("A1:J10").Value := A;







 
Palladin ©   (2003-03-11 17:11) [6]


> Style (11.03.03 16:45)

этот способ один из самых долгих...
мой метод 61
твой 1625
оно и понятно... работа с Variant занимает очень большое время...


 
Palladin ©   (2003-03-11 17:15) [7]

замерял вот этим

var
xlApp:OleVariant;
xlDDE:TDdeClientConv;
Strings:TStringList;
buffer:string;
i:integer;
tc:int64;

a:variant;
begin
Strings:=TStringList.Create;
for i:=0 to 9999 do Strings.Add("aaaaaaa");
xlApp:=CreateOleObject("Excel.Application");
xlApp.WorkBooks.Add;

tc:=GetTickCount;
buffer:="";
for i:=0 to Strings.Count-1 do buffer:=buffer+Strings[i]+#13#10;
SetLength(Buffer,Length(buffer)-2);
xlDDE:=TDDEClientConv.Create(nil);
xlDDE.SetLink("EXCEL", "Лист1");
xlDDE.PokeData(OLEVariant(xlApp.Range["A1:A10000"]).Address[ReferenceStyle:=xlR1C1], pchar(buffer));
xlDDE.free;
edit1.Text:=IntToStr(GetTickCount-tc);

tc:=GetTickCount;
a:=VarArrayCreate([0,9999],varVariant);
for i:=0 to 9999 do a[i]:=Strings[i];
xlApp.Sheets[2].Range["A1:A10000"]:=a;
edit2.Text:=IntToStr(GetTickCount-tc);

Strings.Free;
xlApp.Quit;
end;


 
Style   (2003-03-11 19:24) [8]

Palladin>
Я не писал что он быстрее, я писал что он проще :)) Просто меня скорость устраивала. В отличии от того как народ по ячейкам вставлял данные в Excel, после чего появлялись непонятные ошибки.
И вообще все висло...

Интересно а если VarArrayCreate([0,9999],varString); - скорость не изменится???


 
Palladin ©   (2003-03-11 19:44) [9]

ну по поводу сабжа то

> Подскажите каким методом это можно сделать максимально быстро.


а про varString вообще сругалась Error creating variant array


 
Style   (2003-03-11 19:53) [10]

>> ну по поводу сабжа то

Так зачитался что забыл про сабж :) Бывает...


 
АндрейБ   (2003-03-11 23:08) [11]

> Palladin © (11.03.03 17:15)

Не совсем понял вот этот блок:


tc:=GetTickCount;
buffer:="";
for i:=0 to Strings.Count-1 do buffer:=buffer+Strings[i]+#13#10;
SetLength(Buffer,Length(buffer)-2);
xlDDE:=TDDEClientConv.Create(nil);
xlDDE.SetLink("EXCEL", "Лист1");
xlDDE.PokeData(OLEVariant(xlApp.Range["A1:A10000"]).Address[ReferenceStyle:=xlR1C1], pchar(buffer));
xlDDE.free;
edit1.Text:=IntToStr(GetTickCount-tc);


Если я все правильнопонимаю, то tc:=GetTickCount; должна стоять перед xlDDE.PokeData..., т.е. перед непосредственным отправление данных в excel. Зачем ты здесь засекаешь время перед созданием?

И ещё: обясните мне что такое ReferenceStyle:=xlR1C1, у меня delphi ругается, мол неизвестная переменная. (delphi 5, WinXP)

PS Будет ли это все работать на древнем компе под Win95, Office97?


 
Palladin ©   (2003-03-11 23:22) [12]


> АндрейБ (11.03.03 23:08)

в процесс отправки данных входит и процесс их подготовки... чего тут непонятного... разные способы отправки, разные методы подготовки... поэтому логичней замерять вместе с ним...

xlR1C1 это константа... можешь посмотреть ее зачение в файле Excel2000.pas в генофонде...
только помоему в d5 нет ее... вот она
const
xlR1C1 = $FFFFEFCA;

пропиши себе и усе будет в порядке...


 
АндрейБ   (2003-03-11 23:56) [13]

>Palladin © (11.03.03 23:22)

В общем-то логично. Это что-то я глючу. Только вот тогда у меня получается наоборот, для твоего метода 1562, а для другого 328. Выходит, что variant все-таки быстрее...


 
Palladin ©   (2003-03-12 00:08) [14]

а черт знает... у меня такие результаты...
может у тебя машина слабая, на момент pokedata еще прогружаются доп компоненты екселя и пр... а на момент простого присвоения все нормально...


 
АндрейБ   (2003-03-12 00:13) [15]

может быть конечно. У меня Athlon XP 2100+ - может это он все портит.

А вообще это все должно работать на очень древнем компе по Win95. Что посоветуешь? Или лучше оба метода сначала проверить вот таким образом? А с Office 97 это будет работать?


 
Palladin ©   (2003-03-12 00:18) [16]

совет тут только один...
первый запуск теста даст тебе не совсем точные результаты..
запусти несколько раз (на всех типах оп. систем, ибо реализация DDE отличается у NT и 9x) и сравни результаты... подведи тк скть статистику...

с 97 офисом работать должно...


 
АндрейБ   (2003-03-12 00:30) [17]

Спасибо. Дальше буду разбираться...



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-76359
SZap
2003-02-26 19:14
2003.03.24
Проблема с открытием таблици


1-76479
Slym
2003-03-11 19:48
2003.03.24
Поворот текста из нескольких строк в TPicture...


3-76292
studentas
2003-03-04 12:43
2003.03.24
SQL?


6-76560
Anton
2003-01-29 22:15
2003.03.24
Есть ли ограничение на размер файла передаваемого по FTP


3-76272
digester
2003-03-07 02:36
2003.03.24
Сортировка записей в таблице