使用 phpword 基于模板生成 Word 文档
利用 PHPWord 库将业务数据快速转换为格式精美的 Word 文档,核心技巧在于预先设计包含占位符的 .docx 模板,并通过代码完成变量替换、表格行循环及图片嵌入。
结果或目标
自动化生成符合特定排版要求的 Word 文档(如合同、报表),避免纯代码绘制样式带来的维护困难。通过“读模板+填数据”的模式,实现内容与样式的分离。
准备条件
- 安装依赖:通过 Composer 引入 PHPWord 包。
composer require phpoffice/phpword
- 创建模板:准备一个标准的
.docx格式 Word 文件。在需要填入动态数据的位置,输入以{}包围的占位符(例如{dealer_name})。
真实操作顺序
第1步:加载模板
目的:获取可操作的文档对象。
- 入口:实例化
TemplateProcessor并传入模板路径。
$tpl = 'template/word/display_agreement.docx';
$doc = new TemplateProcessor($tpl); //打开模板
第2步:简单变量替换
目的:将字符串值填入对应的占位符。
- 动作:调用
setValue()方法,第一个参数为占位符名称,第二个为替换值。
// 基本字段替换
$doc->setValue('dealer_name', $oneCust->dealer->dealer_name);
$doc->setValue('cust_name', $oneCust->customer->cust_name);
$doc->setValue('signing_date', date('Y年m月d日', $arrOneCust['create_at']));
- 注意:若需多次替换同一占位符,可传第三个参数指定次数,例如:
$doc->setValue('dealer_name', $name, 2);
第3步:表格循环渲染
目的:当数据为数组时,自动复制表格行并填充内容。
- 入口:模板表格第一行放入占位符标识(如
{customergoods_name})。 - 动作:使用
cloneRow()复制行,随后使用带有#N后缀的占位符进行逐行赋值。
$rows = count($arr);
if ($rows > 0) {
$doc->cloneRow('customergoods_name', $rows); // 复制表格行
foreach ($arr as $j = 1; $j <= $rows; $j++) {
$doc->setValue("customergoods_name#$j", "产品:{$arr[$j-1]['goods_name']}");
// ...其他列同理
}
}
第4步:条件块标签控制
目的:实现“有数据则显示区块,无数据则隐藏”的功能。
- 入口:模板中使用
{WIN_BLOCK}作为块的开始和结束标记。 - 动作:
- 若数据为空,克隆块并设置为折叠:
$doc->cloneBlock('WIN_BLOCK', 0); - 若数据存在,展开块:
$doc->cloneBlock('WIN_BLOCK', 1);
第5步:插入图片
目的:将本地图片替换到模板预留的图片位置。
- 入口:模板中插入图片并为其指定唯一的占位符名称(如
header)。
// 基础插入
$tmp->setImageValue('header', ['path' => '1.jpg']);
// 指定尺寸
$tmp->setImageValue('header', [
'path' => '1.jpg',
'width' => 500,
'height' => 500
]);
第6步:处理特殊字符
目的:解决换行、分页等排版需求。
- HTML实体转换:数据库中的
&等特殊字符应转为实体,防止解析错误。 - 换行符:Word 中的换行需使用 XML 标签
<w:br />。可将\r\n替换为该标签:
$content = str_replace("\r\n", '<w:br />', $content);
$doc->setValue('content', $content);
完成判断
- 检查生成的
.docx文件能否正常用 Word 打开。 - 核对所有占位符已被正确替换,未出现乱码或缺失内容。
- 确认表格行数与数据量一致,图片清晰度及尺寸符合预期。
简要总结
通过预设模板并结合 PHPWord 提供的 setValue、cloneRow 等方法,可以高效且灵活地批量生成各类 Word 文档。这种方式最大程度保留了客户对排版样式的控制权,同时降低了后端代码的复杂度。
以上就是使用phpword基于模板生成Word文档的详细内容,更多关于PHPWord文档生成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













