Laravel 8使用PHPWord模板时数据库HTML内容赋值后不显示如何解决
问题原因
PHPWord 提供的setValue()方法仅支持纯文本内容赋值,传入HTML字符串时不会自动解析渲染,HTML自带的特殊转义字符还会导致替换逻辑失效,因此会出现占位符位置无内容的情况。
解决方案
要实现HTML内容解析到Word模板,需要先将HTML转换为PHPWord可识别的元素集合,再使用setComplexValue()方法替换占位符,完整修改后的代码如下:
<?php namespace App\Http\Controllers; use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use PhpOffice\PhpWord\Shared\Html; use PhpOffice\PhpWord\PhpWord; class CWord extends Controller{ public function CreateWord() { $desc1 = DB::table('dummy')->where('id',1)->first(); $path = "assets_file/"; $my_template = new \PhpOffice\PhpWord\TemplateProcessor(public_path($path.'helloWorld.docx')); // 解码数据库取出的HTML实体 $htmlContent = htmlspecialchars_decode($desc1->content); // 创建临时容器解析HTML为Word元素 $tempPhpWord = new PhpWord(); $tempSection = $tempPhpWord->addSection(); Html::addHtml($tempSection, $htmlContent, false, false); $contentElements = $tempSection->getElements(); // 使用复杂值方法替换占位符 $my_template->setComplexValue('name', $contentElements); try{ $my_template->saveAs(public_path($path.'user_1.docx')); }catch (Exception $e){ // 可在此处加日志排查错误 \Log::error('Word导出失败:'.$e->getMessage()); } // deleteFileAfterSend配置可在导出完成后自动删除服务器临时文件 return response()->download(public_path($path.'user_1.docx'))->deleteFileAfterSend(true); } }
注意事项
- 模板内的
${name}占位符请单独占一行,不要与其他文本混排,避免替换出错 - PHPWord内置HTML解析器仅支持常用的HTML标签(span、br、p、b、i、u等),不支持复杂CSS样式,复杂格式建议直接在Word模板内预设
- 不需要保留HTML格式时可以直接使用
strip_tags()函数剥离标签后用setValue()赋值,实现纯文本导出 - 请使用最新稳定版PHPWord,旧版本的
setComplexValue对元素集合的支持存在兼容性bug
内容的提问来源于stack exchange,提问作者Rico Ardi
相关产品推荐
相关产品推荐

