動機:
對於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;
留言