正确的DBGrid导出到EXCEL

网上有很多DBGridToExcel代码都是数据表转EXCEL,连DBGrid的标题栏都没保存进去

这段代码是摘自CSDN大神(zpc198600)代码的修改版,增加了序号(字段不在数据表里)显示

procedure DBGridToExcel(dbGrid: TDBGrid);          // 这才是正确的DBGrid转EXCEL方式,而不是数据表转Excel
var
  excelapp: Variant;
  page: Variant;
  i, j: Integer;
  savedialog: TSaveDialog;
  BM: TBookmark;
  strsavefile: string;
begin
  if dbGrid.DataSource.DataSet.IsEmpty then //判断TDBGRID是否有数据
  begin
    MessageBox(Application.Handle, '数据为空不能进行保存', '警告', MB_OK);
    Abort;
    Exit;
  end;
  savedialog := TSaveDialog.Create(nil); // 创建一个保存对话框
  savedialog.Filter:= 'Microsoft Excel 2007(*.xlsx)|*.xlsx|Microsoft Excel 97-2003(*.xls)|*.xls';  //设置保存文件的扩展名
  savedialog.DefaultExt := '.xlsx';
  savedialog.Execute;                  //打开保存对话框
  strsavefile := savedialog.FileName;    //保存文件的目录

  if Length(strsavefile) = 0 then
    Exit;  //目录为空则退出程序
  try
//     Screen.Cursor:=crhourglass; //屏幕指针形状
    try
      excelapp := CreateOleObject('excel.application');
      excelapp.workbooks.add(-4167); //设置添加数据的大小
      excelapp.workbooks[1].worksheets[1].name := '数据库数据'; //标签页名称
      page := excelapp.workbooks[1].worksheets['数据库数据'];  //指定标签页
      j := 1;
    except
      MessageBox(GetActiveWindow, '请确认是否安装了EXCEL', '提示', MB_OK + MB_ICONINFORMATION);
      Exit;
    end;
    with dbGrid.DataSource.DataSet do
    begin
      BM := GetBookmark;
      DisableControls;
       //将DBGRID中的标题插入到EXCEL表中首行
      for i := 0 to dbGrid.Columns.Count - 1 do
      begin
        if dbGrid.Columns[1].Visible = False then
          Continue;
        page.cells[j, i + 1] := dbGrid.Columns[i].Title.Caption;
        page.cells[j, i + 1].font.bold := True;
      end;
      Inc(j);  //ECXEL表中的下一行
      First;
      while not Eof do
      begin
        page.cells[j, 1] := inttostr(j - 1);                   // 自己增加的序号
        for i := 1 to dbGrid.Columns.Count - 1 do   // 循环从0改成1开始,跳过序号列(第一列是序号)
        begin
          if dbGrid.Columns[i].Visible = False then
            Continue;
           //将指定行添加到EXCEL表中
          page.cells[j, i + 1] := Trim(dbGrid.DataSource.DataSet.fieldbyname(dbGrid.Columns[i].FieldName).AsString);
        end;
        Inc(j);   //EXCEL表中下一行
        Next;     //TDBGrid表中下一行
      end;
      GotoBookmark(BM);
      FreeBookmark(BM);
      EnableControls;
    end;
    excelapp.activeworkbook.saveas(strsavefile);  //将EXCEL表保存到指定目录下
    Application.ProcessMessages;
    excelapp.application.quit;
  finally
    savedialog.Free;
    Screen.Cursor := crDefault;
  end;
end;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在他人的DBGridEh导出Excel的基础上进行改进,增加功能如下: 1、支持多个DBGridEH同时导出Excel的不同Sheet页 2、进度条与数据进度保持一致 3、增加了进度百分比显示 //调用方法: procedure TForm1.Button1Click(Sender: TObject); var DbOut: TDBGridEhToExcel; i: integer; begin try DbOut := TDBGridEhToExcel.Create(Self); for i := 0 to 9 do //初始化数组 begin DbOut.DBGridEhRecAry[i].TempDBGridEh := nil; DbOut.DBGridEhRecAry[i].TitleName := ''; DbOut.DBGridEhRecAry[i].SheetTabName := ''; end; //有多少个DBGridEh的数据要导出,此处表示两个 DbOut.DBGridEhRecLength := 2; //统计结果一 DbOut.DBGridEhRecAry[0].TempDBGridEh := dbgSpotCheckCount; DbOut.DBGridEhRecAry[0].TitleName := '统计结果一'; DbOut.DBGridEhRecAry[0].SheetTabName := '统计结果一'; //统计结果二 DbOut.DBGridEhRecAry[1].TempDBGridEh := dbgValuationCount; DbOut.DBGridEhRecAry[1].TitleName := '统计结果二'; DbOut.DBGridEhRecAry[1].SheetTabName := '统计结果二'; DbOut.TitleName := '统计结果'; DbOut.ShowProgress := True; DbOut.ShowOpenExcel := True; DbOut.ExportToExcel; finally FreeAndNil(DbOut); end; end; 还可以改进的地方,比如: 1、标题栏占用几行,字体,字体颜色,字体大小,背景颜色可以封装提供设置方法; 2、字段标题字体,字体颜色,字体大小; 3、表格样式设置; 就是动态数据不会封装到类里面,如果有高人封装得更好一些,请发一份我;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值