PHP 專案常需匯出 Word 報表、合約、證書。主流有三種方案:Windows COM 自動化、MHT (MIME HTML) 封裝、純 HTML 輸出並另存為 .doc。本文深度比較三者優劣與適用場景。
$word = new COM("word.application") or die("無法啟動 Word");
$word->Visible = 0;
$word->Documents->Add();
$word->Selection->TypeText("這是測試內容");
$word->Documents[1]->SaveAs("C:/temp/test.doc");
$word->Quit();
$word = null;
| 優點 | 缺點 |
|---|---|
| 完整支援 Word 所有功能 (分頁、目錄、追蹤修訂) | 僅限 Windows Server + 安裝 Office |
| 可精確控制版面、列印輸出 | 需啟動 Word 進程,資源佔用大、速度慢、併發極差 |
| 無程式碼提示,開發體驗差;Office 版本升級易相容性問題 |
結論:不推薦用於 Web 生產環境,僅適合內部低頻批次腳本。
原理:將 HTML + 所有外部資源 (圖片、CSS) 打包成單一 .mht 檔,副檔名改為 .doc,Word 可直接開啟並完整還原。
class MhtFileMaker {
private $files = [], $boundary, $headers = [];
public function AddContents($filepath, $mimetype, $content, $encoding='base64') { ... }
public function GetFile() { ... } // 組裝 MIME multipart/related
public function GetMimeType($filename) { ... }
}
<img src="...">,下載圖片二進位內容。AddContents 加入主 HTML 與各圖片資源。GetFile() 取得完整 MHT 內容,寫入 .doc 檔或直接輸出下載。| 優點 | 缺點 |
|---|---|
| 跨平台 (Linux/Windows 皆可) | 單次請求只能輸出一份 (Header 限制),難以批量生成多檔下載 |
| 圖片、樣式內嵌,離線可見 | 需解析 HTML 下載資源,耗時;相對路徑處理易出錯 |
| 無需 Office 授權 | 複雜 CSS (Flex/Grid) 在 Word 中渲染可能異常 |
原理:輸出帶有 Word 命名空間的 HTML,瀏覽器/Word 以 .doc 開啟時自動解析渲染。
class WordExporter {
public function start() {
ob_start();
echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="https://www.w3.org/TR/REC-html40">';
}
public function save($filename) {
echo '</html>';
$data = ob_get_clean();
file_put_contents($filename, $data);
}
}
// 批量生成範例
for ($i=1; $i<=3; $i++) {
$exporter = new WordExporter();
$exporter->start();
echo "<h1>報表 $i</h1><p>內容...</p>";
$exporter->save("report_$i.doc");
}
| 優點 | 缺點 |
|---|---|
| 程式碼極簡、效能最高、支援批量生成 | 圖片需為絕對 URL 或 base64 內嵌,否則離線斷圖 |
| 完整支援 HTML/CSS (Word 會盡力渲染) | 複雜版面 (分欄、頁碼、頁眉頁腳) 控制力弱 |
| 跨平台、無外部依賴 | 非標準 .docx 格式,相容性視 Word 版本而定 |
| 場景 | 推薦方案 | 備註 |
|---|---|---|
| 內部低頻、需精確版面、Windows 伺服器 | COM | 啟用 DCOM 權限、設定互動式使用者 |
| 需離線完整保真 (含圖片)、單檔下載 | MHT | 資源下載耗時,注意相對路徑 |
| Web 高併發、批量下載、主要文字/表格、圖片可用 CDN 絕對路徑 | HTML .doc | 最輕量、最穩定、易維護 |
| 現代專案、需標準 .docx、支援複雜樣式 | PhpOffice/PHPWord | Composer 安裝,物件導向 API,生成真正 OOXML |
Web 環境下,HTML 輸出 .doc 是最務實的選擇:零依賴、高效能、批量友好。若需真正 .docx 格式與豐富排版功能,請直接使用 PHPWord (PhpOffice) 庫,避免自行造輪子。