今日是:
  小新技术网 -=> 程序开发 -=> DELPHI -=> 正文

Delphi编程将数据库数据快速导入Excel

作者:[本站编辑] 来源:[本站] 浏览:[] 评论:[]  【字体:
 在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理。这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动化对象,通过该对象来传送数据。也可以使用ADO,通过与Excel数据存储建立连接,使用ADO这种独立于数据库后端的技术来导出数据集的数据。

  可这两种技术都有一个共同的缺点,那就是慢,数据量少还好,用户不会有太多的感觉,可一旦数据量大,比如,超过1千条,速度就让人难以忍受了,那么有没有更好的办法,既可以快速地导出数据,又不用安装附加的软件。也许好多人都想到了剪贴板的方式,这种方式速度是快,可也有不好的一面,那就是数据量大占用内存也大,并且在Excel中调用PASTE方法时,需要锁定输入,这使用起来,就有点不方便了

  这里我为大家介始一种比较好的方法,使用文件流的方式,通过TfileStream直接写入Excel文件。我写了一个函数,通过它可将数据集中的数据直接导入到Excel文件中。我测试了一下,1M的数据,不到十秒就完成了。附源程序

  首先在你的程序中定义以下几个数组:

arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);

arXlsEnd: array[0..1] of Word = ($0A, 00);

arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);

arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);

arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);

arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);

  接着调用下面的函数。

Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
var
 i, j: integer;
 Col, row: word;
 ABookMark: TBookMark;
 aFileStream: TFileStream;
 procedure incColRow; //增加行列号
begin
 if Col = ADataSet.FieldCount - 1 then
 begin
  Inc(Row);
  Col :=0;
 end
 else
  Inc(Col);
 end;

procedure WriteStringCell(AValue: string);//写字符串数据
var
 L: Word;
begin
 L := Length(AValue);
 arXlsString[1] := 8 + L;
 arXlsString[2] := Row;
 arXlsString[3] := Col;
 arXlsString[5] := L;
 aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
 aFileStream.WriteBuffer(Pointer(AValue)^, L);
 IncColRow;
end;

procedure WriteIntegerCell(AValue: integer);//写整数
var
 V: Integer;
begin
 arXlsInteger[2] := Row;
 arXlsInteger[3] := Col;
 aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
 V := (AValue shl 2) or 2;
 aFileStream.WriteBuffer(V, 4);
 IncColRow;
end;

procedure WriteFloatCell(AValue: double);//写浮点数
begin
 arXlsNumber[2] := Row;
 arXlsNumber[3] := Col;
 aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
 aFileStream.WriteBuffer(AValue, 8);
 IncColRow;
end;

begin
if FileExists(FileName) then DeleteFile(FileName); //文件存在,先删除
 aFileStream := TFileStream.Create(FileName, fmCreate);
 Try
  //写文件头
  aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
  //写列头
  Col := 0; Row := 0;
  if bWriteTitle then
  begin
   for i := 0 to aDataSet.FieldCount - 1 do
    WriteStringCell(aDataSet.Fields[i].FieldName);
   end;
   //写数据集中的数据
   aDataSet.DisableControls;
   ABookMark := aDataSet.GetBookmark;
   aDataSet.First;
   while not aDataSet.Eof do
   begin
    for i := 0 to aDataSet.FieldCount - 1 do
     case ADataSet.Fields[i].DataType of
      ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
      WriteIntegerCell(aDataSet.Fields[i].AsInteger);
      ftFloat, ftCurrency, ftBCD:
      WriteFloatCell(aDataSet.Fields[i].AsFloat)
     else
      WriteStringCell(aDataSet.Fields[i].AsString);
     end;
     aDataSet.Next;
    end;
    //写文件尾
    AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
    if ADataSet.BookmarkValid(ABookMark) then aDataSet.GotoBookmark(ABookMark);
    Finally
     AFileStream.Free;
    ADataSet.EnableControls;
   end;
 end;

  以上程序,在DELPHI6中通过测试!
下一篇:Delphi实现通用的定时自动关机程序
上一篇:用Delphi实现局域网内消息传递
IP查询、IP签名
打印 】【 收藏 】【 评论 】【 推荐
相关文章 栏目推荐文章 栏目热门文章
 普通文章 Delphi高精度计时方法 
 推荐文章 Delphi编程将数据库数据快速导入E.. 
 推荐文章 通过实例看VCL组件开发全过程(三.. 
 推荐文章 系统操作进行监视 
 推荐文章 隐藏我的电脑中驱动器 
 推荐文章 一个完整身份证效验程序 
 推荐文章 Delphi编程技巧集锦 
 推荐文章 delphi函数参考手册 
 推荐文章 用Delphi开发数据库程序经验三则 
 推荐文章 delphi函数参考手册 
 推荐文章 Delphi编程将数据库数据快速导入E.. 
 普通文章 DELPHI超级Internet控件集--INDY 
 普通文章 Delphi实现通用的定时自动关机程序.. 
 推荐文章 一个完整身份证效验程序 
 普通文章 Delphi中实现DBGrid列宽度自动调整.. 
 普通文章 Delphi编程创建和删除文件夹 
 普通文章 Delphi编程调用指定的Windows程序.. 
最新文章 最新推荐文章 热门文章
 普通文章 简历封面 
 普通文章 简历封皮(二) 
 推荐文章 用好Windows共享 确保安全 
 推荐文章 多点出发:消除局域网遗留共享痕迹.. 
 普通文章 只需三步!闪盘立刻变成启动盘 
 普通文章 战无不胜 一目了然看穿局域网 
 普通文章 Win 2000/XP在局域网内批量升级 
 普通文章 黑客经常更改的系统配置文件及注册.. 
 推荐文章 用好Windows共享 确保安全 
 推荐文章 多点出发:消除局域网遗留共享痕迹.. 
 推荐文章 Ghost二十个鲜为人知的实用参数 
 推荐文章 ASP.NET程序中常用的三十三种代码.. 
 推荐文章 黑客利用Ms05002溢出找“肉鸡” 
 推荐文章 C# 3.0语言详解之基本的语言增强 .. 
 推荐文章 Ghost所有运行错误代码完全大揭秘.. 
 推荐文章 利用Java Swing 实现游戏开发 
 推荐文章 秘籍:QQ头像任意换 
 普通文章 提升QQ等级 QQ挂机升级外挂  
 普通文章 QQ100个经典个性签名!可爱经典贴图.. 
 推荐文章 BIOS设置图解教程(多图) 
 普通文章 惊现腾讯QQ刷等级漏洞 
 普通文章 求职简历封皮  
 普通文章 突破在线观看电影 
 普通文章 GIF动画图片制作教程 
点击查看更多评论
笔名:
评论:
[评论将在5分钟内被审核,请耐心等待]
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright ©2003-2005 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网  冀ICP备05002857号