转:dbgrid里的内容怎么导入到excel或者文本文件================================================ function ProgressBarform(max:integer):tProgressBar; var ProgressBar1:tProgressBar; form:tform; begin application.CreateForm(tform,form); form.Position:=poScreenCenter; form.BorderStyle:=bsnone; form.Height:=30; form.Width:=260; ProgressBar1:=tProgressBar.Create(form); ProgressBar1.Smooth:=true; ProgressBar1.Max:=max; ProgressBar1.Parent:=form; ProgressBar1.Height:=20; ProgressBar1.Width:=250; ProgressBar1.Left:=5; ProgressBar1.Top:=5; ProgressBar1.Step:=1; form.Show; result:=ProgressBar1; end; function ExportToExcel(dbgrid:tdbgrid):boolean; const xlNormal=-4143; var i,j,k:integer; str,filename:string; excel:OleVariant; SavePlace: TBook; savedialog:tsavedialog; ProgressBar1:TProgressBar; begin result:=false; filename:=''; if dbgrid.DataSource.DataSet.RecordCount>65536 then begin if application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno then exit; end; screen.Cursor:=crHourGlass; try excel:=CreateOleObject('Excel.Application'); excel.workbooks.add; except screen.cursor:=crDefault; showmessage('无法调用Excel!'); exit; end; savedialog:=tsavedialog.Create(nil); savedialog.Filter:='Excel文件(*.xls)|*.xls'; if savedialog.Execute then begin if FileExists(savedialog.FileName) then try if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then DeleteFile(PChar(savedialog.FileName)) else begin Excel.Quit; savedialog.free; screen.cursor:=crDefault; Exit; end; except Excel.Quit; savedialog.free; screen.cursor:=crDefault; Exit; end; filename:=savedialog.FileName; end; savedialog.free; if filename='' then begin result:=true; Excel.Quit; screen.cursor:=crDefault; exit; end; k:=0; for i:=0 to dbgrid.Columns.count-1 do begin if dbgrid.Columns.Items[i].Visible then begin //Excel.Columns[k+1].ColumnWidth:=dbgrid.Columns.Items[i].Title.Column.Width; excel.cells[1,k+1]:=dbgrid.Columns.Items[i].Title.Caption; inc(k); end; end; dbgrid.DataSource.DataSet.DisableControls; saveplace:=dbgrid.DataSource.DataSet.GetBook; dbgrid.DataSource.dataset.First; i:=2; if dbgrid.DataSource.DataSet.recordcount>65536 then ProgressBar1:=ProgressBarform(65536) else ProgressBar1:=ProgressBarform(dbgrid.DataSource.DataSet.recordcount); while not dbgrid.DataSource.dataset.Eof do begin k:=0; for j:=0 to dbgrid.Columns.count-1 do begin if dbgrid.Columns.Items[j].Visible then begin excel.cells[i,k+1].NumberFormat:='@'; if not dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).isnull then begin str:=dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).value; Excel.Cells[i, k + 1] := Str; end; inc(k); end else continue; end; if i=65536 then break; inc(i); ProgressBar1.StepBy(1); dbgrid.DataSource.dataset.next; end; progressbar1.Parent.Free; dbgrid.DataSource.dataset.GotoBook(SavePlace); dbgrid.DataSource.dataset.EnableControls; try if copy(FileName,length(FileName)-3,4)<>'.xls' then FileName:=FileName+'.xls'; Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False); except Excel.Quit; screen.cursor:=crDefault; exit; end; Excel.Visible := true; screen.cursor:=crDefault; Result := true; end;记得带上这些单元 uses Windows,Graphics,DB,Grids, DBGrids,StdCtrls,forms,Sysutils,classes, Controls,comobj,comctrls,Dialogs;
function WriteToExcel(DS: TDataSet; MSExcel: OleVariant; eRange: OleVariant):Boolean; var Count,I,Row: integer; RangeName:string; begin with DS do begin if not Active then begin Result:=False; Application.MessageBox('数据库没有打开','系统提示',MB_OK+MB_ICONINFORMATION ); Exit; end; end; ds.first; Result := True; try MSExcel := CreateOleObject('Excel.Application'); except Application.MessageBox('没有EXCEL,请安装','系统提示',MB_OK+MB_ICONWARNING); Result:=False; end; MSExcel.Visible := False; MSExcel.WorkBooks.Add; MSExcel.ScreenUpdating := False; Count := DS.FieldCount-1;
eRange := MSExcel.Range['A1', 'A1']; //excel文件的第一行 with DS do begin for I := 0 to Count do begin eRange.Value := Fields[I].DisplayLabel; //将字段头写入excel文件的第一行 eRange := eRange.Next; //excel文件的下一列 end; DisableControls; First; Row := 1; while not eof do begin Inc(Row); //row:=row+1; excel文件的下一行 RangeName := 'A'+IntToStr(Row); eRange := MSExcel.Range[RangeName, RangeName]; for I := 0 to Count do begin eRange.Value := ''''+Fields[I].AsString; eRange := eRange.Next; end; Next; end; EnableControls; end; MSExcel.ScreenUpdating := True; MSExcel.Visible := True; Result := True; MSExcel.Quit; end;
function ProgressBarform(max:integer):tProgressBar;
var
ProgressBar1:tProgressBar;
form:tform;
begin
application.CreateForm(tform,form);
form.Position:=poScreenCenter;
form.BorderStyle:=bsnone;
form.Height:=30;
form.Width:=260;
ProgressBar1:=tProgressBar.Create(form);
ProgressBar1.Smooth:=true;
ProgressBar1.Max:=max;
ProgressBar1.Parent:=form;
ProgressBar1.Height:=20;
ProgressBar1.Width:=250;
ProgressBar1.Left:=5;
ProgressBar1.Top:=5;
ProgressBar1.Step:=1;
form.Show;
result:=ProgressBar1;
end;
function ExportToExcel(dbgrid:tdbgrid):boolean;
const
xlNormal=-4143;
var
i,j,k:integer;
str,filename:string;
excel:OleVariant;
SavePlace: TBook;
savedialog:tsavedialog;
ProgressBar1:TProgressBar;
begin
result:=false;
filename:='';
if dbgrid.DataSource.DataSet.RecordCount>65536 then
begin
if application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?','询问',mb_yesno+mb_iconquestion)=idno then
exit;
end;
screen.Cursor:=crHourGlass;
try
excel:=CreateOleObject('Excel.Application');
excel.workbooks.add;
except
screen.cursor:=crDefault;
showmessage('无法调用Excel!');
exit;
end;
savedialog:=tsavedialog.Create(nil);
savedialog.Filter:='Excel文件(*.xls)|*.xls';
if savedialog.Execute then
begin
if FileExists(savedialog.FileName) then
try
if application.messagebox('该文件已经存在,要覆盖吗?','询问',mb_yesno+mb_iconquestion)=idyes then
DeleteFile(PChar(savedialog.FileName))
else
begin
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
except
Excel.Quit;
savedialog.free;
screen.cursor:=crDefault;
Exit;
end;
filename:=savedialog.FileName;
end;
savedialog.free;
if filename='' then
begin
result:=true;
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
k:=0;
for i:=0 to dbgrid.Columns.count-1 do
begin
if dbgrid.Columns.Items[i].Visible then
begin
//Excel.Columns[k+1].ColumnWidth:=dbgrid.Columns.Items[i].Title.Column.Width;
excel.cells[1,k+1]:=dbgrid.Columns.Items[i].Title.Caption;
inc(k);
end;
end; dbgrid.DataSource.DataSet.DisableControls;
saveplace:=dbgrid.DataSource.DataSet.GetBook;
dbgrid.DataSource.dataset.First;
i:=2;
if dbgrid.DataSource.DataSet.recordcount>65536 then
ProgressBar1:=ProgressBarform(65536)
else
ProgressBar1:=ProgressBarform(dbgrid.DataSource.DataSet.recordcount);
while not dbgrid.DataSource.dataset.Eof do
begin
k:=0;
for j:=0 to dbgrid.Columns.count-1 do
begin
if dbgrid.Columns.Items[j].Visible then
begin
excel.cells[i,k+1].NumberFormat:='@';
if not dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).isnull then
begin
str:=dbgrid.DataSource.dataset.fieldbyname(dbgrid.Columns.Items[j].FieldName).value;
Excel.Cells[i, k + 1] := Str;
end;
inc(k);
end
else
continue;
end;
if i=65536 then
break;
inc(i);
ProgressBar1.StepBy(1);
dbgrid.DataSource.dataset.next;
end;
progressbar1.Parent.Free; dbgrid.DataSource.dataset.GotoBook(SavePlace);
dbgrid.DataSource.dataset.EnableControls; try
if copy(FileName,length(FileName)-3,4)<>'.xls' then
FileName:=FileName+'.xls';
Excel.ActiveWorkbook.SaveAs(FileName, xlNormal, '', '', False, False);
except
Excel.Quit;
screen.cursor:=crDefault;
exit;
end;
Excel.Visible := true;
screen.cursor:=crDefault;
Result := true;
end;记得带上这些单元
uses
Windows,Graphics,DB,Grids, DBGrids,StdCtrls,forms,Sysutils,classes,
Controls,comobj,comctrls,Dialogs;
var
Count,I,Row: integer;
RangeName:string;
begin
with DS do
begin
if not Active then
begin
Result:=False;
Application.MessageBox('数据库没有打开','系统提示',MB_OK+MB_ICONINFORMATION );
Exit;
end;
end;
ds.first;
Result := True;
try
MSExcel := CreateOleObject('Excel.Application');
except
Application.MessageBox('没有EXCEL,请安装','系统提示',MB_OK+MB_ICONWARNING);
Result:=False;
end;
MSExcel.Visible := False;
MSExcel.WorkBooks.Add;
MSExcel.ScreenUpdating := False;
Count := DS.FieldCount-1;
eRange := MSExcel.Range['A1', 'A1']; //excel文件的第一行
with DS do begin
for I := 0 to Count do begin
eRange.Value := Fields[I].DisplayLabel; //将字段头写入excel文件的第一行
eRange := eRange.Next; //excel文件的下一列
end;
DisableControls;
First;
Row := 1;
while not eof do begin
Inc(Row); //row:=row+1; excel文件的下一行
RangeName := 'A'+IntToStr(Row);
eRange := MSExcel.Range[RangeName, RangeName];
for I := 0 to Count do begin
eRange.Value := ''''+Fields[I].AsString;
eRange := eRange.Next;
end;
Next;
end;
EnableControls;
end;
MSExcel.ScreenUpdating := True;
MSExcel.Visible := True;
Result := True;
MSExcel.Quit;
end;