http://dev.csdn.net/article/53/53442.shtm
如何將幾個(gè)DBGRID里的內(nèi)容導(dǎo)入同一個(gè)Excel表中?
在軟件實(shí)際制作中,為節(jié)省開(kāi)發(fā)成本和開(kāi)發(fā)周期,一些軟件人員通常會(huì)吧DBGrid中的數(shù)據(jù)直接導(dǎo)出到Excel表中,而先前能看到的函數(shù)僅僅只能在WorkBook的一個(gè)Sheet中導(dǎo)入數(shù)據(jù),不支持多Sheet!。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
單元應(yīng)用:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ActiveX, ComObj,
Excel2000, OleServer;
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;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
經(jīng)過(guò)測(cè)試,上面這段代碼確實(shí)有問(wèn)題:(有興趣的朋友可以自己測(cè)試一下)
比如:
先f(wàn)orm1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid3]);//OK
再form1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid,dbgrid4]);//這樣就出錯(cuò),提示:無(wú)效索引
如果這樣:
先f(wàn)orm1.CopyDbDataToExcel([dbgrid1,dbgrid2,dbgrid3,dbgrid4]);//OK
再form1.CopyDbDataToExcel([dbgrid1,dbgrid2]);//OK
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
總之:先少后多,就出錯(cuò)...
原因就出在上面代碼(1),(2)兩段上,經(jīng)過(guò)測(cè)試,正確的應(yīng)該將(1),(2)代碼對(duì)調(diào),才能保證不出錯(cuò)....
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注