我在网上找了个导出EXCEL的代码,是可以使用的,但是每次查询的结果不一样,导出总会是DBGRIDEH显示的重复数据。
查询几次,就重复几次。重复的数据只是列重复:比如
A     B
1     2
导出来则是
A  B   A  B    A  B 
1  2   1  2    1  2我只用了几个控件:adoconnection ,adoquery,datasource, dbgrideh。其实这个代码是用在DBGRID上的没有问题我用的是DBGRIDEH,,就把代码改成了代码里的TDBGRID改成了TDBGRIDEH.可以导出但就出重复的问题了高手帮我看看是代码还是TDBGRIDEH控件的什么问题呢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 := TDBGrideh(Args[I].VObject).Name;
    Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrideh(Args[I].VObject).Name];    if not TDBGrideh(Args[I].VObject).DataSource.DataSet.Active then
    begin
      Screen.Cursor := crDefault;
      Exit;
    end;    TDBGrideh(Args[I].VObject).DataSource.DataSet.first;
    for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
      Sheet.Cells[1, iCount + 1] :=
    TDBGrideh(Args[I].VObject).Columns.Items[iCount].Title.Caption;    jCount := 1;
    while not TDBGrideh(Args[I].VObject).DataSource.DataSet.Eof do
    begin
      for iCount := 0 to TDBGrideh(Args[I].VObject).Columns.Count - 1 do
        Sheet.Cells[jCount + 1, iCount + 1] :=
      TDBGrideh(Args[I].VObject).Columns.Items[iCount].Field.AsString;      Inc(jCount);
      TDBGrideh(Args[I].VObject).DataSource.DataSet.Next;
    end;
    XlApp.Visible := True;
  end;
  Screen.Cursor := crDefault;
end;

解决方案 »

  1.   

    DBGRIDEH就支持导出EXCEL的
    用ADO也可导出EXCEL。
    这两个混合起来用就出错啦!
      

  2.   


    procedure saveToExcel();
    var
       Eclapp,workbook:variant;
       i,n:integer;
    begin
       if not adoquery1.Active then exit;
       if adoquery1.RecordCount<=0 then exit;   if application.MessageBox('确认导出excel表吗?','提示',mb_okcancel+mb_iconinformation)=idcancel then exit;
       Eclapp := createoleobject('Excel.Application');
       Eclapp.workbooks.add;
       for i:=0 to dbgrid2.FieldCount-1 do
       begin
         Eclapp.cells[1,i+1]:=dbgrid2.Columns[i].Title.Caption;
       end;
       Eclapp.cells[1,5]:='签字';   adoquery1.First;
       n:=2;
       while not adoquery1.Eof do
       begin
         eclapp.cells[n,1] := adoquery1.Fields[0].AsString;
         eclapp.cells[n,2] := adoquery1.Fields[1].AsString;
         eclapp.cells[n,3] := adoquery1.Fields[2].AsString;
         eclapp.cells[n,4] := adoquery1.Fields[4].AsString;
         eclapp.cells[n,6] :='         ';
         inc(n);
         adoquery1.Next;
       end;   eclapp.cells[n,1] := '满足条件记录的总数为:'+inttostr(adoquery1.RecordCount)+'条';
       application.MessageBox('数据导出完成!','提示',mb_ok+mb_iconinformation);
       eclapp.visible := true;end; 
      

  3.   


    必须在uses 中加入  DBgridehimpexp
    主要命令:
    SaveDBGridEhToExportFile(TDBGridEhExportAsXLS,   DBGridEh,   FileName,   False);
    例程
    procedure   TFrimFiveReport.FlatButton1Click(Sender:   TObject);   
      var   
          ExpClass:TDBGridEhExportClass;   
          Ext:String;   
      begin   
        
          SaveDialog1.FileName   :='五日报';   
          if   SaveDialog1.Execute   then   
          begin   
              case   SaveDialog1.FilterIndex   of   
                  1:   begin   ExpClass   :=   TDBGridEhExportAsXLS;   Ext   :=   'xls';   end;   
                  2:   begin   ExpClass   :=   TDBGridEhExportAsHTML;   Ext   :=   'htm';   end;   
                  3:   begin   ExpClass   :=   TDBGridEhExportAsText;   Ext   :=   'txt';   end;   
                  4:   begin   ExpClass   :=   TDBGridEhExportAsCSV;   Ext   :=   'csv';   end;   
                  5:   begin   ExpClass   :=   TDBGridEhExportAsRTF;   Ext   :=   'rtf';   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;   
                  try   
                      SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,true);   
                  except   
                      msshow('保存失败!');   
                  end;     
              end;   
        
          end;   
        
      end;上面那个是ADO直接导出
    这个是dbgrideh志出。
    代码是网上搜的。
      

  4.   

    你好,非常感谢你的回答,我测试了你上面的两个代码
    二楼直接用ADO是可以导出的,但 eclapp.cells[n,1] := adoquery1.Fields[0].AsString;
         eclapp.cells[n,2] := adoquery1.Fields[1].AsString;
         eclapp.cells[n,3] := adoquery1.Fields[2].AsString;
         eclapp.cells[n,4] := adoquery1.Fields[4].AsString;
         ......
        需要手工操作,很麻烦
    三楼的,编译通过,但没有反应!!!!
      

  5.   

    最后更正一下 导出EXCEL重复数据的问题原因是查询几次,dbgrideh就会显示最最后一次查询的结果,,重复几次显示 是我自己大意,才发现不好意思
      

  6.   

    直接用DBGRIDEH的导出功能不更好?
      

  7.   


    这个可以用 for i:=0 to .ADOQuery1.FieldCount-1  来实现的, 
      

  8.   

    for i:=0 to .ADOQuery1.FieldCount-1  do eclapp.cells[n,i+1] := adoquery1.Fields[i].AsString
      

  9.   

    实在不好意思,我找出了最终的原因 了,是因为我在查询按钮添加了动态增加dbgrideh列对象的代码:
    var
        ColEh:TColumnEh;
    begin
           //列属性初始化
        ColEh:=DBGridEh1.Columns.Add;
        ColEh.FieldName:='商品代码';
        ColEh.Title.TitleButton:=True;
       ......................我这样做是为了点击列标题后自动排序,但每查询一次就会生成新的列我现在把代码都放到窗体初始化里,就没有问题了。。谢谢大家的回答,学到了很多东西!