兩種自動化模式比較
| 特性 | 早期綁定 | 晚期綁定 |
| 單元 | 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 未安裝、版本不符、或 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 參數 (背景列印、份數、頁碼範圍)。 |
無 Office 環境替代方案
- TMS FlexCel:純 Delphi 讀寫 .xls/.xlsx,支援圖表、樞紐分析、HTML/PDF 匯出。
- LibreOffice UNO:啟動 LibreOffice 服務,透過 UNO API 操作文件。
- Aspose.Cells/Words:商業庫,功能最完整,無 Office 相依。
- CSV/HTML/JSON:簡單資料匯出直接產生文字檔,Excel 可開啟。
- 上一篇文章: Delphi 使用 Windows GDI 實作文字旋轉/傾斜繪製:CreateFontIndirect 完整教學
- 下一篇文章: Delphi InstallShield Express 安裝程式中文化完整教學
Copyright ©
程式碼之家 All Rights Reserved