首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Windows 下使用 PHP COM 組件生成 Word 文檔完整教程(Interop + 範本域)

     編輯:PHP 綜合知識

架構概覽

  • PHP com_dotnet 擴展 → COM 介面 → Microsoft Word PIA (Primary Interop Assembly) → Word Application 實例
  • 範本檔 template.docx 內預置 合併列印域 (MERGEFIELD),PHP 填入資料後列印/另存。

環境需求

  1. Windows Server / 10/11 + 已安裝 Microsoft Office(2007+,含 PIA)。
  2. WAMP 環境(Apache + PHP),啟用 extension=com_dotnet 於 php.ini。
  3. 確認 GAC 中存在 Microsoft.Office.Interop.Word(C:\Windows\assembly 查看)。

範本準備

在 Word 中插入 5 個合併列印域(插入 → 快速部件 → 域 → MergeField):

  1. Gender(稱謂:Mr./Ms.)
  2. Name
  3. Age
  4. Message
  5. PrintDate(列印時間)

將 template.docx 放置於 PHP 腳本同目錄。

核心 PHP 代碼

<?php
$inputs = $_POST;
$inputs['PrintDate'] = ''; // 避免 Notice

// 組裝完整組件強名稱(依實際 Office 版本調整 Version/PublicKeyToken)
$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$class    = 'Microsoft.Office.Interop.Word.ApplicationClass';

$word = new DOTNET($assembly, $class);
$word->Visible = true; // 除錯時可見,生產設 false

$template = __DIR__ . '\\template.docx';
$doc = $word->Documents->Open($template);
echo "文檔已開啟<br><hr>";

$fields = $doc->Fields;
$count  = $fields->Count;
echo "共 $count 個域<br><ul>";

$mapping = [
    1 => 'Gender',   // 索引從 1 開始
    2 => 'Name',
    3 => 'Age',
    4 => 'Message',
    5 => 'PrintDate',
];

foreach ($fields as $index => $field) {
    $field->Select();
    $key   = $mapping[$index] ?? '';
    $value = $inputs[$key] ?? '';

    if ($key === 'Gender') {
        $value = ($value === 'm') ? 'Mr.' : 'Ms.';
    }
    if ($key === 'PrintDate') {
        $value = date('Y-m-d H:i:s');
    }

    $word->Selection->TypeText($value);
    echo "<li>域 $index ($key) ← $value</li>";
}
echo "</ul>映射完成<br><hr>";

echo "正在列印,請稍候...<br>";
$doc->PrintOut(); // 直接送預設印表機
sleep(3);         // 等待列印佇列

$word->Quit(false); // 不儲存變更
$word = null;
echo "完成!";
?>

HTML 表單(前端)

<form method="post" action="generate_word.php">
  姓名:<input name="Name" required><br>
  性別:<input type="radio" name="Gender" value="m" checked> 男
        <input type="radio" name="Gender" value="f"> 女<br>
  年齡:<input name="Age" type="number" min="1" max="120"><br>
  留言:<textarea name="Message" rows="4"></textarea><br>
  <button type="submit">生成並列印 Word</button>
</form>

關鍵技術細節

項目說明
DOTNET 類別PHP 專用,實例化 .NET 組件,需強名稱
域索引Word 不支援命名域存取,只能按集合索引(1-based)
映射表在 PHP 維護索引→欄位名對照,範本調整時同步更新
Visible生產環境設 false,避免桌面彈窗
PrintOut vs PrintPreview自動化用 PrintOut;人工確認用 PrintPreview
Quit(false)不儲存,保持範本乾淨供下次使用

開發效率提升技巧

  1. 先用 C# 驗證邏輯:Visual Studio / SharpDevelop 撰寫同邏輯,享受 IntelliSense,再移植到 PHP。
  2. 錄製 Word 巨集:手動操作一次,查看 VBA 代碼,對照 COM 物件模型轉寫 PHP。
  3. 參考官方文檔:

常見問題排查

  • Class not registered:PIA 未安裝,重新安裝 Office 並勾選「.NET 可程式性支援」。
  • 權限不足:Apache 執行身份需為可登入桌面的使用者(服務屬性 → 登入 → 允許與桌面互動)。
  • 中文亂碼:確保 PHP 檔案 UTF-8 無 BOM,Word 範本字體支援中文。

結語

PHP + COM + Word Interop 打通 Web 與 Office 桌面應用,適合報表自動列印、合約生成、標籤批量列印等企業級場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved