如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题

anyy123820

anyy123820

2016-02-19 19:35

下面,图老师小编带您去了解一下如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题,生活就是不断的发现新事物,get新技能~
 

  http://dev.csdn.net/article/53/53442.shtm
  如何将几个DBGRID里的内容导入同一个EXCEL表中?
  在软件实际制作中,为节省开发成本和开发周期,一些软件人员通常会吧DBGrid中的数据直接导出到Excel表中,而先前能看到的函数仅仅只能在WorkBook的一个Sheet中导入数据,不支持多Sheet!。

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  

  单元应用:
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ActiveX, ComObj,
  Excel2000, OleServer;

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  procedure CopyDbDataToExcel(Args: array of const);
  var
    iCount, jCount: Integer;
    XLApp: Variant;
    Sheet: Variant;
    I: Integer;
  begin
    Screen.Cursor := crHourGlass;
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      VarClear(XLApp);
    end;

    try
      XLApp := CreateOleObject(‘Excel.Application‘);
    except
      Screen.Cursor := crDefault;
    Exit;
    end;

    XLApp.WorkBooks.Add;//  (1)
    XLApp.SheetsInNewWorkbook := High(Args) + 1;//  (2)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    XLApp.SheetsInNewWorkbook := High(Args) + 1;
    XLApp.WorkBooks.Add; 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    for I := Low(Args) to High(Args) do
    begin
      XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrid(Args[I].VObject).Name;
      Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];

      if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then
      begin
        Screen.Cursor := crDefault;
        Exit;
      end;

      TDBGrid(Args[I].VObject).DataSource.DataSet.first;
      for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
        Sheet.Cells[1, iCount + 1] := TDBGrid(Args[I].VObject).Columns.Items[iCount].Title.Caption;

      jCount := 1;
      while not TDBGrid(Args[I].VObject).DataSource.DataSet.Eof do
      begin
        for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
          Sheet.Cells[jCount + 1, iCount + 1] := TDBGrid(Args[I].VObject).Columns.Items[iCount].Field.AsString;

        Inc(jCount);
        TDBGrid(Args[I].VObject).DataSource.DataSet.Next;
      end;
    end;

    XlApp.Visible := True;
    Screen.Cursor := crDefault;
  end;
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  经过测试,上面这段代码确实有问题:(有兴趣的朋友可以自己测试一下)

  比如:
  先form1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid3]);//OK
  再form1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid,dbgrid4]);//这样就出错,提示:无效索引

  如果这样:
  先form1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid3,dbgrid4]);//OK
  再form1.CopyDbDataToExcel([dbgrid1,dbgrid2]);//OK

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  总之:先少后多,就出错...
  原因就出在上面代码(1),(2)两段上,经过测试,正确的应该将(1),(2)代码对调,才能保证不出错....
  

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题

编程语言 网络编程
如何将几个DBGRID里的内容导入同一个EXCEL表中....的问题

如何将Excel中多个不相邻区域的数据都打印在同一个页面上

电脑入门
如何将Excel中多个不相邻区域的数据都打印在同一个页面上

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Excel中如何换行在同一个单元格内实现长内容的多行录入

软件教程 excel
Excel中如何换行在同一个单元格内实现长内容的多行录入

同一个帐号不能同时登陆的问题

Web开发
同一个帐号不能同时登陆的问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

合并同一个工作薄中的其余的所有的工作表

电脑入门
合并同一个工作薄中的其余的所有的工作表

如何将Excel数据导入Access

编程语言 网络编程
如何将Excel数据导入Access

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

5秒后弹窗的javascript代码

5秒后弹窗的javascript代码

在SQL Server 2005中如何列出所有存储过程

在SQL Server 2005中如何列出所有存储过程
下拉加载更多内容 ↓