ThinkPHP中用PhpWord生成Word文档:①Composer安装phpoffice/phpword;②自动加载无需手动引入;③基础生成支持样式文本与换行;④动态HTML需DOM解析或谨慎使用内置HTML读取器;⑤推荐模板填充法,加载.docx、替换占位符、保存下载。

你需要在ThinkPHP项目中快速生成带格式的Word文档,比如每周工作汇报或标准方案模板,不依赖Office软件,不手动复制粘贴,直接用PHP代码驱动生成可下载的.docx文件。
安装PhpWord扩展
进入项目根目录,执行Composer命令安装官方维护的PhpWord库:
composer require phpoffice/phpword
安装完成后,【vendor/autoload.php会自动加载PhpWord类,无需手动import或require】。若使用ThinkPHP5.1/6.0/7.0,该路径已由框架自动注册,跳过手动引入步骤。
基础文档生成(纯文本+样式)
在控制器中新建exportBasic方法:
立即学习“PHP免费学习笔记(深入)”;
① 实例化PhpWord对象:$phpWord = new \PhpOffice\PhpWord\PhpWord();
② 添加节区并设置页边距:$section = $phpWord->addSection(['marginTop' => 720, 'marginBottom' => 720]);(单位是Twip,720 ≈ 1cm)
③ 写入标题:$section->addText('周报汇总', ['bold' => true, 'size' => 28, 'color' => '2B579A']);
④ 换行并写入正文段落:$section->addTextBreak();$section->addText('完成事项:', ['bold' => true]);$section->addText('• 系统接口联调通过;• 文档归档至知识库。');
这一步操作起来很简单,直接把字符串传进去就行,但注意:【addText()不解析HTML标签,所有样式需通过数组参数显式声明】。
模板填充法生成周报(推荐)
适用于已有固定结构的周报或方案模板,如含表格、图片占位、多级标题等场景。
方法一:使用TemplateProcessor类
生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
① 准备一个.docx模板文件,例如template/weekly_report.docx,其中用${name}、${date}、${tasks}等占位符标记待替换内容。
② 在控制器中实例化模板处理器:$template = new \PhpOffice\PhpWord\TemplateProcessor('template/weekly_report.docx');
③ 批量替换文本占位符:$template->setValue('date', date('Y年m月d日'));$template->setValue('name', '张三');$template->setValue('tasks', "✅ 完成登录模块重构\n✅ 输出API文档V2.3");
④ 替换表格数据(支持二维数组):$template->cloneRow('task_row', 3);$template->setValue('task_row#1', '用户权限校验'); $template->setValue('task_row#2', '短信验证码优化'); $template->setValue('task_row#3', '性能压测报告');
⑤ 设置图片占位符(需提前在模板中插入同名书签或使用${image:logo}语法):$template->setImageValue('logo', ['path' => 'public/images/logo.png', 'width' => 120, 'height' => 40]);
⑥ 保存并输出:$filename = '周报_' . date('Ymd_His') . '.docx';header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');header('Content-Disposition: attachment; filename="' . $filename . '"');echo $template->saveAs('php://output');
动态HTML内容转Word(富文本方案)
当你从UEditor、TinyMCE等富文本编辑器获取带内联样式的HTML内容时,需谨慎处理。
方法1:DOM解析后逐元素转义(稳定可靠)
先用new \DOMDocument()加载HTML字符串,再遍历<p>、<ul>、<strong>等标签,提取文本和style属性,映射为PhpWord支持的样式数组。例如红色文字style="color:red"→['color' => 'FF0000']。
方法2:用PhpWord内置HTML读取器(仅限简单结构)
调用\PhpOffice\PhpWord\Shared\Html::parse($html, $section),但该方法兼容性差,对CSS支持有限,遇到float、flex、@media会直接丢弃样式,【仅建议用于无复杂布局的纯文本+粗体+颜色的简单片段】。


















