有一个控件能半你,如果要的话我可以发给你的,该控件功能强大,几乎可以导出任何类型的Desktop类型数据库

解决方案 »

  1.   

    求之不得啊,谢谢!
    E-MAIL:[email protected]
      

  2.   

    给你一段代码:
    uses excel97,comobj;
    ....procedure tmainform.useexcel(frm:tform;rdt:tdataset);
    var
     xlsapp,xlssheet:variant;
     i,j:integer;
    begin
     try
      if varisempty(xlsapp) then
       xlsapp:=createoleobject('excel.application');
      xlsapp.workbooks.add;
      xlssheet:=xlsapp.worksheets['sheet1'];
     except
      application.MessageBox('不能打EXCEL',pchar('警告'),mb_ok);
      abort;
     end;
     for j:=0 to rdt.FieldCount-1 do
     begin
      xlssheet.cells[2,j+1]:=rdt.Fields[j].FieldName;
     end;
     with rdt do
     begin
      first;
      for i:=0 to recordcount-1 do
      begin
       for j:=0 to fieldcount-1 do
       begin
        xlssheet.cells[i+3,j+1]:=fields[j].AsString;
       end;
       next;
      end;
     end;
     xlsapp.visible:=true;
    end;
      

  3.   

    {
    把数据集保存为Excel格式的一个实现经常看到有人问如何把Delphi中的数据集导入Excel中,这里提供了一个实现。
    在做项目时,很多情况下,客户需要对程序中数据集再加工,再利用,如报表。
    这时,就需要把DataSet导入到一个客户比较熟悉的格式中去。Excel是首选了。该程序在Delphi4,5下编译通过,已被用在多个项目中。还被集成在笔者所写的一个小组件TDBNavigateButton中
    }
    {-------------------------------------------------------------------------------------------------
    单元:uExcelTools
    作者:  Bear
    功能:保存数据集,如TTable,TQuery,TClientDataSet等为Excel文件,
              包含标题,可以只将一部分字段导出
               这一点通过设置DataSet中要不导出字段的Tag值大于某一个值来处理
    原理:调用 Microsoft Excel Ole对象
    调用方式: 
                     Function DataSetToExcel(
                         DataSet:TDataSet;FieldTagMax:Integer;
                          Visible:Boolean;ExcelFileName:String=''): Boolean;
    --------------------------------------------------------------------------------------------------}unit UExcelTools;interfaceuses
      classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
      Db,forms,DBClient,ComObj;//把数据集导入ExcelSheet的核心函数
    function DataSetToExcelSheet
                (
                 DataSet     :TDataSet;
                 FieldTagMax :Integer;   // 字段的Tag值如果大于这个值,就不导出到Excel
                 Sheet       :OleVariant
                 ): Boolean;//实际使用的函数,内部调用了DataSetToExcelSheet,在外面加入UI接口和错误处理
    function DataSetToExcel
                (
                 DataSet     :TDataSet;   // 要转换的数据集
                 FieldTagMax :Integer;  // 字段的Tag值如果大于这个值,就不导出到Excel
                 Visible     :Boolean;      // 是否让做转换工作的Excel可见
                 ExcelFileName:String='' // Excel文件名,*.xls
                 ): Boolean;implementationFunction DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
    var
       Row,Col,FieldIndex :Integer;
       BK:TBookMark;
    begin
       Result := False;
       if not Dataset.Active then exit;
       BK:=DataSet.GetBookMark;
       DataSet.DisableControls;   Sheet.Activate;
       try     // 列标题
         Row:=1;
         Col:=1;
         for FieldIndex:=0 to DataSet.FieldCount-1 do
             begin
             if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
                begin
                Sheet.Cells(Row,Col)  :=DataSet.Fields[FieldIndex].DisplayLabel;
                Inc(Col);
                end;
             end;
         // 表内容
         DataSet.First;
         while Not DataSet.Eof do
            begin
            Row:=Row+1;
            Col:=1;
            for FieldIndex:=0 to DataSet.FieldCount-1 do
                begin
                if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
                   begin
                   Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;
                   Inc(Col);
                   end;
                end;
            DataSet.Next;
            end;     Result := True;
         finally
           DataSet.GotoBookMark(BK);
           DataSet.EnableControls;
        end; 
    end;
    Function DataSetToExcel(
                      DataSet:TDataSet;FieldTagMax:Integer;
                      Visible:Boolean;ExcelFileName:String=''): Boolean;
    var
       ExcelObj, Excel, WorkBook, Sheet: OleVariant;
        OldCursor:TCursor;
       SaveDialog:TSaveDialog;
    begin
       Result := False;
       if not Dataset.Active then exit;   OldCursor:=Screen.Cursor;
       Screen.Cursor:=crHourGlass;   try
          ExcelObj := CreateOleObject('Excel.Sheet');
          Excel := ExcelObj.Application;
          Excel.Visible := Visible ;
          WorkBook := Excel.Workbooks.Add ;
          Sheet:= WorkBook.Sheets[1];
       except
          MessageBox(GetActiveWindow,'无法调用Mircorsoft Excel! '+chr(13)+chr(10)+
                        '请检查是否安装了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
          Screen.Cursor:=OldCursor;
          Exit;
       end;   Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
       if Result then
          if Not Visible then
             begin
             if ExcelFileName<>''
                then WorkBook.SaveAs(FileName:=ExcelFileName)
                else begin
                     SaveDialog:=TSaveDialog.Create(Nil);
                     SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
                     Result:=SaveDialog.Execute;
                     UpdateWindow(GetActiveWindow);
                     if Result then
                        WorkBook.SaveAs(FileName:=SaveDialog.FileName);
                     SaveDialog.Free;
                     end;
             Excel.Quit;
             end;
       Screen.Cursor:=OldCursor;
    end; end. 
      

  4.   

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,execl97,oleserver,comobj;//加上comobj
     
    .
    .略
    .
    public  procedure DBtoexcel(tb:tdataset);//加上
     
    {$R *.DFM}
     
    procedure Form1.DBtoexel(tb:tdataset);
    var
      i,j,f:integer;
      v,st:variant;
    begin
      if tb.active=false then
      begin
        showmessage(tb.name+'表没有打开!');
        exit;
      end;
      v:=createoleobject('excel.application');
      v.visible:=true;
      v.workbooks.add('c:\temp\share.xls');//当()为空时新建文件
      st:=v.workbooks[1].worksheets[1];
      i:=2;j:=0;f:=1;
    //读字段名
      for j:=0 to tb.fieldcount-1 do
      begin
        if tb.fields[j].visible=true then
        begin
          st.cells[i,f]:=tb.fields[j].displaylabel;
          f:=f+1;
        end;
      end;
    //读记录
      i:=i+1;
      tb.first;
      while not tb.eof do
      begin
        f:=1;
        for j:=0 to tb.fieldcount-1 do
        begin
          if tb.fields[j].visible=true then
          begin
            st.cells[i,f]:=tb.fields[j].text;
            f:=f+1;
          end;
        end;
        i:=i+1;
        tb.next;
      end;
    end;
     
    然后在按钮下的单击事件中加入:
        dbtoexcel(table1);
      

  5.   

    procedure TForm1.Button3Click(Sender: TObject);
    var
      m:integer;
      n:integer;
      temp_worksheet:_worksheet;
    begin
    if  not query1.Active then
        showmessage('没有数据')
    elsebegin
      form1.OpenDialog1.Execute;
      form1.ExcelApplication1.Connect;
      form1.ExcelApplication1.Visible[0]:=true;
        excelworkbook1.ConnectTo(excelapplication1.workbooks.add(emptyparam,0));
        temp_worksheet:=excelworkbook1.Worksheets.add(emptyparam,emptyparam,emptyparam,emptyparam,0) as _worksheet;
        excelworksheet1.ConnectTo(temp_worksheet);begin
       query1.First;
       n:=1;
      while not query1.Eof do
       begin
       for m:=1 to form1.DBGrid1.Columns.Count
          do
              begin
             form1.ExcelWorksheet1.Cells.Item[n+1,m]:=form1.DBGrid1.DataSource.DataSet.Fields[m-1].AsString;
              end;
              n:=n+1;
              query1.Next;
       end;
    end;
    form1.ExcelWorkbook1.Disconnect;
    //showmessage('完毕);
    //form1.SaveDialog1.Free;
    form1.DBGrid1.Free;end;
    end;
       谢谢大家,我已经解决问题了,但是---
       为什么我用这上面的程序会让EXECL死掉???(我自己写的)
    高手指教!
      

  6.   

    icd(骆驼):请问如何处理保存时重文件名的问题?我用你的代码试了下,发现了这个问题