Изучаю возможность работы с Excel через DDE DDE использую так как несколько приложений работаеют с одним файлом Excel и скидывают туда ( и читают) данные по DDE, да еще пользователь ручками корректируеттдельные листы.
Написал для изучения процесса пример, но у меня умирает буфер через который осуществляю обмен данными.
Спецально ввел прогресбар и когда читаю txt файл (строка из 10 значений по 5-10 символов) то после 5000 записей сильно падает скорость заполнения буфера из массива.
В реальной жизни буду работать не с файлом а считывать в буфер стреницу ( или часть) целиком, формировать из нее массив с которым буду работать и менять данные, а потом также через буфер массив скидывать на лист.
Но вот с буфером у меня проблеммы и как ускорить процесс мне не понятно. Подскажите пожалуйста так как данных на листе много....
| Код | unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DdeMan, ComCtrls;
type TForm2 = class(TForm) ProgressBar1: TProgressBar; DdeClientConv1: TDdeClientConv; Button1: TButton; DdeClientItem1: TDdeClientItem; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject); var Arr1:OleVariant; Buffer: string; DataInFile:TextFile; WordsStr, ST1:TStringList; i1RecTXT: string; maxRow,I,J:integer;
begin {Считываем файл} try AssignFile(DataInFile,'D:\testin.txt'); Reset(DataInFile); // открыть файл для чтения except ShowMessage('Не удалось открыть файл:'); end; try {Формируем массив из TXT файла} WordsStr:=TStringList.create; while not EOF(DataInFile) do begin ReadLn(DataInFile,i1RecTXT); // считываем строку // так как в файле могут быть пустые строки то обрабатываем только строки проходящие контроль длинны if Length(i1RecTXT)>5 then WordsStr.Append(i1RecTXT); end; maxRow:=WordsStr.Count; Arr1:=VarArrayCreate([0,maxRow,0,10],varVariant); for I := 0 to maxRow - 1 do begin st1:=TstringList.Create; st1.Text:= stringReplace(WordsStr.Strings[i],',',#13#10,[rfReplaceAll]);//мы заменяем все "," на символы конца строки for J := 0 to st1.Count - 1 do Arr1[I,J]:=st1.Strings[J]; st1.free; end; WordsStr.free; Label1.Color:=clGreen; // визуализация что данные получены и готовы к экспорту Label1.Caption:='файл считан'; {Перегоняем массив в буфер} Buffer:=''; ProgressBar1.Max:= maxRow; ProgressBar1.Step:=1; for I := 0 to maxRow do begin for J := 0 to 10 do begin Buffer:=Buffer+Arr1[I,J]; if J<10 then Buffer:=Buffer+#9; // разделитель - табуляция end; if I < maxRow then Buffer:=Buffer+#10; // разделитель - перевод строки; ProgressBar1.Position:= ProgressBar1.Position+ ProgressBar1.Step; end; {Экспортируем данные в Excel} if DdeClientConv1.SetLink('EXCEL', 'D:\[test001.xls]L002') and DdeClientConv1.OpenLink then begin try DDEClientItem1.DdeItem :='R1C1:R'+Inttostr(maxRow)+'C11'; DDEClientConv1.PokeData(DDEClientItem1.DdeItem, PChar(Buffer)); finally DDEClientConv1.Free; end; end; finally CloseFile(DataInFile); end; Label1.Color:=clBlue; // визуализация что данные получены и готовы к экспорту Label1.Caption:='файл экспортирован успешно'; ProgressBar1.Position:=0; end;
end.
|
|