想从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;
代码如下,发现取出来的都是数据库的第一行,不会自动跳到第二行,第三行
请高手帮忙看看
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;
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的
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.
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;
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;
发现 不是循环的问题,当鼠标点击dbgrid表的某一行的时候,就自动取的这一行的数据,取recordcount那多次而不是对整个dbgrid表进行循环。
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,我试验过了,可以出结果
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;
不是对query对象循环,对dbgrid表循环就没有问题了
对的,所以我改成了
DBgrid2.DataSource.DataSet.First;
DBgrid2.DataSource.DataSet.Next;
这样就行了。。之前是让query下一条,我取值又是取的dbgrid的。所以出错。谢谢各位。。