如何匯出TDBGrid資料至Calc


動機:
對於Delphi Form內顯示的TDBGrid資料,
常常使用者會要求能夠匯出至Calc格式(免費Office),
俾提供做其他運用...

說明:
利用Delphi6支援的OLE Automation Object來呼叫Calc,
就可以看到匯出的資料了!!

程式碼如下:


procedure TfmQueryP.ExportToOpenOffice;
var
  iRow, iTotal: integer;
  objServiceManager, objDesktop, oDocument, osheet: OleVariant;
  objDocName, objDocParam, objDocNum, objParam: variant;
  ApplicationPath: string;
begin
  // The service manager is always the starting point
  objServiceManager := CreateOLEObject('com.sun.star.ServiceManager');

  // Create the Desktop
  objDesktop := objServiceManager.createInstance('com.sun.star.frame.Desktop');

  // Open a new empty scalc document
  ApplicationPath := ExtractFilePath(Application.ExeName);

  if copy(ApplicationPath, length(ApplicationPath), 1) <> '\' then
    ApplicationPath := ApplicationPath + '\';

  ApplicationPath := AnsiReplaceStr( ApplicationPath, '\', '/');
  ApplicationPath := AnsiReplaceStr( ApplicationPath, ':', '|');
  ApplicationPath := 'File:///' + ApplicationPath + 'Report/QueryPathistk.ots';

  objDocName := ApplicationPath;

  objDocParam := '_blank';
  objDocNum := 0;
  objParam := VarArrayCreate([0, 1], VarVariant);
  objParam[0] := ''; // .Name = ''
  objParam[1] := 0; // .Value = 0

  // oDocument will be ::com::sun::star::lang::XComponent;
  oDocument := objDesktop.loadComponentFromURL(objDocName, objDocParam, 0, VarArrayOf([]));

  //oDocument.getSheets will return ::com::sun::star::sheet::XSpreadsheets
  oSheet := oDocument.getSheets.getByIndex(0);

  iRow := 1;
  iTotal := qyP.RecordCount;

  qyP.DisableControls;
  qyTemp.SQL.Clear;
  qyTemp.SQL.Add(' Select * From TempP ');
  qyTemp.Open;
  qyP.First;

  while not qyP.Eof do
  begin
    osheet.getCellByPosition(0, iRow).String := qyP.FieldByName('field1').AsString;
    osheet.getCellByPosition(1, iRow).String := qyP.FieldByName('field2').AsString;
    osheet.getCellByPosition(2, iRow).String := qyP.FieldByName('field3').AsString;
    osheet.getCellByPosition(3, iRow).String := Trim(qyP.FieldByName('field4').AsString);
    osheet.getCellByPosition(4, iRow).String := Trim(qyP.FieldByName('field5').AsString);
    osheet.getCellByPosition(5, iRow).Value := qyP.FieldByName('field6').AsInteger;

    StatusBar1.Panels.Items[0].Text := '匯出資料中:第 ' + IntToStr(iRow) + ' 筆 / 共 ' + IntTostr(iTotal) + ' 筆';
    Inc(iRow);
    Application.ProcessMessages;
    qyP.Next;
  end;

  qyP.First;
  qyTemp.Close;
  qyP.EnableControls;
  Tag := 1;
end;

留言