procedure TForm1.Button1Click(Sender: TObject); var I: Integer; S: string; T: string; begin ClientDataSet1.First; while not ClientDataSet1.Eof do begin S := ''; for I := 0 to ClientDataSet1.FieldList.Count - 1 do S := S + #9 + ClientDataSet1.FieldByName( ClientDataSet1.FieldList[I]).DisplayText; T := T + S + #13#10; Delete(S, 1, 1); ClientDataSet1.Next; end; {将T放到剪贴板} {调用Excel} {粘贴到Excel中} end;
while not ClientDataSet1.Eof do begin S := '';while not ClientDataSet1.Eof do begin S := ''; for I := 0 to ClientDataSet1.FieldList.Count - 1 do S := S + #9 + ClientDataSet1.FieldByName( ClientDataSet1.FieldList[I]).DisplayText; T := T + S + #13#10; Delete(S, 1, 1); ClientDataSet1.Next; end; 问题就是对Clientdataset的遍历在数据量大的时候也是很耗时间的。 有没有更好的办法呢,请zswang(伴水) 多多指教
//这个循环需要多少时间? ClientDataSet1.First; while not ClientDataSet1.Eof do begin S := '';while not ClientDataSet1.Eof do begin S := ''; for I := 0 to ClientDataSet1.FieldList.Count - 1 do S := S + #9 + ClientDataSet1.FieldByName( ClientDataSet1.FieldList[I]).DisplayText; T := T + S + #13#10; Delete(S, 1, 1); ClientDataSet1.Next; end;//以前我做的是一条条的放到Excel ExcelApplication....Cell[vCell] := S; //1000条至少要60秒//后来我看见客户用SQL Server统计后直接拷贝到Excel中 //6000多条不过3秒中 //我就得到了启示
粘贴到Excel中就ok
var
I: Integer;
S: string;
T: string;
begin
ClientDataSet1.First;
while not ClientDataSet1.Eof do begin
S := '';
for I := 0 to ClientDataSet1.FieldList.Count - 1 do
S := S + #9 + ClientDataSet1.FieldByName(
ClientDataSet1.FieldList[I]).DisplayText;
T := T + S + #13#10;
Delete(S, 1, 1);
ClientDataSet1.Next;
end;
{将T放到剪贴板}
{调用Excel}
{粘贴到Excel中}
end;
S := '';while not ClientDataSet1.Eof do begin
S := '';
for I := 0 to ClientDataSet1.FieldList.Count - 1 do
S := S + #9 + ClientDataSet1.FieldByName(
ClientDataSet1.FieldList[I]).DisplayText;
T := T + S + #13#10;
Delete(S, 1, 1);
ClientDataSet1.Next;
end;
问题就是对Clientdataset的遍历在数据量大的时候也是很耗时间的。
有没有更好的办法呢,请zswang(伴水) 多多指教
如:DBGrid
还有你要把ClientDataSet1所有的事件都取消我就是这样做
必要时间是要花的
用户可以理解
Clientdataset的数据怎样存为.DBF格式
to zswang(伴水)
1000条数据你大概需要多少时间
unit unt_Common;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, Gauges, ComObj, DB;type
Tfom_Common = class(TForm)
tbl_DBF: TTable;
savdlg_Common: TSaveDialog;
private
{ Private declarations }
public
{ Public declarations }
end;var
fom_Common: Tfom_Common;
sUserName : String;
spCommon : TStoredProc;
qryCommon : TQuery;
sOfficeVerNbr : String;
slObjectList : TStringList;
slLevelList : TStringList;
function TransformFun(intNum : Integer):String;
procedure SpToDbf(spProcedure :TStoredProc;sFilter ,sDefaultExt :String);
procedure QryToDbf(qryQuery :TQuery;sFilter ,sDefaultExt :String);
//S
function TransformFun(intNum : Integer):String;
var
m,n : Integer;
Ascii,Ascii2 : String;
begin
m := intNum div 26;
n := intNum mod 26;
if m <> 0 then
Ascii := TransformFun(m-1);
Ascii2 := char(65+n);
Result := Ascii+Ascii2;
end;
//E
//S
procedure SpToDbf(spProcedure :TStoredProc;sFilter ,sDefaultExt :String);
begin
with fom_Common do
begin
savdlg_Common.DefaultExt := sDefaultExt;
savdlg_Common.Filter := sFilter;
if savdlg_Common.Execute then
begin
tbl_DBF.TableName := savdlg_Common.FileName;
spProcedure.First;
tbl_DBF.BatchMove(spProcedure,batCopy);
MessageDlg('Success!'+#13+#13+'File Path = ' + savdlg_Common.FileName,mtinformation,[mbok],0);
end;
end;
end;
//E//S
procedure QryToDbf(qryQuery :TQuery ; sFilter ,sDefaultExt :String);
begin
with fom_Common do
begin
savdlg_Common.DefaultExt := sDefaultExt;
savdlg_Common.Filter := sFilter;
if savdlg_Common.Execute then
begin
tbl_DBF.TableName := savdlg_Common.FileName;
qryQuery.First;
tbl_DBF.BatchMove(qryQuery,batCopy);
MessageDlg('Success!'+#13+#13+'File Path = ' + savdlg_Common.FileName,mtinformation,[mbok],0);
end;
end;
end;
//Eend.
从速度的角度看,直接写入excel可能会比存到数据库要慢;不过从excel中打开dbf要多久时间就没有算过了
时间是花在打开Excel上
如果Excel已经是打开的不过3秒
ClientDataSet1.First;
while not ClientDataSet1.Eof do begin
S := '';while not ClientDataSet1.Eof do begin
S := '';
for I := 0 to ClientDataSet1.FieldList.Count - 1 do
S := S + #9 + ClientDataSet1.FieldByName(
ClientDataSet1.FieldList[I]).DisplayText;
T := T + S + #13#10;
Delete(S, 1, 1);
ClientDataSet1.Next;
end;//以前我做的是一条条的放到Excel
ExcelApplication....Cell[vCell] := S;
//1000条至少要60秒//后来我看见客户用SQL Server统计后直接拷贝到Excel中
//6000多条不过3秒中
//我就得到了启示
可是BatchMove()就要用到DBE
如果客户那里没有Setup就很惨
http://www.csdn.net/expert/topic/378/378117.shtm
请zswang(伴水)兄及各位大拿指点迷津。
另:给贴子加分,这几天老想给分,但都未成功,望各位仁兄见谅