请各位高手帮我解决这个问题。

解决方案 »

  1.   

    示例中,dbgrid(DBGrid1)具有一个弹出菜单,它给出两个选项:"Send to Excel" 和 "Copy".
      下面给出用到的方法:
      //注意:下面的方法必须包含 ComObj, Excel97 单元
      //----------------------------------------------------------- 
      // if toExcel = false, export dbgrid contents to the Clipboard 
      // if toExcel = true, export dbgrid to Microsoft Excel 
      procedure ExportDBGrid(toExcel: Boolean); 
      var 
        bm: TBook; 
        col, row: Integer; 
        sline: String; 
        mem: TMemo; 
        ExcelApp: Variant; 
      begin 
        Screen.Cursor := crHourglass; 
        DBGrid1.DataSource.DataSet.DisableControls; 
        bm := DBGrid1.DataSource.DataSet.GetBook; 
        DBGrid1.DataSource.DataSet.First; 
      
        // create the Excel object 
        if toExcel then 
        begin 
          ExcelApp := CreateOleObject('Excel.Application'); 
          ExcelApp.WorkBooks.Add(xlWBatWorkSheet); 
          ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Grid Data'; 
        end; 
      
        // First we send the data to a memo 
        // works faster than doing it directly to Excel 
        mem := TMemo.Create(Self); 
        mem.Visible := false; 
        mem.Parent := MainForm; 
        mem.Clear; 
        sline := ''; 
      
        // add the info for the column names 
        for col := 0 to DBGrid1.FieldCount-1 do 
          sline := sline + DBGrid1.Fields[col].DisplayLabel + #9; 
        mem.Lines.Add(sline); 
      
        // get the data into the memo 
        for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do 
        begin 
          sline := ''; 
          for col := 0 to DBGrid1.FieldCount-1 do 
            sline := sline + DBGrid1.Fields[col].AsString + #9; 
          mem.Lines.Add(sline); 
          DBGrid1.DataSource.DataSet.Next; 
        end; 
      
        // we copy the data to the clipboard 
        mem.SelectAll; 
        mem.CopyToClipboard; 
      
        // if needed, send it to Excel 
        // if not, we already have it in the clipboard 
        if toExcel then 
        begin 
          ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste; 
          ExcelApp.Visible := true; 
        end; 
      
        FreeAndNil(mem); 
      //  FreeAndNil(ExcelApp); 
        DBGrid1.DataSource.DataSet.GotoBook(bm); 
        DBGrid1.DataSource.DataSet.FreeBook(bm); 
        DBGrid1.DataSource.DataSet.EnableControls; 
        Screen.Cursor := crDefault; 
      end; 
      

  2.   

    DBGRID中的数据导出到EXCEL中:procedure TForm_gchhs.toexcel(grid:tdbgrid;qu:tdataset);
    var
    eclApp,WorkBook:Variant;
    xlsFileName:string;
       L: Integer;
     s, lang:string;
     i,j:integer;
     jj:integer;
     xssz:array [0..100] of integer;
     xssm:array [0..100] of string;
     k:integer;
     kk:integer;
    beginif form_gchhs.s.Execute then
    begin
    xlsFileName:= form_gchhs.s.FileName;
    try
    //创建OLE对象Excel Application与 WorkBook
     eclApp:=CreateOLEObject('Excel.Application');
     WorkBook:=CreateOLEObject('Excel.Sheet');
     except
    ShowMessage('您的机器里未安装Microsoft Excel。');
    Exit;
    end;
    for i:=0 to 100 do
    begin
    xssz[i]:=0;
    xssm[i]:='';
    end;
    k:=-1;
    l:=1;
    workBook:=eclApp.workBooks.Add;
    for i:=0 to grid.Columns.Count -1 do
    begin
     if grid.Columns[i].visible=true then
     begin
     k:=k+1;
     xssz[k]:=i;
     for kk:=0 to qu.FieldCount -1 do
     begin
     if qu.Fields[kk].fieldname=grid.columns[i].fieldname then
     xssz[k]:=kk;
     end;
     xssm[k]:=grid.columns[i].title.caption;
     eclApp.Cells(l , k+1):=xssm[k];
     end;
    end;
    with qu do
    begin
     first;
     while not qu.eof do
      begin
       l:=l+1;
        for j:=0 to k do
        eclApp.Cells(l , j+1):=fields[xssz[j]].AsString;
       qu.next;
      end;
    end;
    WorkBook.saveas(xlsFileName);
    WorkBook.Close;
    eclApp.Quit;
    //退出Excel Application
    //释放VARIANT变量
    //eclApp:=Unassigned;
    ShowMessage('文件已保存!');
    end;
    end;