CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样将表(TABLE)和dbgrid的数据保存为EXCEL文件

楼主Num1(地平线)2001-10-18 10:04:50 在 Delphi / VCL组件开发及应用 提问

怎样将表(TABLE)和dbgrid的数据保存为EXCEL文件 问题点数:50、回复次数:5Top

1 楼cobi(我是小新)回复于 2001-10-18 10:18:13 得分 0

利用ole技术把数据导入excel中Top

2 楼cobi(我是小新)回复于 2001-10-18 10:21:36 得分 30

这是程序员大本营2001里面一位高人dogbear2000写的代码,参考以下吧  
   
  单元:uExcelTools  
  作者:     Bear  
  功能:保存数据集,如TTable,TQuery,TClientDataSet等为Excel文件,  
                      包含标题,可以只将一部分字段导出  
                      这一点通过设置DataSet中要不导出字段的Tag值大于某一个值来处理  
  原理:调用   Microsoft   Excel   Ole对象  
  调用方式:    
                                  Function   DataSetToExcel(  
                                          DataSet:TDataSet;FieldTagMax:Integer;  
                                              Visible:Boolean;ExcelFileName:String=''):   Boolean;  
  --------------------------------------------------------------------------------------------------}  
   
  unit   UExcelTools;  
   
  interface  
   
  uses  
      classes,   comctrls,   stdctrls,   windows,   Dialogs,   controls,   SysUtils,  
      Db,forms,DBClient,ComObj;  
   
  //把数据集导入ExcelSheet的核心函数  
  function   DataSetToExcelSheet  
                          (  
                          DataSet         :TDataSet;  
                          FieldTagMax   :Integer;     //   字段的Tag值如果大于这个值,就不导出到Excel  
                          Sheet             :OleVariant  
                          ):   Boolean;  
   
  //实际使用的函数,内部调用了DataSetToExcelSheet,在外面加入UI接口和错误处理  
  function   DataSetToExcel  
                          (  
                          DataSet         :TDataSet;     //   要转换的数据集  
                          FieldTagMax   :Integer;     //   字段的Tag值如果大于这个值,就不导出到Excel  
                          Visible         :Boolean;             //   是否让做转换工作的Excel可见  
                          ExcelFileName:String=''   //   Excel文件名,*.xls  
                          ):   Boolean;  
   
  implementation  
   
  Function   DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant):   Boolean;  
  var  
      Row,Col,FieldIndex   :Integer;  
      BK:TBookMark;  
  begin  
      Result   :=   False;  
      if   not   Dataset.Active   then   exit;  
      BK:=DataSet.GetBookMark;  
      DataSet.DisableControls;  
   
      Sheet.Activate;  
      try  
   
          //   列标题  
          Row:=1;  
          Col:=1;  
          for   FieldIndex:=0   to   DataSet.FieldCount-1   do  
                  begin  
                  if   DataSet.Fields[FieldIndex].Tag   <=   FieldTagMax   then  
                          begin  
                          Sheet.Cells(Row,Col)     :=DataSet.Fields[FieldIndex].DisplayLabel;  
                          Inc(Col);  
                          end;  
                  end;  
          //   表内容  
          DataSet.First;  
          while   Not   DataSet.Eof   do  
                  begin  
                  Row:=Row+1;  
                  Col:=1;  
                  for   FieldIndex:=0   to   DataSet.FieldCount-1   do  
                          begin  
                          if   DataSet.Fields[FieldIndex].Tag   <=   FieldTagMax   then  
                              begin  
                              Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;  
                              Inc(Col);  
                              end;  
                          end;  
                  DataSet.Next;  
                  end;  
   
          Result   :=   True;  
          finally  
              DataSet.GotoBookMark(BK);  
              DataSet.EnableControls;  
          end;  
   
   
  end;  
  Function   DataSetToExcel(  
                                      DataSet:TDataSet;FieldTagMax:Integer;  
                                      Visible:Boolean;ExcelFileName:String=''):   Boolean;  
  var  
      ExcelObj,   Excel,   WorkBook,   Sheet:   OleVariant;  
          OldCursor:TCursor;  
      SaveDialog:TSaveDialog;  
  begin  
      Result   :=   False;  
      if   not   Dataset.Active   then   exit;  
   
      OldCursor:=Screen.Cursor;  
      Screen.Cursor:=crHourGlass;  
   
      try  
              ExcelObj   :=   CreateOleObject('Excel.Sheet');  
              Excel   :=   ExcelObj.Application;  
              Excel.Visible   :=   Visible   ;  
              WorkBook   :=   Excel.Workbooks.Add   ;  
              Sheet:=   WorkBook.Sheets[1];  
      except  
              MessageBox(GetActiveWindow,'无法调用Mircorsoft   Excel!   '+chr(13)+chr(10)+  
                                          '请检查是否安装了Mircorsoft   Excel。','提示',MB_OK+MB_ICONINFORMATION);  
              Screen.Cursor:=OldCursor;  
              Exit;  
      end;  
   
      Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet)   ;  
      if   Result   then  
              if   Not   Visible   then  
                  begin  
                  if   ExcelFileName<>''  
                          then   WorkBook.SaveAs(FileName:=ExcelFileName)  
                          else   begin  
                                  SaveDialog:=TSaveDialog.Create(Nil);  
                                  SaveDialog.Filter   :=   'Microsoft   Excel   文件&brvbar;*.xls';  
                                  Result:=SaveDialog.Execute;  
                                  UpdateWindow(GetActiveWindow);  
                                  if   Result   then  
                                          WorkBook.SaveAs(FileName:=SaveDialog.FileName);  
                                  SaveDialog.Free;  
                                  end;  
                  Excel.Quit;  
                  end;  
      Screen.Cursor:=OldCursor;  
  end;  
   
  如果要结合dbgrid的话,则在导出数据的时候首先检查记录是否在dbgrid中被选择,如果是,则导出,代码如下:  
                if   DBGrid1.SelectedRows.CurrentRowSelected   then  
                  begin  
                      //导出代码  
                  end;  
   
  Top

