首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

利用剪贴板实现高速导出数据到Excel

打印文章

分享到:
    在很多的时候,我们需要将我们的数据导出到Excel中进行加工,在Access中有现成的工具可以实现
可是在Delphi中却偏偏没有,无论如何我们需要这么一个工具,那么,事不宜迟,细细一想,最好的方法莫过
于直接在程序中按照Excel的格式生成Excel文件,使用Ole技术直接调用Excel实例,由于第一种方法技术实现
过于复杂,好在一般的计算机上已经安装了Office,在此就第二种方法“抛一块砖”。
    在此做一个示例以方便说明,我们考虑到导出数据有很多的情况是Master/Detail数据,因此就用两个
TQuery和一个TDataSource,如果有更多的层次,只需要增加TQuery和TDataSource即可,以下使用了两个TQuery
,分别是:qryMaster和qryDetail,一个TDataSource:dsSource;
    步骤是:
                1.建立一个Excel实例
                2.创建一个工作表
                3.创建一个TStringList,用来装数据
                4.穷举数据表,将数据存入TStringList
                5.将TStringList的数据复制到剪贴板
                6.把剪贴板中的数据粘贴到Excel
     本方法的优点在于:比逐条写入到Excel中的速度大大提高,我曾试过,在P3933,256M的机器上用普通
的方法,导出1000条数据大约需要2分钟,而该用本方法后只需要8秒。

function ToExcel():boolean;
var
    y       :integer;
    tsList  :TStringList;
    s       :string;
    aSheet  :Variant;
begin
    result:=true;
    Excel.Connect;                  // 打开Excel
    Excel.Visible[0]:=true;         // 显示Excel
    Excel.Workbooks.Add(xlWBATWorksheet,0);
    aSheet:=excel.Worksheets.Item[1];

    tsList:=TStringList.Create;
    try
        try
            with qryMaster do
            begin
                Open;
                First;
                While Not Eof do
                begin
                    s:='';
                    for y:=0 to FieldCount-1 do
                    begin
                        s:=s+Fields[y].AsString+#9;
                        Application.ProcessMessages;
                    end;
                    tsList.Add(s);
                    // 从表
                    if qryDetail<>nil then
                    begin
                        with qryDetail do
                        begin
                            Open;
                            First;
                            while Not Eof do
                            begin
                                s:='';
                                for y:=0 to FieldCount-1 do
                                begin
                                    s:=s+Fields[y].AsString+#9;
                                    Application.ProcessMessages;
                                end;
                                tsList.Add(s);
                                next;
                            end;
                        end;
                    end;
                    next;
                end;
                Close;
            end;
            Clipboard.AsText:=tsList.Text;
        except
            result:=false;
        end;
    finally
        tsList.Free;
    end;

    Excel.Disconnect;
    aSheet.Paste;
    MessageBox(Application.Handle,'数据导出完毕!','系统提示',MB_ICONINFORMATION or MB_OK);
end;

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章