如何使用 PHP 将 MySQL 数据动态填充到带公司信头的 Word 模板中
利用PHPWord库加载带公司信头的.docx模板,通过预设占位符替换,将MySQL数据库中的记录动态写入Word文档。该方法避免了传统拼接HTML导致的格式错误与文件损坏,实现了安全可靠、规范高效的文档自动化输出,适用于批量生成合同、报告等场景。
先说一个残酷的现实:如果你还在用 echo 往 .doc 文件里拼 HTML,想当然地以为 Word 能识别——趁早停手。这条路从根上就走不通。传统 .doc 是二进制格式,而现代 .docx 是个 ZIP 压缩包,里面是一堆 XML 文档,结构完全不同。你那种 readfile("test.doc") 输出原始二进制流,再强行拼接 HTML 字符串,文件结构直接崩溃,Word 打不开,或者打开一片空白——这不是偶然,是必然。
那怎么办?真正靠谱的做法,是转向 OOXML 标准,用成熟的库来操作 .docx 模板。这就绕不开 PHPWord(推荐 v1.2+)。它专为生成和修改 Office Open XML 文档设计,支持模板变量替换、保留样式、处理表格图片页眉页脚……公司信头这种复杂模板,正好在它的能力范围内。
✅ 实施步骤(完整示例)
准备模板:把 Word 模板另存为 .docx(千万别再用 .doc)。在需要填充数据的地方插入占位符,例如
{{NAME}}、{{EMAIL}}。建议用双大括号,避免与 XML 底层标记冲突。安装 PHPWord:用 Composer 一步到位。
composer require phpoffice/phpword
PHP 填充逻辑——这才是核心,既安全又可扩展。
getSections()[0]; $textElements = $section->getElements(); // 更健壮的方式:使用 TemplateProcessor(推荐) $template = new PhpOffice\PhpWord\TemplateProcessor($templatePath); $template->setValue('NAME', htmlspecialchars($_POST['name'], ENT_XML1, 'UTF-8')); $template->setValue('EMAIL', htmlspecialchars($_POST['email'], ENT_XML1, 'UTF-8')); // 3. 设置响应头(关键:Content-Type 必须匹配 .docx) ob_end_clean(); header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); header('Content-Disposition: attachment; filename="letter_' . date('Y-m-d_H-i-s') . '.docx"'); header('Cache-Control: max-age=0'); header('Pragma: public'); header('Expires: 0'); // 4. 输出生成的文档流 $template->sa veAs('php://output'); exit; } ?>
⚠️ 关键注意事项
- ❌ 拒绝 .doc:PHPWord 只支持 .docx。如果手里只有 .doc,用 Word 2007+ 另存为 .docx 再操作。
- ✅ 占位符命名要规范:模板里必须严格使用
{{KEY}}或KEY(取决于你调用setValue()的方式),不能有空格或特殊字符。 - ? 安全过滤不能少:对用户输入如
$_POST['name']务必调用htmlspecialchars(..., ENT_XML1),否则 XML 注入分分钟崩掉文档。 - ? 路径与权限:确保模板文件路径可读,Web 服务器有读取权限;
php://output无需写入权限,放心用。 - ? 复杂需求扩展:PHPWord 还支持表格循环(
cloneRow)、图片插入、页眉页脚、自定义字体——所有模板原有样式,包括公司信头,都会被完整继承。
总结
别再抱着“HTML 拼接 .doc”的旧思路不放了。基于 OOXML 标准、用 PHPWord 操作 .docx 模板,是目前实现专业级 Word 文档自动生成唯一稳健的方案。它不光是解决了兼容性问题,更重要的是保证了样式、信头、布局零丢失,同时也兼顾了安全性和可维护性。


































