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中对应位置,可以加粗,字体大小,字体颜色”),如下图所示,
替换为:
模板生成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可能会报错。除非特殊声明,本站文章均为原创,转载请务必保留本文链接