Форум: "Основная";
Текущий архив: 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.009 c