求问一下子
求问一下。
function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean;
const
xlNormal=-4143;
var
y :integer;
tsList :TStringList;
s,filename :string;
aSheet :Variant;
excel:OleVariant;
savedialog:tsavedialog;
begin
result:=true;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
//screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.FileName:=sfilename; //存入文件
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
//screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
if filename='' then
begin
result:=true;
Excel.Quit;
//screen.cursor:=crDefault;
exit;
end;
aSheet:=excel.Worksheets.Item[1];
tsList:=TStringList.Create;
//tsList.Add('查询结果'); //加入标题
s:=''; //加入日期 时间
s:= datetimetostr(now());
tsList.Add(s);
s:=''; //加入字段名
for y := 1 to adoquery.fieldCount - 1 do //从1开始是为了过滤到最前面的编号字段
begin
s:=s+adoQuery.Fields.Fields[y].FieldName+#9 ;
Application.ProcessMessages;
end;
tsList.Add(s);
try
try
ADOQuery.First;
While Not ADOQuery.Eof do
begin
s:='';
for y:=1 to ADOQuery.FieldCount-1 do
begin
s:=s+ADOQuery.Fields[y].AsString+#9;
Application.ProcessMessages;
end;
tsList.Add(s);
ADOQuery.next;
end;
Clipboard.AsText:=tsList.Text;
except
result:=false;
end;
finally
tsList.Free;
end;
aSheet.Paste;
MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION or MB_OK);
try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
Excel.Visible := false; //true会自动打开已经保存的excel
Excel.Quit;
Excel := UnAssigned;
end;
以上为一段从mssql导出到excel的函数,速度比较 快, 请教一下图红的那句代码啥意思,是指人定位于 EXCEL A1 单元格?
同理推测如果大批量读EXCEL数据的时候也是先把数据拷到 粘贴板再读到数据这样会比遍历每行每列的数据快不少吗?
------解决思路----------------------
aSheet 引用Sheet即工作表的变量;
excel.Worksheets.Item[1] 指定Excel的第1个工作表;
aSheet:=excel.Worksheets.Item[1]; 让aSheet指定指定Excel的第1个工作表,可通过aSheet操作工作表1。
------解决思路----------------------
用clipbord来直接复制,长见识了...不过用clipbord速度快的另外一种可能的解释是,从clipbord直接复制过去的数据只刷新一次一次excel页面,所以不需要在页面刷新上花费太多功夫(类似的,更快的一种做法是直接导出成csv文件)。要验证是否真的如此,可以先把代码改成一个单元一个单元的输出,然后把workbook隐藏起来进行导出,看看速度是不是差不多。
function ToExcel(sfilename:string; ADOQuery:TADOQuery):boolean;
const
xlNormal=-4143;
var
y :integer;
tsList :TStringList;
s,filename :string;
aSheet :Variant;
excel:OleVariant;
savedialog:tsavedialog;
begin
result:=true;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
//screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.FileName:=sfilename; //存入文件
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
//screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
if filename='' then
begin
result:=true;
Excel.Quit;
//screen.cursor:=crDefault;
exit;
end;
aSheet:=excel.Worksheets.Item[1];
tsList:=TStringList.Create;
//tsList.Add('查询结果'); //加入标题
s:=''; //加入日期 时间
s:= datetimetostr(now());
tsList.Add(s);
s:=''; //加入字段名
for y := 1 to adoquery.fieldCount - 1 do //从1开始是为了过滤到最前面的编号字段
begin
s:=s+adoQuery.Fields.Fields[y].FieldName+#9 ;
Application.ProcessMessages;
end;
tsList.Add(s);
try
try
ADOQuery.First;
While Not ADOQuery.Eof do
begin
s:='';
for y:=1 to ADOQuery.FieldCount-1 do
begin
s:=s+ADOQuery.Fields[y].AsString+#9;
Application.ProcessMessages;
end;
tsList.Add(s);
ADOQuery.next;
end;
Clipboard.AsText:=tsList.Text;
except
result:=false;
end;
finally
tsList.Free;
end;
aSheet.Paste;
MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION or MB_OK);
try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
Excel.Visible := false; //true会自动打开已经保存的excel
Excel.Quit;
Excel := UnAssigned;
end;
以上为一段从mssql导出到excel的函数,速度比较 快, 请教一下图红的那句代码啥意思,是指人定位于 EXCEL A1 单元格?
同理推测如果大批量读EXCEL数据的时候也是先把数据拷到 粘贴板再读到数据这样会比遍历每行每列的数据快不少吗?
------解决思路----------------------
aSheet 引用Sheet即工作表的变量;
excel.Worksheets.Item[1] 指定Excel的第1个工作表;
aSheet:=excel.Worksheets.Item[1]; 让aSheet指定指定Excel的第1个工作表,可通过aSheet操作工作表1。
------解决思路----------------------
用clipbord来直接复制,长见识了...不过用clipbord速度快的另外一种可能的解释是,从clipbord直接复制过去的数据只刷新一次一次excel页面,所以不需要在页面刷新上花费太多功夫(类似的,更快的一种做法是直接导出成csv文件)。要验证是否真的如此,可以先把代码改成一个单元一个单元的输出,然后把workbook隐藏起来进行导出,看看速度是不是差不多。