thinkphp中用phpword快速生成.docx文档:①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方法:
① 实例化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标签,所有样式需通过数组参数显式声明】。
插入动态HTML内容(含内联CSS)
适用于从富文本编辑器取值、渲染带颜色/列表/表格的方案文档。
方法一:DOM解析后逐元素转义
先用new \DOMDocument()加载HTML字符串,再遍历<p></p>、<ul></ul>、<strong></strong>等标签,提取文本和style属性,映射为PhpWord支持的样式数组。例如红色文字style="color:red" → ['color' => 'FF0000']。
方法二:用PhpWord内置HTML读取器(仅限部分版本)
调用\PhpOffice\PhpWord\Shared\Html::parse($html, $section),但该方法兼容性差,对CSS支持有限,遇到float、flex、@media会直接丢弃样式,仅建议用于简单段落。
基于Word模板填充数据(推荐用于固定格式周报)
准备一个本地.docx模板文件,例如template/weekly_report.docx,里面用${title}、${date}、${items}作占位符。
第一步:加载模板
$phpWord = \PhpOffice\PhpWord\IOFactory::load('template/weekly_report.docx');
第二步:获取第一节点节区
$section = $phpWord->getSections()[0];
第三步:查找并替换占位符
$section->addText('2026年5月26日–2026年5月30日', [], ['alignment' => \PhpOffice\PhpWord\SimpleType\Jc::CENTER]);
foreach ($section->getElements() as $element) {
if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) {
$text = $element->getText();
if (strpos($text, '${date}') !== false) {
$element->setText(str_replace('${date}', '2026年5月26日–2026年5月30日', $text));
}
}
}
第四步:保存并强制下载
$filename = '周报_' . date('YmdHis') . '.docx';
$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save($filename);
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="' . $filename . '"');
readfile($filename);
unlink($filename);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











