Delphi 透過 CreateOleObject('Excel.Application') 啟動 Excel 進程(就地激活),操作 Workbooks、Worksheets、Range 等物件模型完成報表生成。
function CreateExcel: Variant;
var V, Sheet: Variant;
begin
V := CreateOleObject('Excel.Application');
V.Visible := True; // 調試時顯示,正式可設 False
V.Workbooks.Add(xlWBATWorksheet); // -4167 = xlWBATWorksheet
V.Workbooks[1].Sheets[1].Name := 'Report';
Sheet := V.Workbooks[1].Sheets['Report'];
Result := V;
end;
procedure ImportData(const Excel: Variant; const Data: array of array of Variant);
var i, j: Integer;
begin
for i := 0 to High(Data) do
for j := 0 to High(Data[i]) do
Excel.Workbooks[1].Sheets[1].Cells[i+1, j+1] := Data[i, j]; // 1-based
end;
procedure FormatSheet(const Excel: Variant);
var Sheet, Rng: Variant;
begin
Sheet := Excel.Workbooks[1].Sheets[1];
Rng := Sheet.Range[Sheet.Cells[1,1], Sheet.Cells[39,30]];
Rng.Select;
Rng.Merge; // 合併
Rng.Borders.LineStyle := xlContinuous; // 邊框
Rng.Font.Size := 9; // 字體
Rng.HorizontalAlignment := xlCenter; // 置中
end;
procedure CopyTemplate(const Excel: Variant; RowsPerPage: Integer);
var Sheet, SrcRng, DstRng: Variant; Page: Integer;
begin
Sheet := Excel.Workbooks[1].Sheets[1];
SrcRng := Sheet.Range[Sheet.Cells[1,1], Sheet.Cells[RowsPerPage, 30]];
for Page := 2 to TotalPages do
begin
SrcRng.Copy;
DstRng := Sheet.Range[Sheet.Cells[(Page-1)*RowsPerPage+1, 1], Sheet.Cells[(Page-1)*RowsPerPage+1, 1]];
DstRng.Select;
Sheet.Paste;
end;
end;
procedure SaveAndClose(const Excel: Variant; const FileName: string);
begin
if FileName <> '' then
begin
Excel.Workbooks[1].SaveAs(FileName);
Excel.Workbooks[1].Close(False);
Excel.Quit;
Excel := Unassigned; // 釋放 COM 參考
end;
end;
| 面向 | 建議 |
|---|---|
| 效能 | 關閉螢幕更新 Excel.ScreenUpdating := False,批次寫入陣列 Range.Value := VarArray。 |
| 穩定性 | 所有 Variant 操作包裝 try...finally,確保 Excel.Quit 執行,避免殭屍進程。 |
| 版本相容 | 使用晚期綁定,不引用具體類型庫;若需早期綁定請匯入對應 Office 版本 TLB。 |
| 列印 | 不建議程式直接列印,輸出 .xlsx 供使用者確認後手動列印,利用 Excel 強大分頁/頁眉頁腳功能。 |
| 權限 | 伺服器端自動化需設定 DCOM 權限(dcomcnfg),或改用無 Office 相依的庫。 |