ThinkPHP 中用 PhpOffice/PhpWord 动态生成 Word 文档,支持纯代码生成、模板填充、图片插入及批量打包下载,需启用 zip/xml 扩展并注意路径与换行处理。

ThinkPHP 项目中生成 Word 文档,核心是用 PhpOffice/PhpWord 库实现服务端动态生成 .docx 文件,无需 Office 软件,支持样式、表格、图片和模板填充。下面分场景讲清楚怎么落地。
安装与基础配置
进入 ThinkPHP 项目根目录,执行:
- composer require phpoffice/phpword(推荐 v1.0+,兼容 TP5.1/6.x/7.x)
- 安装后
vendor/autoload.php自动加载,无需手动 require 或 import 类 - 确保 PHP 开启
zip和xml扩展(生成 .docx 必需)
纯代码生成简单 Word(适合通知、摘要类)
适用于标题+段落+换行等轻量内容,不依赖模板:
- 在控制器中实例化:
$phpWord = new \PhpOffice\PhpWord\PhpWord(); - 添加节区并设页边距(单位 Twip,720 ≈ 1cm):
$section = $phpWord->addSection(['marginTop' => 720]); - 写入带样式的文本:
$section->addText('周报', ['bold'=>true, 'size'=>24, 'color'=>'2B579A']); - 换行用
$section->addTextBreak();,不是\n;addText()不解析 HTML,所有格式必须通过参数数组声明
模板填充法生成标准文档(推荐用于周报、方案、合同)
提前准备一个 .docx 模板文件(如 template/weekly.docx),内部用 ${name}、${date} 等占位符标记变量位置:
立即学习“PHP免费学习笔记(深入)”;
- 加载模板:
$template = new \PhpOffice\PhpWord\TemplateProcessor('template/weekly.docx'); - 替换普通文本:
$template->setValue('date', date('Y年m月d日')); - 替换多行内容(含换行符):
$template->setValue('tasks', "✅ 接口联调完成\n✅ 文档归档完成"); - 插入表格数据:
$template->cloneRow('row', 3);(先在模板里定义${row}…${/row}区块),再逐个赋值:$template->setValue('task_name', ['任务A','任务B','任务C']); - 保存并强制下载:
$template->saveAs('php://output');,记得设置响应头:header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
带图片和批量导出的处理要点
如果文档含图片或需一次生成多个文件并打包下载:
- 图片路径必须为绝对路径(如
ROOT_PATH . 'public/uploads/logo.png'),相对路径会失败 - 插入图片:
$section->addImage($imgPath, ['width'=>400, 'height'=>120]); - 批量生成:先创建临时目录(
./runtime/word_temp/),循环调用模板填充逻辑,保存到该目录 - 用 PHP
ZipArchive打包所有 .docx,然后readfile()输出 zip 并清理临时文件



















