Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как экспортировать содержимое TDBGrid в Excel или Clipboard?

01.01.2007

Пример dbgrid (DBGrid1) имеет всплывающее меню, которое позволяет две опции "Send to Excel" и "Copy"

// ЗАМЕЧАНИЕ: этот метод должен включать COMObj, Excel97 units

// ОБНОВЛЕНИЕ: если Вы используете Delphi 4, то замените xlWBatWorkSheet на 1 (один)

//----------------------------------------------------------- 
// если toExcel = false, то экспортируем содержимое dbgrid в Clipboard 
// если toExcel = true, то экспортируем содержимое dbgrid в Microsoft Excel 
procedure ExportDBGrid(toExcel: Boolean); 
var 
  bm: TBookmark; 
  col, row: Integer; 
  sline: String; 
  mem: TMemo; 
  ExcelApp: Variant; 
begin 
  Screen.Cursor := crHourglass; 
  DBGrid1.DataSource.DataSet.DisableControls; 
  bm := DBGrid1.DataSource.DataSet.GetBookmark; 
  DBGrid1.DataSource.DataSet.First; 
 
  // создаём объект Excel
  if toExcel then 
  begin 
    ExcelApp := CreateOleObject('Excel.Application'); 
    ExcelApp.WorkBooks.Add(xlWBatWorkSheet); 
    ExcelApp.WorkBooks[1].WorkSheets[1].Name := 'Grid Data'; 
  end; 
 
  // Сперва отправляем данные в memo 
  // работает быстрее, чем отправлять их напрямую в Excel
  mem := TMemo.Create(Self); 
  mem.Visible := false; 
  mem.Parent := MainForm; 
  mem.Clear; 
  sline := ''; 
 
  // добавляем информацию для имён колонок
  for col := 0 to DBGrid1.FieldCount-1 do 
    sline := sline + DBGrid1.Fields[col].DisplayLabel + #9; 
  mem.Lines.Add(sline); 
 
  // получаем данные из memo 
  for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do 
  begin 
    sline := ''; 
    for col := 0 to DBGrid1.FieldCount-1 do 
      sline := sline + DBGrid1.Fields[col].AsString + #9; 
    mem.Lines.Add(sline); 
    DBGrid1.DataSource.DataSet.Next; 
  end; 
 
  // копируем данные в clipboard 
  mem.SelectAll; 
  mem.CopyToClipboard; 
 
  // если необходимо, то отправляем их в Excel
  // если нет, то они уже в буфере обмена
  if toExcel then 
  begin 
    ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste; 
    ExcelApp.Visible := true; 
  end; 
 
  FreeAndNil(ExcelApp); 
  DBGrid1.DataSource.DataSet.GotoBookmark(bm); 
  DBGrid1.DataSource.DataSet.FreeBookmark(bm); 
  DBGrid1.DataSource.DataSet.EnableControls; 
  Screen.Cursor := crDefault; 
end;

Взято из https://forum.sources.ru