已经有好多帖子回答过这个问题了。
这是程序员大本营2001里面一位高人dogbear2000写的代码,参考以下吧单元:uExcelTools
作者:  Bear
功能:保存数据集,如TTable,TQuery,TClientDataSet等为Excel文件,
          包含标题,可以只将一部分字段导出
           这一点通过设置DataSet中要不导出字段的Tag值大于某一个值来处理
原理:调用 Microsoft Excel Ole对象
调用方式: 
                 Function DataSetToExcel(
                     DataSet:TDataSet;FieldTagMax:Integer;
                      Visible:Boolean;ExcelFileName:String=''): Boolean;
--------------------------------------------------------------------------------------------------}unit UExcelTools;interfaceuses
  classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
  Db,forms,DBClient,ComObj;//把数据集导入ExcelSheet的核心函数
function DataSetToExcelSheet
            (
             DataSet     :TDataSet;
             FieldTagMax :Integer;   // 字段的Tag值如果大于这个值,就不导出到Excel
             Sheet       :OleVariant
             ): Boolean;//实际使用的函数,内部调用了DataSetToExcelSheet,在外面加入UI接口和错误处理
function DataSetToExcel
            (
             DataSet     :TDataSet;   // 要转换的数据集
             FieldTagMax :Integer;  // 字段的Tag值如果大于这个值,就不导出到Excel
             Visible     :Boolean;      // 是否让做转换工作的Excel可见
             ExcelFileName:String='' // Excel文件名,*.xls
             ): Boolean;implementationFunction DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
var
   Row,Col,FieldIndex :Integer;
   BK:TBookMark;
begin
   Result := False;
   if not Dataset.Active then exit;
   BK:=DataSet.GetBookMark;
   DataSet.DisableControls;   Sheet.Activate;
   try     // 列标题
     Row:=1;
     Col:=1;
     for FieldIndex:=0 to DataSet.FieldCount-1 do
         begin
         if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
            begin
            Sheet.Cells(Row,Col)  :=DataSet.Fields[FieldIndex].DisplayLabel;
            Inc(Col);
            end;
         end;
     // 表内容
     DataSet.First;
     while Not DataSet.Eof do
        begin
        Row:=Row+1;
        Col:=1;
        for FieldIndex:=0 to DataSet.FieldCount-1 do
            begin
            if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
               begin
               Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;
               Inc(Col);
               end;
            end;
        DataSet.Next;
        end;     Result := True;
     finally
       DataSet.GotoBookMark(BK);
       DataSet.EnableControls;
    end; 
end;
Function DataSetToExcel(
                  DataSet:TDataSet;FieldTagMax:Integer;
                  Visible:Boolean;ExcelFileName:String=''): Boolean;
var
   ExcelObj, Excel, WorkBook, Sheet: OleVariant;
    OldCursor:TCursor;
   SaveDialog:TSaveDialog;
begin
   Result := False;
   if not Dataset.Active then exit;   OldCursor:=Screen.Cursor;
   Screen.Cursor:=crHourGlass;   try
      ExcelObj := CreateOleObject('Excel.Sheet');
      Excel := ExcelObj.Application;
      Excel.Visible := Visible ;
      WorkBook := Excel.Workbooks.Add ;
      Sheet:= WorkBook.Sheets[1];
   except
      MessageBox(GetActiveWindow,'无法调用Mircorsoft Excel! '+chr(13)+chr(10)+
                    '请检查是否安装了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
      Screen.Cursor:=OldCursor;
      Exit;
   end;   Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
   if Result then
      if Not Visible then
         begin
         if ExcelFileName<>''
            then WorkBook.SaveAs(FileName:=ExcelFileName)
            else begin
                 SaveDialog:=TSaveDialog.Create(Nil);
                 SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
                 Result:=SaveDialog.Execute;
                 UpdateWindow(GetActiveWindow);
                 if Result then
                    WorkBook.SaveAs(FileName:=SaveDialog.FileName);
                 SaveDialog.Free;
                 end;
         Excel.Quit;
         end;
   Screen.Cursor:=OldCursor;
end; end.