Export ADO DataSet to Excel file with Delphi

最近在用Delphi做一个小工具,需要把ADO的数据导出到Excel文件中。
已经实现了一个笨办法,按行、列嵌套循环使用OLE对象访问的方法把数据写到每个单元格,实现起来很简单,但有一个很明显的问题:效率太低;当有20个字段*8000条记录的数据量时,需要差不多十分钟左右,追求完美的我无法接受这样的现实,于是开始寻找解决方案。理想中的方案是:用ADO连接Excel,用DataSet的Clone方法或者SaveToFile + LoadFromFile解决问题。但让我失望的是,百度+谷歌双管齐下都没有找到能成功的例子,于是死了这条心了。
退而求其次,既然OLE对象写入Excel慢,用ADO的方式把Excel当数据库来写入数据会不会快呢?需要尝试。说干就干,按照下面的步骤依次进行:
1. 把Excel当数据库用-貌似不难:ADOConnection.ConnectionString = ‘Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=[YourExcelFileName];Extended Properties=’Excel 8.0;HDR=Yes’;Persist Security Info=False’
另外访问Excel的工作表时,需要在工作表名称后面加上$,一定注意。
2. 创建初始工作表-这一步其实就是要造一个只有列标题的空Excel文件,要不然不能当表来用的。代码:
WorkBook := ExcelObject.Application.WorkBooks.Add();
DeleteFile(‘[YourExcelFileName]’);
if StrToFloatDef(SaveObj.Application.Version,11.0) WorkBook.SaveAs(FileName:='[YourExcelFileName]’)
else
WorkBook.SaveAs(FileName:='[YourExcelFileName]’,FileFormat:=56); //如果装的是Excel2007及以上版本,则存为Excel8格式,免得高版本影响使用;
WorkSheet := WorkBook.Sheets[1];
for i:=0 to qry_sql.FieldCount – 1 do begin
WorkSheet.Cells[1,i+1] := qry_sql.Fields[i].FieldName;
end;
WorkBook.Save;
WorkBook.Close();
WorkSheet := Unassigned;
WorkBook := Unassigned;
3. 用ADOTable打开工作表,用TADOTable连上TADOConnection并打开即可
4. 从一个DataSet复制数据到这个Excel ADOTable中,用下面这个通用的方法即可:
function CopyDataSet(FromDS, ToDS: TDataSet): integer;
var
i,j:Integer;
slFrom,slTo:TStringList;
begin
j := FromDS.RecNo;
slFrom := TStringList.Create;
slTo := TStringList.Create;
FromDS.Fields.GetFieldNames (slFrom);
ToDS.Fields.GetFieldNames (slTo);
for i:=slFrom.count – 1 downto 0 do
if slTo.IndexOf(slFrom[i])

while not FromDS.Eof do begin
ToDS.Append();
for i:=0 to slFrom.Count -1 do
ToDS.FieldByName(slFrom[i]).Value := FromDS.FieldByName(slFrom[i]).Value;
FromDS.Next;
end;
if FromDS.RecordCount >0 then
ToDS.Post;
FromDS.RecNo := j;
end;
顺便说一下我是怎么使用这个方法的:
conXls.Open();
tblXls.TableName := ‘[Sheet1$]’;
tblXls.Open;
conXls.BeginTrans;
CopyDataSet(qry_sql,tblXls);
tblXls.Close;
conXls.CommitTrans;
conXls.Close;

用这种方案后,原本需要10分钟左右的数据量,现在导出来仅需5秒钟,可以让我满意了。
希望以上内容能帮上有这方面需要的朋友。

《Export ADO DataSet to Excel file with Delphi》有1个想法

评论已关闭。