想从dbgrid里面的数据库导出到一个csv文件,
代码如下,发现取出来的都是数据库的第一行,不会自动跳到第二行,第三行
请高手帮忙看看
begin            s:='';
            for j:=0 to DBGrid2.FieldCount-1 do
            begin
              if j=DBGrid2.FieldCount-1 then
                s:=s+DBGrid2.Columns[j].Field.AsString
              else
                s:=s+DBgrid2.Columns[j].Field.AsString+',';            end;
            showmessage(s)            mylist.Add(s);
            //mes:=inttostr(i);
            //mes1:=inttostr(j);
            next;            //showmessage('i='+mes);
            //showmessage('j='+mes1)
            //showmessage(s);            //next;
            //next;
            end;
          end;
        mylist.SaveToFile('d:\test3.csv');
        showmessage('dao chu cheng gong ');
        finally
        mylist.Free;
        end;

解决方案 »

  1.   

    function DoExportToExcel(AClientDataSet: TClientDataSet; ADBGrid: TLSDBGrid;
      ACaptionName: string;UseSaveDialog: Boolean = True):Boolean;
    var
      ToExcel: TLSDDataSetToExcel;
      aFList: TLSDFieldList;  //数据结构,无初始化
      i: Integer;
      dlgSave: TSaveDialog;
    begin
      if AClientDataSet.IsEmpty then
      begin
        Result := False;
        Exit;
      end;  aFList.nField := ADBGrid.FieldCount;  //个数
      SetLength(aFList.fields,ADBGrid.FieldCount);  //数组初始化
      for i := 0 to ADBGrid.FieldCount - 1 do
      begin
        if ADBGrid.Columns[i].Visible then
        begin
          aFList.fields[i].id := i;  //序号
          aFList.fields[i].name := ADBGrid.Columns[i].FieldName;  //字段名
          aFList.fields[i].sName := ADBGrid.Columns[i].Title.Caption;  //显示名
          aFList.fields[i].width := ADBGrid.Columns[i].Width;  //宽度,似乎不起作用
        end;
      end;
      ToExcel := TLSDDataSetToExcel.Create(nil);  //建立
      ToExcel.DataSet := AClientDataSet;  //数据指向
      ToExcel.Fields := aFList;  //字段指向
      ToExcel.Caption := '>> Excel文件导出  导出模块:' + ACaptionName;
    //    ToExcel.SaveExcelFile(AFileName);
      if UseSaveDialog = True then
      begin
        dlgSave := TSaveDialog.Create(nil);
        dlgSave.DefaultExt := 'xls';
        dlgSave.Filter := '*.xls|*.xls';
        if dlgSave.Execute then
          ToExcel.SaveExcelFile(dlgSave.FileName);
        FreeAndNil(dlgSave);
      end
      else ToExcel.SaveExcelFile('d:\tmp.xls');  FreeAndNil(ToExcel);  //释放
      SetCurrentDir(ExtractFilePath(ParamStr(0)));
      Result := True;
    end;导出EXCEL的
      

  2.   

    本帖最后由 bdmh 于 2011-01-20 14:51:28 编辑
      

  3.   

    谢了楼上的。。导出excel的我有,做好了现在是想导出成文本的。。
      

  4.   

    代码没有贴全,重新贴一下
    procedure TManageHHUfrm.Save_txtClick(Sender: TObject);
    var mylist:TStringList;
    i,j:integer;
    mes1,mes,s:string;
    begin
       mylist:=tstringlist.Create;
       try
          with query2 do
            begin
              close;
              sql.Clear;
              showmessage(DBGrid2.Name);
              sql.Add('select * from use');          open;
              
              //except;
              s:='';          for j:=0 to DBGrid2.FieldCount-1 do
              begin
                if j=DBGrid2.FieldCount-1 then
                  s:=s+DBGrid2.Columns[j].Title.Caption
                else
                  s:=s+DBGrid2.Columns[j].Title.Caption+',';
              end;
              mylist.Add(s);
              first;
              for i:=0 to RecordCount-1 do          begin            s:='';
                for j:=0 to DBGrid2.FieldCount-1 do
                begin
                  if j=DBGrid2.FieldCount-1 then
                    s:=s+DBGrid2.Columns[j].Field.AsString
                  else
                    s:=s+DBgrid2.Columns[j].Field.AsString+',';            end;
                showmessage(s)            mylist.Add(s);            adoquery1.
                //mes:=inttostr(i);
                //mes1:=inttostr(j);
                //next;            //showmessage('i='+mes);
                //showmessage('j='+mes1)
                //showmessage(s);            //next;
                //next;
                end;
              end;
            mylist.SaveToFile('d:\test3.csv');
            showmessage('dao chu cheng gong ');
            finally
            mylist.Free;
            end;end;end.
      

  5.   

    跟踪了一下,就是这一段没有往下循环,始终读取的是第一条,不知道怎么写往下循环啊
    s:='';
                for j:=0 to DBGrid2.FieldCount-1 do
                begin
                  if j=DBGrid2.FieldCount-1 then
                    s:=s+DBGrid2.Columns[j].Field.AsString
                  else
                    s:=s+DBgrid2.Columns[j].Field.AsString+',';            end;
      

  6.   


      query2 .first;
      while not query2.eof do
      begin
        for j:=0 to DBGrid2.FieldCount-1 do
          begin
                  if j=DBGrid2.FieldCount-1 then
                    s:=s+DBGrid2.Columns[j].Field.AsString
                  else
                    s:=s+DBgrid2.Columns[j].Field.AsString+',';      end;
        query2.next;
      end;
      

  7.   


    发现 不是循环的问题,当鼠标点击dbgrid表的某一行的时候,就自动取的这一行的数据,取recordcount那多次而不是对整个dbgrid表进行循环。
      

  8.   

     for i:=0 to RecordCount-1 do          begin            s:='';
                for j:=0 to DBGrid2.FieldCount-1 do
                begin
                  if j=DBGrid2.FieldCount-1 then
                    s:=s+DBGrid2.Columns[j].Field.AsString
                  else
                    s:=s+DBgrid2.Columns[j].Field.AsString+',';            end;
                showmessage(s)            mylist.Add(s);            adoquery1.
                //mes:=inttostr(i);
                //mes1:=inttostr(j);
                //next;            //showmessage('i='+mes);
                //showmessage('j='+mes1)
                //showmessage(s);            //next;
                //next;
                end;这段代码,如果你把 next放开,还可能是对的,要么,就把for循环去掉,用我帮你写的while,我试验过了,可以出结果
      

  9.   

        first;
        while not eof do
              begin
                s:='';
                for j:=0 to DBGrid2.FieldCount-1 do
                begin
                  if j=DBGrid2.FieldCount-1 then
                    s:=s+DBGrid2.Columns[j].Field.AsString
                  else
                    s:=s+DBgrid2.Columns[j].Field.AsString+',';            end;
                mylist.Add(s);
                next;
              end;
    你原来的写法,数据集根本没动,你虽然for I := 0 to recordcount 了,可是你没有next;
      

  10.   

    问题解决了。。
    不是对query对象循环,对dbgrid表循环就没有问题了
      

  11.   


    对的,所以我改成了
    DBgrid2.DataSource.DataSet.First;
    DBgrid2.DataSource.DataSet.Next;
    这样就行了。。之前是让query下一条,我取值又是取的dbgrid的。所以出错。谢谢各位。。