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

Вниз

передать данные в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
14-76629
Andrey
2003-03-07 19:08
2003.03.24
А как у вас празнуется 8... (ну 7, не принципиально) марта


14-76652
Viacheslav
2003-03-08 09:26
2003.03.24
Обезвредить клавиатурного паука!


1-76498
Kreporator
2003-03-09 23:34
2003.03.24
Отбирание слов из строки


4-76736
xZero
2003-01-28 01:11
2003.03.24
Надо поймать клик


14-76612
igorr
2003-03-07 15:29
2003.03.24
HTML Flash





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский