首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 自動化 Excel 報表產生實戰:從資料匯入、儀表格式化到列印輸出

     編輯:Delphi

OLE 自動化架構

Delphi 透過 CreateOleObject('Excel.Application') 啟動 Excel 進程(就地激活),操作 Workbooks、Worksheets、Range 等物件模型完成報表生成。

1. 建立 Excel 實例與工作表

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;

2. 資料匯入

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;

3. 格式化:合併儲存格、邊框、字體

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;

4. 模板複製分頁(關鍵技巧)

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;

5. 儲存與關閉

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 相依的庫。

替代方案

  • 純 Delphi 報表引擎:FastReport、Rave、ReportBuilder(無 Office 相依)。
  • 開放原始碼庫:ExcelExport、FREXLIB、ZMSQL(支援 .xlsx 直接寫入)。
  • 伺服器端:EPPlus (C#)、Apache POI (Java)、LibreOffice headless 轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved