使用 phpword 基于模板生成 Word 文档

顾星河
顾星河
发布时间:2026-10-13 | 5人浏览过
原创

利用 PHPWord 库将业务数据快速转换为格式精美的 Word 文档,核心技巧在于预先设计包含占位符的 .docx 模板,并通过代码完成变量替换、表格行循环及图片嵌入。

结果或目标

自动化生成符合特定排版要求的 Word 文档(如合同、报表),避免纯代码绘制样式带来的维护困难。通过“读模板+填数据”的模式,实现内容与样式的分离。

准备条件

  1. 安装依赖:通过 Composer 引入 PHPWord 包。
composer require phpoffice/phpword
  1. 创建模板:准备一个标准的 .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} 作为块的开始和结束标记。
  • 动作:
  1. 若数据为空,克隆块并设置为折叠:$doc->cloneBlock('WIN_BLOCK', 0);
  2. 若数据存在,展开块:$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文档生成的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表