com_dotnet 擴展 → COM 介面 → Microsoft Word PIA (Primary Interop Assembly) → Word Application 實例template.docx 內預置 合併列印域 (MERGEFIELD),PHP 填入資料後列印/另存。extension=com_dotnet 於 php.ini。Microsoft.Office.Interop.Word(C:\Windows\assembly 查看)。在 Word 中插入 5 個合併列印域(插入 → 快速部件 → 域 → MergeField):
Gender(稱謂:Mr./Ms.)NameAgeMessagePrintDate(列印時間)將 template.docx 放置於 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 "完成!";
?>
<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) | 不儲存,保持範本乾淨供下次使用 |
PHP + COM + Word Interop 打通 Web 與 Office 桌面應用,適合報表自動列印、合約生成、標籤批量列印等企業級場景。