大家好,
用ADOquery ADOconection ,Datasource 连接的SQLSERVER2000 数据库 怎样将DBGrid中显示的数据保存为EXCEL 或WORD文件
谢谢  

解决方案 »

  1.   

    我给你一个我自己写的组件 下载地址:http://www.susuo.com/bbs.official/UpFile/UpAttachment/2006-12/20061221155715.rar,
    属性:DataSet 是连接数据集来源
    属性:Sqlstring 是连接Dataset执行的SQL语句
    属性:Active执行查询
    属性:pringting 导出打印!  
      

  2.   

    或者你见这个帖子:http://community.csdn.net/Expert/topic/5239/5239149.xml?temp=.8936579
      

  3.   

    To:winxkm(蹩脚的程序员)
    非常感谢, 我还没编写过组件,下载了您编写的组件,然后在unit 中 uses PrintSQL_Data,之后
     var
    ..
    MyPrintSQL_Data: TPrintSQL_Data;
    implementation
    {$R *.dfm}procedure TForm7.FormCreate(Sender: TObject);
    begin
    MyPrintSQL_Data:=TPrintSQL_Data.end;
    此时 出现了 
    [Fatal Error]Unit7.pas[7]: File not found:'PrintSQL_Data.dcu'
    找不到dcu 文件
    我原来没有引用过自定义的组件,也是新手,不知道怎样将这个printSQL_Data 组件生成 .dcu 文件 ,是不是需要做个位图,将组件安装上 才能使用,恳请您的指点
      

  4.   

    这样的,这个组件可能使用了第三方控件,你打开这个pas文件,删除如下代码:
    uses
      SysUtils, Classes,Messages, Variants, Graphics, Controls, Forms,
      Dialogs,windows,ADODB,ComObj,Excel2000,RzPrgres(这个引用去掉,这是第三方的进度条控件);procedure PrintSqlDataToExcel; overload;
    procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;
    这两个方法一个是带进度条的。把下面第2个带进度条参数的方法删除,或者改进一下。上面是没有进度条显示的!加载这个组件,你可以通过delphi的component->install component:
    在unit file name 编辑框中通过右边的“Browse”选择PrintSQL_Data.pas文件。然后点击“OK”弹出一个界面。然后点击“compile”就可以了
      

  5.   

    在你的控件面板上会出现一个新的控件页 在最后一个,你就能找到这个组件
    对于带进度条的导出数据方法,我这里帮你改进一下!
    第一步,在users里面加上引用单元comctrls,
    第二步, 将在public里的方法
    procedure PrintSqlDataToExcel(PB:TRzProgressBar); overload;
    改为:procedure PrintSqlDataToExcel(PB:TProgressBar); overload;代码改为:
    procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);
    var
      I:integer;
      Range,ExcelApp,V:variant;
    begin
        Try
          ExcelApp:=CreateOleObject('Excel.application');
          PB.PartsComplete:=0;
        Except
          MessageDlg('没有安装Office 办公软件Excel!',mtinformation,[MBOK],0);
          exit;
        End;    try
        ExcelApp.WorkBooks.add(Null);
        V:=ExcelApp.WorkBooks[1].WorkSheets[1];    //*开始设计标题*/
        Range:=V.Range['A1',GetExcelCoulmnCaption(DataSet.Fields.Count)+'1'];
        Range.MergeCells:=true;
        Range.RowHeight:=24;
        Range.HoriZontalAlignMent:=xlCenter;
        Range.VerticalAlignMent:=xlCenter;
        Range.Font.Name:='新宋体';
        Range.Font.size:=16;
        Range.Font.FontStyle:='加粗';
        Range.Value:=FExcelTitle;
        Range.Borders.LineStyle:=xlContinuous;  //边框
        Range.Borders.Weight:=xlThin;
        Range.Borders.ColorIndex:=xlAutomatic;    //显示标题
         For i:=0 To DataSet.Fields.Count-1 Do
         begin
           Range:=V.Range[GetExcelCoulmnCaption(I+1)+'2',GetExcelCoulmnCaption(I+1)+'2'];
           Range.RowHeight:=24;
           Range.HoriZontalAlignMent:=xlCenter;
           Range.VerticalAlignMent:=xlCenter;
           Range.Font.Name:='新宋体';
           Range.Font.size:=9;
           Range.Font.FontStyle:='加粗';
           Range.Columns.AutoFit;
           Range.Value:=DataSet.Fields[I].FieldName;
           Range.Borders.LineStyle:=xlContinuous;  //边框
           Range.Borders.Weight:=xlThin;
           Range.Borders.ColorIndex:=xlAutomatic;
         end;
         //显示内容
         //set
          Range:=V.Range['A3',GetExcelCoulmnCaption(DataSet.FieldCount)+IntToStr(DataSet.recordcount+2)];
          Range.NumberFormatLocal:= '@';
          Range.RowHeight:=20;
          Range.HoriZontalAlignMent:=xlCenter;
          Range.VerticalAlignMent:=xlCenter;
          Range.Borders.LineStyle:=xlContinuous;  //边框
          Range.Borders.Weight:=xlThin;
          Range.Borders.ColorIndex:=xlAutomatic;
          Range.Font.Name:='新宋体';
          Range.Font.size:=9;
          Range.Columns.AutoFit;     PB.Max:=DataSet.RecordCount;
         PB.Step:=1;
         PB.Position:=0;
         DataSet.First;
         While (Not DataSet.Eof) do
         begin
            For i:=0 To DataSet.Fields.Count-1 Do
            begin
                 Range:=V.Range[GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2),GetExcelCoulmnCaption(I+1)+IntToStr(DataSet.RecNo+2)];
                 if  DataSet.Fields[I].IsNull then
                 Range.Value:=' '
                 else
                 Range.Value:=DataSet.Fields[I].AsString;
                 Range.Borders.LineStyle:=xlContinuous;  //边框
                 Range.Borders.Weight:=xlThin;
                 Range.Borders.ColorIndex:=xlAutomatic;
            end;
            PB.StepIt;
            DataSet.next;
         end;    //显示Excel文档界面
        ExcelApp.visible:=true;
        V.Activate;
        finally
           //释放接口对象
            ExcelApp:=unassigned;
            V:= unassigned;
            Range:=unassigned;
            PB.Position:=0;
        end;
    end;
      

  6.   

    太感谢
    过程 procedure TPrintSQL_Data.PrintSqlDataToExcel(PB: TProgressBar);
    不是不只该改了参数:TRzProgressBar->TProgressBar,逐个看了每条语句发现过程体没有改动,
    还有一个问题就是我用的是ADOquery来连接的数据库,对用这个组件德使用没有影响吧?看到数据集是dataset 
      

  7.   

    你要注意看,PB的使用有了改变!主要看PB这个进度条的代码,其它的没变!
      

  8.   

    这方面的帖子有不少.
    基本思想就是从DBGrid中读一个单元格的值然后马上写到excel的一个单元格中去,就这样继续
      

  9.   

    TO: winkxm ,
    好几天没有到CSDN上来,非常感谢winkxm,:),现在都成朋友了,很耐心的帮我解决了问题,一步一步地 教会了我如何使用自定义的组件, 用 PrintSQL_data 组件终于实现了将DBgrid中的数据 保存到EXCEl中去。
      

  10.   

    呵呵,是啊winkxm人相当的不错,也帮我解决过问题还有,我有导出为xls的函数,你要不?
    要就加我的qq5895482
    我也是新人,一起探讨呵呵。。
      

  11.   

    调用这个函数,我在OFFICE2007下也试过,没问题:
    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;
      XLApp.SheetsInNewWorkbook := High(Args) + 1;  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;
        XlApp.Visible := True;
      end;
      Screen.Cursor := crDefault;
    end;使用例子:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      try
        CopyDbDataToExcel([DBGrid1]);
      except
        MessageBox(handle, '导出到Excel失败!', '错误', MB_OK);
      end;
    end;
      

  12.   

    To :fankie_240 , 很好兴认识你 ,如果能共享 学习:你的导入为XLS 函数,真是是有幸 好的 我的QQ是32559972 ,共同 学习,进步 共勉To:gyf2000 ,十分感谢啊 。。
    CSDN上高手多,还都很好。谢谢