procedure DataToExcel(dataset:tdataset;Str:String);
var
  XLApp: Variant;
    i,j: Integer;
  Sheet: Variant;
  Book:TBookStr;
begin
  if (dataset.state=dsInactive) or (dataset.Isempty)  then exit;
  try
     begin
        dataset.DisableControls;
        Book:=dataset.Book;
         try
            begin
              XLApp:= CreateOleObject('Excel.Application');
              XLApp.Visible := True;
              XLApp.Workbooks.Add(ExtractFilePath(Application.ExeName)+Str);
              XLApp.Workbooks[1].WorkSheets[1].Name := 'Delphi Data';
              Sheet := XLApp.Workbooks[1].WorkSheets['Delphi Data'];
         // for I:=1 to dataset.FieldCount do Sheet.Cells[1, i]:=dataset.Fields[i-1].FullName;
              j:=2;
              dataset.First;
                  while not dataset.eof do
                     begin
                         for i := 1 to dataset.fieldcount do
                             Sheet.Cells[j, i] :=dataset.FieldByName (dataset.fields[i-1].FieldName ).AsString;
                         j:=j+1;
                         dataset.next;
                     end;
             end;
         except
           on E:Exception do
             begin
               Application.MessageBox('打开Excel出错,检测您的Excel是否已经正确的安装或者打开的模板是否存在!','错误,提示!',MB_OK+MB_ICONERROR);
               dataset.EnableControls;
               dataset.Book:=Book;
               system.Exit ;
             end;
         end;
     end;
  finally
     begin
       dataset.EnableControls;
       dataset.Book:=Book;
     end;
  end;
  
end;

解决方案 »

  1.   

    楼上的,我知道怎样传到excel中打印,
    我想知道的是如何实现用户在dbgrid中选择某些字段来打印,
    并不是所有字段都打印
      

  2.   

    简单一点:    在用户单击标题时将该列的 ReadOnly 设置成 True(或改变颜色等等)
        然后在输出时跟据这些特定信息选择输出。复杂一点:造一个临时表,DBGrid  中各列的标题等信息都放进去,
    再开个画面让用户去选择,最后跟据表内容去选择输出, 这样就有保存设置余地。