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

Delphi OLE 自動化控制 Excel/Word:Servers 元件與 Variant 晚期綁定雙軌實戰

     編輯:Delphi

兩種自動化模式比較

特性早期綁定晚期綁定
單元Excel_TLB, Word_TLB (匯入類型庫)ComObj, Variants
元件TExcelApplication, TWordApplication (Servers 頁)Variant 變數 + CreateOleObject
優點智慧提示、編譯期檢查、效能較好無需安裝 Office 即可編譯、版本獨立、部署輕量
缺點綁定特定 Office 版本、體積大、部署需對應 TLB無智慧提示、執行期才發現錯誤、速度稍慢

範例一:早期綁定操作 Excel (Servers 元件)

procedure TForm1.btnExportClick(Sender: TObject);
var
  Row, Col, I: Integer;
begin
  try
    ExcelApp.Connect; // 啟動/連接 Excel
  except
    ShowMessage('Excel 未安裝或版本不相容');
    Exit;
  end;

  ExcelApp.Visible := True;
  ExcelApp.Caption := 'Delphi 匯出報表';
  ExcelApp.Workbooks.Add(EmptyParam, 0); // 新增活頁簿
  ExcelWorkbook.ConnectTo(ExcelApp.Workbooks[1]);
  ExcelWorksheet.ConnectTo(ExcelWorkbook.Worksheets[1] as _Worksheet);

  // 寫入標題列
  for I := 0 to Table1.FieldCount - 1 do
    ExcelWorksheet.Cells.Item[1, I + 1] := Table1.Fields[I].DisplayLabel;

  // 寫入資料
  Table1.First;
  Row := 2;
  while not Table1.Eof do
  begin
    for I := 0 to Table1.FieldCount - 1 do
      ExcelWorksheet.Cells.Item[Row, I + 1] := Table1.Fields[I].AsString;
    Table1.Next;
    Inc(Row);
  end;

  // 可選:自動調整欄寬
  ExcelWorksheet.Columns.AutoFit;
end;

procedure TForm1.btnPrintPreviewClick(Sender: TObject);
begin
  ExcelWorksheet.PrintPreview;
end;

procedure TForm1.btnPrintClick(Sender: TObject);
begin
  ExcelWorksheet.PrintOut;
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
  ExcelApp.Disconnect;
  ExcelApp.Quit;
end;

範例二:晚期綁定操作 Word (Variant)

procedure TForm1.btnWordClick(Sender: TObject);
var
  WordApp, Doc, Selection: Variant;
  Template, NewTemplate: OleVariant;
begin
  try
    WordApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Word 未安裝');
    Exit;
  end;

  try
    WordApp.Visible := False;
    WordApp.Caption := 'Delphi Word 自動化';

    Template := EmptyParam;
    NewTemplate := False;
    WordApp.Documents.Add(Template, NewTemplate);
    Doc := WordApp.Documents.Item(1);

    // 關閉拼寫檢查加速
    WordApp.Options.CheckSpellingAsYouType := False;
    WordApp.Options.CheckGrammarAsYouType := False;

    Selection := WordApp.Selection;
    Selection.Font.Bold := True;
    Selection.Font.Italic := True;
    Selection.Font.Size := 14;
    Selection.TypeText('Memo 內容:' + #13 + Memo1.Text + #13#13);

    // 列印
    Doc.PrintOut;

    // 另存並關閉
    Doc.SaveAs('C:\Temp\DelphiWord.doc');
    Doc.Close(False);
    WordApp.Quit(False);
  except
    on E: Exception do
    begin
      ShowMessage('錯誤: ' + E.Message);
      if not VarIsNull(WordApp) then WordApp.Quit(False);
    end;
  end;
end;

關鍵技術細節

  • Connect/ConnectTo:早期綁定元件必須呼叫建立 COM 連線。
  • EmptyParam / OleVariant:傳遞 Optional 參數給 COM 方法。
  • as _Worksheet:介面轉型確保晚期綁定正確解析。
  • Variant 索引:Workbooks[1] 為 1-based,對應 COM 集合慣例。
  • 錯誤處理:所有 COM 呼叫包在 try..except,確保 Quit/Disconnect 執行,避免殭屍 WINWORD.EXE/EXCEL.EXE。

常見問題與解決

無 Office 環境替代方案

  • TMS FlexCel:純 Delphi 讀寫 .xls/.xlsx,支援圖表、樞紐分析、HTML/PDF 匯出。
  • LibreOffice UNO:啟動 LibreOffice 服務,透過 UNO API 操作文件。
  • Aspose.Cells/Words:商業庫,功能最完整,無 Office 相依。
  • CSV/HTML/JSON:簡單資料匯出直接產生文字檔,Excel 可開啟。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決
「類別未註冊」Office 未安裝、版本不符、或 32/64 位不匹配。Delphi 32 位需 32 位 Office。
儲存格寫入極慢逐儲存格 Cells.Item 跨程序呼叫極慢。改用陣列一次寫入:
var Arr: OleVariant; Arr := VarArrayCreate([1, Rows, 1, Cols], varVariant); ... Range.Value := Arr;
中文亂碼/問號確保 Delphi 為 Unicode 版 (2009+),或將字串轉 WideString 傳遞。
列印無反應檢查預設印表機、PrintOut 參數 (背景列印、份數、頁碼範圍)。