3 楼atang(阿汤)回复于 2001-10-18 10:27:06 得分 20

如果你只需要数据不用设置EXCEL格式的话,可转换为CSV文件格式,用EXCEL打开同样好用。下面是实现该功能的通用程序:    
  procedure   button1.click(sender);  
  var  
  i,j:   integer;    
  s:   string;    
  theStringList:   Tstringlist;    
   
  begin  
  s:='';  
  theStringList:=TStringList.Create;  
  with   tableName   do  
  begin  
  try  
      Active:=True;  
  except  
      showmessage('不能打开   '+   Name);  
  end;  
  for   j:=0   to   (RecordCount-1)   do  
  begin  
  s:='';  
  for   i:=1   to   (FieldCount-1)   do  
  begin  
  s:=s+(Fields[i].AsString)+',';  
  end;    
  theStringList.add(s);  
  Next;  
  end;    
  theStringList.savetofile  
  (Name+'.csv');    
  Showmessage(Name+   '成功导出');  
  close;  
  end;    
  end;   Top

4 楼Focus(西门大灌人)回复于 2001-10-18 10:28:47 得分 0

GZTop

5 楼hymen1(小满)回复于 2001-10-18 10:50:25 得分 0

很好。Top

相关问题

  • 如何将dbgrid的内容保存到word 或excel文挡
  • excel保存问题
  • excel保存问题
  • Excel保存 (在线等**** )
  • 关于Excel保存问题?
  • DBGRID的栏目顺序如何保存
  • DBgrid如何导出保存为Access表?
  • 如何保存为Excel格式
  • 保存网页为excel文件
  • excel保存为文本的问题

关键词

  • 数据
  • 文件
  • 字段
  • excel
  • 代码
  • 导出
  • thestringlist
  • savedialog
  • dbgrid
  • 保存

得分解答快速导航

  • 帖主:Num1
  • cobi
  • atang

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo