動機:
對於Delphi Form內顯示的TDBGrid資料,
常常使用者會要求能夠匯出至Excel格式,
俾提供做其他運用...
說明:
利用Delphi6支援的OLE Automation Object來呼叫Excel,
若使用者電腦未安裝Office而只有安裝免費的OpenOffice呢?!
別擔心...一樣可以匯出資料(待下回分解)!!
程式碼如下:
procedure TfmQueryP.btnExportClick(Sender: TObject); var i, iTotal: Integer; xlsApp, xlsBook, xlsSheet: Variant; begin if qyP.State = dsInActive then begin btnOkClick(Sender); end; if qyP.RecordCount < 1 then begin InfoMessage('此查詢條件下無資料可匯出!!'); Exit; end; Tag := 0; //Do Export try xlsApp := GetActiveOleObject('Excel.Application'); except try xlsApp := CreateOleObject('Excel.Application'); except ErrorMessage('無法啟動Excel, 將啟動OpenOffice Calc'); ExportToOpenOffice; Tag := 1; Exit; end; end; xlsBook := xlsApp.Workbooks.Add; xlsSheet := xlsBook.WorkSheets.Add; xlsSheet.Select; xlsSheet.Activate; xlsSheet.Cells[1, 1].Value := '第一個欄位名稱'; xlsSheet.Cells[1, 2].Value := '第二個欄位名稱'; xlsSheet.Cells[1, 3].Value := '第三個欄位名稱'; xlsSheet.Cells[1, 4].Value := '第四個欄位名稱'; xlsSheet.Cells[1, 5].Value := '第五個欄位名稱'; xlsSheet.Cells[1, 6].Value := '第六個欄位名稱'; qyP.DisableControls; i := 2; iTotal := qyP.RecordCount; qyP.First; while not qyP.EOF do begin xlsSheet.Cells[i, 1].Value := qyP.FieldByName('field1').AsString; xlsSheet.Cells[i, 2].Value := qyP.FieldByName('field2').AsString; xlsSheet.Cells[i, 3].Value := qyP.FieldByName('field3').AsInteger; xlsSheet.Cells[i, 4].Value := qyP.FieldByName('field4').AsString; xlsSheet.Cells[i, 5].Value := qyP.FieldByName('field5').AsString; xlsSheet.Cells[i, 6].Value := qyP.FieldByName('field6').AsInteger; Inc(i); StatusBar1.Panels.Items[0].Text := '匯出資料中:第 ' + IntToStr(i - 2) + ' 筆 / 共 ' + IntTostr(iTotal) + ' 筆'; Application.ProcessMessages; qyP.Next; end; qyP.First; qyP.EnableControls; xlsSheet.Cells[1, 7].Value := '小計'; // =總人數 xlsSheet.Range['A1:F1'].AutoFilter; if (i < 3) then xlsSheet.Cells[1, 8].Value := '=SUBTOTAL(9, F2:F2)' else xlsSheet.Cells[1, 8].Value := '=SUBTOTAL(9, F2:F' + IntToStr(i - 1) + ')'; xlsApp.Visible := True; xlsApp := UnAssigned; Tag := 1; StatusBar1.Panels.Items[0].Text := ''; end;
留言