首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
首页 | JAVA | C# | VB | VB.NET | C/C++ | delphi | 工程管理 | 其他语言 | 论坛
免费注册一站通帐号,参与直播、论坛、下载、博客、网摘、评论,展现我的风采!
您现在的位置: 中国IT实验室 >> 桌面开发 >> Delphi >> 文章正文
Delphi编程将数据库数据快速导入Excel
来源:中国IT实验室整理  时间:2007-4-5

  在开发数据库应用程序中,经常要将类型相同的数据导出来,放到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中通过测试!
【责编:Lili】

中国IT教育热线咨询

相关文章
Delphi初学者应小心的六大陷阱
基于Delphi的异常处理技术探究
Delphi中用API实现在MSN的信息提示
Delphi中"包"的妙用
如何用Delphi实现子目录级的文件查询
在Delphi数据库应用程序中常见错误
如何使用Delphi实现无边界窗体的移动
如何用Delphi创建快捷方式
推荐文章
· 用C#创建COM对象
· IT管理十大失误及其对策
· VC中利用MFC设计绘图程序初步
· JAVA中对象创建和初始化过程
· C语言中的位域的使用
· 浅谈Java桌面应用程序开发
· C#的前途如何?
· 几种VC++数据库开发技术的相对比较
 精彩友情推荐
·锐捷交换机报价
·锐捷交换机
·锐捷网络网络交换机
·smc交换机
·smc交换机报价
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
最新更新 推荐文章
·Visual Basic 9.0隐式类型的局部…09-30
·JMX+J2SE5.0实现Web应用的安全管…09-30
·多线程、Socket技术及委托技术的…09-21
·Visual C#多线程参数传递浅析09-21
·浅谈Java中利用JCOM实现仿Excel编…09-21
·基于Java的界面布局DSL的设计与实…09-21
·Java开发中的事件驱动模型实例详…09-21
·并发工程原则应用到软件项目中09-06
·Delphi初学者应小心的六大陷阱09-06
·VC开发多语言界面支持的简单方法09-06
·用C#创建COM对象09-06
·用C#创建COM对象09-06
·IT管理十大失误及其对策08-30
·VC中利用MFC设计绘图程序初步08-23
·JAVA中对象创建和初始化过程08-23
·C语言中的位域的使用08-09
·浅谈Java桌面应用程序开发08-09
·C#的前途如何?08-02
·几种VC++数据库开发技术的相对比较07-12
·用Visual C#实现网络封包监视07-12
·VB.NET中的TextBox控件详解07-12
·VB.NET实现PC与掌上电脑PPC的双向通信07-05
  培训中心