專案常需在 Web 端生成 Word 報表,或將上傳的 Word 解析為 HTML 顯示。本文提供兩種不同層級的實作方案:純 PHP 生成 .doc(輕量、無依賴)與 COM 元件調用 Word 應用程式(高保真、需 Windows 環境)。
利用瀏覽器對 application/msword MIME 型別的處理特性,輸出符合 Word 2003+ 命名空間的 HTML 即可被 Word 正確開啟。適合簡單表格、報表匯出。
<?php
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_contents();
ob_end_clean();
header('Content-Type: application/msword');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . strlen($data));
echo $data;
}
public function write($html) { echo $html; }
}
// 使用範例
$html = '<table border="1" cellpadding="6">
<tr><th>姓名</th><th>性別</th><th>年齡</th><th>愛好</th><th>備註</th></tr>
<tr><td>張三</td><td>男</td><td>32</td><td>足球</td><td>無</td></tr>
<tr><td>李四</td><td>男</td><td>43</td><td>籃球</td><td>無</td></tr>
</table>';
$exporter = new WordExporter();
$exporter->start();
$exporter->write($html);
$exporter->save('人員名單.doc');
?>
優點:無額外依賴、Linux/Windows 通用、效能高、支援批量生成。
缺點:複雜排版(分頁、頁首頁尾、圖表、樣式)支援有限,本質是 HTML 偽裝 .doc。
透過 PHP COM 擴展啟動 Word Application,實現 Word → HTML 高保真轉換(含樣式、圖片、目錄、公式)。必須在安裝完整 Office 的 Windows 伺服器上運行。
php.ini 啟用 com.allow_dcom = truephp_com_dotnet.dll,舊版需確認 extension=php_com_dotnet.dll 載入<?php
function word2html($wordPath, $htmlPath) {
try {
$word = new COM("Word.Application") or die("無法啟動 Word,請檢查 COM 權限與 Office 安裝");
$word->Visible = false; // 無頭模式
$word->DisplayAlerts = false; // 關閉彈窗
$doc = $word->Documents->Open(realpath($wordPath), false, true); // 唯讀模式
$doc->SaveAs(realpath($htmlPath), 8); // 8 = wdFormatFilteredHTML
$doc->Close(false);
$word->Quit();
// 釋放 COM 物件
$doc = null;
$word = null;
@com_release($doc);
@com_release($word);
return true;
} catch (com_exception $e) {
error_log("Word 轉 HTML 失敗: " . $e->getMessage());
return false;
}
}
// 使用
word2html('D:/www/test/報告.docx', 'D:/www/test/報告.html');
?>
| 問題 | 原因 | 解決 |
|---|---|---|
| 轉換後 HTML 亂碼/樣式大量 inline | Word 輸出 Filtered HTML 仍保留大量 Office 專屬標籤 | 後續用 Tidy / DOMDocument 清洗,或接受較大檔案 |
| 頁面長時間載入無回應 | Word 進程卡死(對話框、授權、損壞文檔修復) | 重新命名/另存來源檔、確保無密碼保護、設定超時監控殺進程 |
| 併發請求導致伺服器資源耗盡 | 每次轉換啟動獨立 WINWORD.EXE,記憶體/CPU 快速飆升 | 引入佇列(Redis/RabbitMQ)+ Worker 進程池串行處理、限制並發數 |
| Linux 環境無法使用 | COM 僅限 Windows | 改用 LibreOffice headless 模式 (soffice --headless --convert-to html),但保真度較低 |
掌握雙方案,即可應對從輕量匯出到企業級文檔轉換的各種業務需求。