delphi stringgrid导出为excel

procedure TLiYQBYJL.btnBYJLTJDCClick(Sender: TObject);
var
  ExcelApp, workbook, sheet: Variant;
  col, row, j, i: Integer;
  str: string;
begin
  inherited;
  dlgSave1.Filter := 'Excel2007格式文件|*.xlsx|Excel2003格式文件|*.xls';
  try
    ExcelApp := CreateOleObject('Excel.Application'); (* 创建一个Excel的OLE对象,使用OLE去创建Excel文件时,需要uses ComObj *)
  except
    InformationDlg(Tit, '请安装EXCEL');
    Exit;
  end;
  workbook := ExcelApp.WorkBooks.Add;               (* 创建一个WorkBook *)
  sheet := ExcelApp.Sheets[1];                      (* 创建一个Sheet变量 *)
  if not cdsBYJLTJ.IsEmpty then
  begin
    sheet.cells[1, 1] := '保养项目';
    for col := 1 to cdsBYJLTJ.FieldCount - 1 do
    begin
      sheet.cells[1, col + 1] := cdsBYJLTJ.Fields[col].FieldName;
    end;
    with cdsBYJLTJ do
    begin
      First;
      i := 2; //行  j列
      while not Eof do
      begin
        for col := 0 to FieldCount - 1 do
        begin
          sheet.Cells[i, col + 1] := cdsBYJLTJ.Fields[col].AsString;
        end;
        Inc(i);
        Next;
      end;
    end;
  end;
  for col := 1 to SGBYJLTJ.ColCount do
  begin
    ExcelApp.ActiveSheet.Columns[col].Columnwidth := 10;
  end;
     ExcelApp.DisplayAlerts := false; //不提示任何警告信息
  if dlgSave1.Execute then    (* 如果点击了保存对话框的"保存"按键的话,将当前活动的Workbook保存到SaveDialog指定的位置 *)
  begin
    if FileExists(dlgSave1.FileName) then
    begin
      if not QuestionDlg(Tit, '文件名已存在,是否覆盖?') then
      begin
        Exit;
      end
      else
      begin
        ExcelApp.ActiveWorkbook.saveas(dlgSave1.FileName);
      end;

    end;
//    ExcelApp.ActiveWorkbook.saveas(dlgSave1.FileName);
  end
  else                           (* 如果点击了保存对话框的"取消"按键的话,放弃存盘,这句话一定要加上,否则,在点击"取消"按键时,会出现问题 *)
    ExcelApp.ActiveWorkBook.Saved := True;
//  ExcelApp.DisplayAlerts := false; //不提示任何警告信息
  workbook.Close;  (* 最后,将WorkSheet关闭 *)
  ExcelApp.quit;   (* 退出ExcelApp *)
  ExcelApp := unassigned; (* 使用unassigned时,要uses Variants *)
end;