// 窗体很简单 一个form 一个adoquery 连接一个adoconnection 再加一个保存dalog 搞定
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, dt,ADODB,ComObj;type
  TForm1 = class(TForm)
    Button1: TButton;
    ADOQuery2: TADOQuery;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    SaveD1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ExportToExcel(Sender1,Sender2: Tobject);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.ExportToExcel(Sender1,Sender2: Tobject);
var
MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
i, j: Integer;
adv: TForm;
//lab: TProgressBar;
begin
if (Sender1 as TadoQuery).Active then
begin
try
MsExcel := CreateOleObject('Excel.Application');
MsExcelWorkBook := MsExcel.WorkBooks.Add;
MsExcelWorkSheet := MsExcel.WorkSheets.Add;
//MsExcel.Visible := True;
with (Sender1 as TadoQuery) do
begin //读取Grid Display Label 放入Execlfor j := 0 to FieldCount - 1 do //length(Fields[j].DisplayLabel)
  if j>25 then
  MsExcelWorkSheet.Range['A'+Chr(65+(j mod 26))+'1'].Value:=Fields[j].DisplayLabel
  else
  MsExcelWorkSheet.Range[Chr(65+j)+'1'].Value:=Fields[j].DisplayLabel;
first;
/////////////////
try
{adv:=TForm.Create(nil);
adv.Name:='AdvForm';
Adv.Position:=poScreenCenter;
adv.BorderStyle:=bsDialog;
adv.FormStyle:=fsStayOnTop;
adv.Height:=120;
adv.Width:=320;
adv.caption:='Export Query Result to Excel';
adv.Visible:=true;
lab:=TProgressBar.Create(nil);
lab.Parent:=adv;
lab.Top:=adv.Height div 2-20;
lab.Left:=12;
lab.Width:=adv.Width-30;
lab.Visible:=true;
lab.Max:=100;
lab.min:=0;
lab.Position:=0;
/////////////////}
//adv.Show;
i := 2;
while not eof do
begin //读取Grid Data Label 放入Execl
for j := 0 to FieldCount - 1 do //length(Fields[j].AsString)
 if j>25 then
  MsExcelWorkSheet.Range['A'+Chr(65+(j mod 26))+'1'].Value:=Fields[j].DisplayLabel  //把段首写入excel第一行 若超出26行则 增加
  else
MsExcelWorkSheet.Range[Chr(65+j)+IntToStr(i)].Value:=Fields[j].AsString;
Inc(i);
Next;//lab.position:=Longint(Trunc( ((i+1) * 100) / (FieldCount-1) ));
Application.ProcessMessages;
end;
first;
FINALLY
;
//lab.Free;
//adv.free;
end;
end;
with (Sender2 as TSaveDialog) do
if execute then MsExcelWorkSheet.SaveAs((Sender2 as TSaveDialog).FileName);
//MsExcelWorkSheet.SaveAs(GetExePath+‘\‘+ExportName);
finally
MsExcel.Quit;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  adoquery2.Close;
  adoquery2.SQL.Clear;
  adoquery2.SQL.Add('select * from viewevery_kh_state');
  adoquery2.Open;
  ExportToExcel(adoquery2,SaveD1);
end;end.