php代码实现对word文件的查找与替换,ThinkPHP5使用phpword实现文件模板字符替换

PhpWord文档

想实现更多功能的朋友可以仔细参考文档

一、使用环境

目前是在ThinkPHP5.0.21中使用的PhpWord,其他使用环境引入方式可能会有一点不同。

使用composer安装,直接使用下面的代码引入相关类库

二、安装

打开命令行进入项目根目录执行下面命令

composer require phpoffice/phpword

安装完成 头部use 引入

use PhpOffice\PhpWord\IOFactory;

use PhpOffice\PhpWord\PhpWord;

use PhpOffice\PhpWord\TemplateProcessor;

三、使用模式

1. 读取原有word模板,替换相关变量,word.docx是模板,里面有标签(注意:标签最好用“Notepad++编写,或者记事本、编译器,不要用word来编辑,然后在复制到word中对应位置,可以加粗,字体大小,字体颜色”),如下图所示,

e5d21c06dabdf4cb35b19bc192e29983.png

替换为:

7fa3e177f0504404c2564a437fd682dd.png

模板生成Word

使用场景:适合有一套固定的模板,只有几个关键的地方需要改变。

使用方式:下面介绍几行代码就足够完成整个word的替换了,需要更多功能参考文档。

//生成合同 $order_id 订单id

public function createContract($order_id)

{

$orderInfo = StationOrder::with(['user', 'station'])->find($order_id);

$data = [

'value1' => $orderInfo->user->name, //用户名

'value2' => $orderInfo->station->stationNm, //工位名

'value3' => $orderInfo->station->price, //价格

'value4' => date('Y年m月d日', $orderInfo['arrDt']), //入驻时间

'value5' => date('Y年m月d日', $orderInfo['dptDt']), //到期时间

];

$template_path = Db::name('attachment')->where(['extension' => 'docx', 'use' => 'attachment'])->value('file_url');

$template_path = ROOT_PATH . 'public' . $template_path;

//读取模版word的版本最好是docx,要不然可能会读取不了

$templateProcessor = new TemplateProcessor($template_path);

foreach ($data as $k => $v) { //读取模版word的版本最好是docx,要不然可能会读取不了

$templateProcessor->setValue($k, $v); //替换模板中的变量,对应word里的 ${xxxx}

}

// ROOT_PATH => E:\phpstudy\PHPTutorial\WWW\666\

$save_name = date('YmdHis') . '.docx'; //保存的文件名

$return_path = DS.'uploads'.DS.'contract'.DS. $save_name;

$savepath = ROOT_PATH . 'public'.DS.'uploads'.DS.'contract'.DS;

if (!is_dir($savepath)) {

@mkdir($savepath,0777);

}

$templateProcessor->saveAs($savepath.$save_name); //将内容保存到生成新的word中

StationOrder::update(['id' => $order_id, 'contract_url' => $return_path]);

return $return_path;

}

//导出合同

public function daochu($id) {

$contract_url = StationOrderModel::where('id',$id)->value('contract_url');

$file_name = end(explode(DS,$contract_url));

$download_url = ROOT_PATH .'public'.$contract_url; //真实路径

$file1 = fopen($download_url, "r"); //打开文件

//输入文件标签、下载文件

Header("Content-type: application/octet-stream");

Header("Accept-Ranges: bytes");

Header("Accept-Length: " . filesize($download_url));

Header("Content-Disposition: attachment; filename=" . $file_name);

echo fread($file1, filesize($download_url));

fclose($file1);

}

四、最后

PS:

1、Phpword虽然可以用代码生成word,但对于一些文字图片的定位操控起来非常麻烦,甚至无法控制。

2、尽量使用模板,直接改动模板更加方便,只替换一些关键字就好。

3、使用模板的时候要注意word格式要是docx,使用doc可能会报错。除非特殊声明,本站文章均为原创,转载请务必保留本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值