设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 87|回复: 12

使用phpword生成word文档的两种方式

[复制链接]

1

主题

59

回帖

141

积分

注册会员

积分
141
发表于 2024-4-20 08:21:49 | 显示全部楼层 |阅读模式
使用phpword生成文档有两种方式

  • 直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用。如果客户或产品提供一份word的样式,我们也难以完全复原,调样式很头疼的。
  • 读取原有word模板,替换相关变量。个人感觉这种方式能满足绝大部分需求,实现起来也比较简单,所有的样式,格式直接在word模板里设置好,替换变量就可以了,还可以很方便的切换模板。本文主要介绍这种方式,毕竟我们是为了快速实现客户的需求,让客户提供一份word模板,我们稍微一改就可以了。
开始干活
1,通过composer安装phpword包
  1. composer require phpoffice/phpword
复制代码
2,准备一个word模板(让客户或产品提供吧,docx格式的)
  1. $tpl = 'template/word/display_agreement.docx';

  2. $doc = new TemplateProcessor($tpl);//打开模板

  3. // 简单替换

  4. $doc->setValue('dealer_name', $oneCust->dealer->dealer_name, 2);//替换变量 第二个参数替换次数

  5. $doc->setValue('cust_name', $oneCust->customer->cust_name);//替换变量cust_name

  6. $doc->setValue('start_time', $arrOneCust['start_time_text']);

  7. $doc->setValue('end_time', $arrOneCust['end_time_text']);

  8. $doc->setValue('show_day', $arrOneCust['show_day']);

  9. $doc->setValue('signing_date', date('Y年m月d日', $arrOneCust['create_at']));

  10. // 陈列要求

  11. // 循环替换

  12. $arr = [

  13.     ['goods_name'=>'苹果手机8','specs'=>'128G','number'=>'2台'],

  14.     ['goods_name'=>'苹果手机11','specs'=>'128G','number'=>'2台'],

  15.     ['goods_name'=>'苹果手机12','specs'=>'128G','number'=>'2台'],

  16. ]

  17. if (!empty($arr)) {

  18.     $j = 1;

  19.     $rows = count($arr);

  20.     $doc->cloneRow('customergoods_name', $rows);//复制行

  21.     foreach ($arr as $oneGoods) {

  22.         $dTmp = $oneGoods->toArray();

  23.         $doc->setValue("customergoods_name#" . $j, "产品名称:{$oneGoods['goods_name']}");//替换变量

  24.         $doc->setValue("customergoods_spce#" . $j, "产品规格:{$oneGoods['specs']}");//替换变量

  25.         $doc->setValue("customergoods_num#" . $j, "数量:{$oneGoods['number']}");//替换变量

  26.         $j++;

  27.     }

  28. }
复制代码
有时我们需要有“陈列奖励”数据时就显示没有时就不显示,此里需要用到块标签了与html类似
  1. // 陈列奖励

  2. // 循环替换

  3. $arr = [

  4.     ['goods_name'=>'苹果手机8','time'=>'1606011063','number'=>'2台'],

  5.     ['goods_name'=>'苹果手机11','time'=>'1606011063','number'=>'2台'],

  6.     ['goods_name'=>'苹果手机12','time'=>'1606011063','number'=>'2台'],

  7. ]

  8. $doc->cloneBlock('WIN_BLOCK',0);

  9. if (!empty($arr)) {

  10.     //显示块

  11.     $doc->cloneBlock('WIN_BLOCK',1);

  12.     $j = 1;

  13.     $rows = count($arr);

  14.     $doc->cloneRow('customergoods_name', $rows);//复制行

  15.     foreach ($onePhase->customerGoodList as $oneGoods) {

  16.         $doc->setValue("phase_date#" . $j, date('Y-m-d', $onePhase['time']));//替换变量

  17.         $doc->setValue("phase_type#" . $j, '兑付');//替换变量

  18.         $doc->setValue("phase_goods#" . $j, $oneGoods['goods_name']);//替换变量

  19.         $doc->setValue("phase_num#" . $j, "数量:{$oneGoods['number']}");//替换变量

  20.         $j++;

  21.     }

  22. }
复制代码
替换图片
  1. // 只渲染

  2. $tmp->setImageValue('header',['path'=>'1.jpeg']);

  3. // 设置图片宽高

  4. $tmp->setImageValue('header', ['path' => '1.jpg','width'=>500,'height'=>500]);

  5. // 设置多次替换

  6. $tmp->setImageValue('header', ['path' => '1.jpg','width'=>500,'height'=>500],3);
复制代码
一些常用的word符号
换行符 <w:br/>
分页符 <w:br w:type="page"/>
制表符 <w:tab/>
html预留字符要替换为实体字符,如&要替换为&,可以使用htmlspecialchars()
使用方式
比如我们数据库存的换行符一般是 \n\r 这个在word中是无效的,要替换为 <w:br/> 才行
  1. $content = str_replace("\r\n", '<w:br />', $content);

  2. $doc->setValue('content', $content); //内容
复制代码
到此这篇关于使用phpword生成word文档的两种方式的文章就介绍到这了,更多相关phpword生成word文档内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1

主题

78

回帖

168

积分

注册会员

积分
168
发表于 2024-5-18 23:22:39 | 显示全部楼层
看了LZ的帖子,我只想说一句很好很强大!

1

主题

51

回帖

125

积分

注册会员

积分
125
发表于 2024-5-25 18:10:52 | 显示全部楼层
已测试,非常不错

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-6-24 02:26:35 | 显示全部楼层
非常感谢你的观点,让我受益良多!
  • 打卡等级:偶尔看看
  • 打卡总天数:8
  • 打卡月天数:0
  • 打卡总奖励:653
  • 最近打卡:2024-07-16 15:22:43

14

主题

79

回帖

545

积分

高级会员

积分
545

灌水之王

发表于 2024-6-29 09:58:23 | 显示全部楼层
这个话题很有趣,我想多了解一些

1

主题

63

回帖

148

积分

注册会员

积分
148
发表于 2024-7-28 13:21:02 | 显示全部楼层
我不确定这个信息的准确性,请再确认一下
发表于 2024-9-3 13:42:30 | 显示全部楼层
嘎嘎嘎嘎嘎嘎嘎

0

主题

27

回帖

55

积分

注册会员

积分
55
发表于 2024-9-3 20:45:18 | 显示全部楼层
友善的讨论氛围是非常重要的。

1

主题

77

回帖

177

积分

注册会员

积分
177
发表于 2024-9-17 01:35:23 | 显示全部楼层
我们一起努力,共同解决问题吧。

1

主题

62

回帖

145

积分

注册会员

积分
145
发表于 2024-10-2 19:14:30 | 显示全部楼层
这个话题很有趣,我想多了解一些
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 10:42 , Processed in 0.114413 second(s), 29 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表