DBGridEh导出Excel出现"类range的方法PasteSpecial方法无效"的错误,请问是怎么回事?这种问题如何解决?

解决方案 »

  1.   

    给你个导出函数
    procedure WriteDatasetToExcel(AQueryName: TQuery; xlsFileName: String);
    var
      EclApp,WorkBook : Variant;
      I : Integer ;
      column : Integer ;
      Row : Integer ;
      Fdate:TDateTime;
      Year, Month, Day, Hour, Min, Sec, MSec: Word;
      StrDate:String ;
      StrDate1:String ;
    Begin
      Fdate:=now ;
      DecodeDate(Fdate, Year, Month, Day);
      DecodeTime(Fdate, Hour, Min, Sec, MSec);
      StrDate:=formatdatetime('yyyy-mm-dd-hh-mm-ss',Fdate) ;
      StrDate1:=formatdatetime('yyyy/mm/dd hh:mm:ss',Fdate) ;
      Try
      Begin
        EclApp := CreateOleObject('Excel.Application');
        WorkBook:=CreateOleObject('Excel.Sheet');
      End
      Except
        MessageDlg('您的计算机上没有 Microsoft Excel!',mtWarning,[mbOK],0);
        Exit;
      end;
      try
        workBook:=EclApp.workBooks.Add ;
        row:=2;
        EclApp.Workbooks.Item[1].Activate;
        eclApp.Cells.font.colorindex:=5 ;
        EclApp.Activesheet.Cells(1,1):=xlsFileName ;
        For I := 1 To AQueryName.FieldCount Do
        EclApp.Activesheet.Cells(2,I):=AQueryName.Fields[I-1].FieldName ;
        If Not AQueryName.Active Then AQueryName.Active := True ;
        AQueryName.First ;
        While Not(AQueryName.Eof) do
        begin
          column:=1;
          for i:=1 to AQueryName.FieldCount do
            begin
              eclApp.Cells.Item[row+1,column]:=AQueryName.fields[i-1].AsString;
              column:=column+1;
            end;
          AQueryName.Next;
          row:=row+1;
        End ;
        WorkBook.saveas(xlsFileName);
        WorkBook.close;
        WorkBook:=eclApp.workBooks.Open(xlsFileName);
        if MessageDlg('xlsFileName'+'对该文件是否保存?',mtConfirmation,[mbYes, mbNo], 0) = mrYes then
        WorkBook.save
        Else
        workBook.Saved := True;
        WorkBook.Close;
        eclApp.Quit;
        eclApp:=Unassigned;
        MessageDlg('已成功保存到指定位置!',mtInformation,[mbOK],0);
      except
        MessageDlg('Excel文件保存失败!',mtWarning,[mbOK],0);
        WorkBook.close;
        eclApp.Quit; {释放VARIANT变量}
        eclApp:=Unassigned;
      end;
    end;
      

  2.   

    TO  csnight(帅得拖网速)
    你的这个导出函数不会出问题吗?
      

  3.   

    给你来段代码:
    var ExpClass:TDBGridEhExportClass;
        Ext:String;
    begin
        SaveDialog1.FileName := '';
        if SaveDialog1.Execute then
        begin
          case SaveDialog1.FilterIndex of
            1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
            2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
            3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
            4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
            5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
          else
            ExpClass := nil; Ext := '';
          end;
          if ExpClass <> nil then
          begin
            if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
               UpperCase(Ext) then
              SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
            SaveDBGridEhToExportFile(ExpClass,dbgrideh1,
                 SaveDialog1.FileName,true);
          end;
        end;
    要引用DBGridEHImpExp单元
      

  4.   

    DBGridEh有一個直接導出excel文件的函數,
    或者用一個第三方控件即可
      

  5.   

    bluekitty(一只Colorful猪) ( ) 信誉:99 
    给的函数很好用,DBGRIDEH本身有导出功能干什么要自己写函数呢?
      

  6.   

    我给你的函数肯定没问题的,直接基于数据集的代码,并且可以灵活的设置导出的格式,选择性导出字段等,用不用EHLIB都可以。你要用三方控件的函数也可以萝卜白菜,各有所爱
      

  7.   

    ExcelApp.Workbooks[1].WorkSheets[1].Range[rownum].PasteSpecial;
    是这一行有问题,我不知道这一行代码具体有什么作用.
      

  8.   

    用DBGridEh自带的SaveDBGridEhToExportFile函数没有身份证号自动转成科学计数的那种麻烦
      

  9.   

    同意liuqifeiyu(liuqi)兄,人家都帮你做好了你干嘛还要自己拼命写
      

  10.   

    格式化单元格:
    EclApp.ActiveSheet.Columns[36].NumberFormatLocal:='@';
      

  11.   

    不过DBGRIDEH自身的导出功能不能满足多行表头的问题,我重写了TDBGridEhExportAsXLS.WriteTitle函数,不过到该合并单元格的时候不会了,要是哪位有兴趣的话帮帮忙:
    http://community.csdn.net/Expert/topic/4353/4353721.xml?temp=.7865106
      

  12.   

    我明天给你DBGridEh  这个的导出代码!
    只有几句话!
      

  13.   

    SaveDBGridEhToExportFile(TdbGridEhExportAsXls,DBGridEh1,SaveDialog1.FileName,true);
    希望这段代码对你有用!
      

  14.   

    //将数据库中的文件导入到指定的excel文件中
    procedure TfrmSaleExcel.WriteExcel(Ads: TADODataSet; sName, Title: string);
    var
      //声明一个excel程序对象
      ExcelApplication1: TExcelApplication;
      //声明一个excel工作簿对象
      ExcelWorkbook1: TExcelWorkbook;
      //声明一个excel工作表对象
      ExcelWorksheet1: TExcelWorksheet;
      //定义导出的excel文件名
      filename: string;
      i, j: integer; 
    begin
      //将导出的excel文件名赋给filename变量
      filename := concat(extractfilepath(application.exename), sName, '.xls');
      try
        //创建一个excel程序对象
        ExcelApplication1 := TExcelApplication.Create(Application);
        //创建一个excel工作簿对象
        ExcelWorkbook1 := TExcelWorkbook.Create(Application);
        //创建一个声明excel工作表对象
        ExcelWorksheet1 := TExcelWorksheet.Create(Application);
        //连接excel程序对象
        ExcelApplication1.Connect;
      except
        Application.Messagebox('Excel没有安装','Hello',MB_ICONERROR + mb_Ok);
        Exit;
      end;
      try
        //在该Excel中增加一个新的工作簿
        ExcelApplication1.Workbooks.Add(EmptyParam, 0);
        //将ExcelWorkbook1对象与该空工作簿连接
        ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
        //将excelworksheet1对象与该工作簿的第一个表连接
        ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
        //取第一条数据集的记录
        Ads.First;
        //添加记录的各个字段名
        for j := 0 to Ads.Fields.Count - 1 do
        begin
          ExcelWorksheet1.Cells.item[3, j + 1] := Ads.Fields[j].DisplayLabel;
          ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10';
        end;
        //在工作表中添加数据
        for i := 4 to Ads.RecordCount + 3 do
        begin
          for j := 0 to Ads.Fields.Count - 1 do
          begin
            ExcelWorksheet1.Cells.item[i, j + 1] :=Ads.Fields[j].Asstring;
            ExcelWorksheet1.Cells.item[i, j + 1].font.size :='10';
          end;
          Ads.Next;
        end;
        //调整单元格的宽度高度
        ExcelWorksheet1.Columns.AutoFit;
        //在工作表的第一行添加标题
        ExcelWorksheet1.Cells.item[1, 2] := Title;
        ExcelWorksheet1.Cells.Item[1, 2].font.size :='14';
        //保存
        ExcelWorksheet1.SaveAs(filename);
        //显示
        Application.Messagebox(pchar('导出成功'+filename),'Hello',mb_Ok);
      finally
        //断开Excel程序对象
        ExcelApplication1.Disconnect;
        //退出Excel程序对象
        ExcelApplication1.Quit;
        //释放Excel程序对象
        ExcelApplication1.Free;
        //释放表
        ExcelWorksheet1.Free;
        //释放簿
        ExcelWorkbook1.Free;
      end;
    end;procedure TfrmSaleExcel.Button2Click(Sender: TObject);
    begin
      if (MessageDlg('导出数据?',MTWarning,[mbYes,MBNo],0)=MrYes) then
      begin
        Button2.Enabled:=False;
        //导出前关闭ADOConnection2的连接
        if ADOConnection2.Connected then
          ADOConnection2.Close;
        //调用writeexcel实现导入
        WriteExcel(ADODataSet1,'SaleForm','出仓单报表');
        Button2.Enabled:=True;
      end;
    end;
      我觉得我已经写得够明白了,我自己的代码都没这么多注释,对了,你需要在程序前面定义一下那个私有过程,代码如下。
     private
        procedure WriteExcel(Ads: TADODataSet; sName, Title: string);
      

  15.   

    DBGridEh可以直接输出Excel。你可以查看其Demo,具体代码如下
    usesDBGridEhImpExp--
    procedure TForm1.ppmSaveSelectionClick(Sender: TObject);
    var ExpClass:TDBGridEhExportClass;
        Ext:String;
    begin
      SaveDialog1.FileName := 'file1';
      if (ActiveControl is TDBGridEh) then
        if SaveDialog1.Execute then
        begin
          case SaveDialog1.FilterIndex of
            1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
            2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
            3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
            4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
            5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
          else
            ExpClass := nil; Ext := '';
          end;
          if ExpClass <> nil then
          begin
            if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
               UpperCase(Ext) then
              SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
            SaveDBGridEhToExportFile(ExpClass,TDBGridEh(ActiveControl),
                 SaveDialog1.FileName,False);
          end;
        end;
    end;
      

  16.   

    能不能把那控件发给我学习一下了?了[email protected]
    谢谢了
      

  17.   

    能不能把那控件发给我学习一下了:[email protected]
    谢谢了
      

  18.   

    谁还有更好的导出成Excel的方法.
      

  19.   

    DBGridEH导EXCEL的速度是极快的,建议使用