最近做的一个招聘的项目含有word导出功能 遇到的一些坑在这里总结一下
首先要引入资源包
composer require phpoffice/phpword
引入之后在自己的要写导出方法的文件头引用
use PhpOffice\PhpWord\TemplateProcessor;
然后准备一个模板word文件
记住是.docx
格式的,.doc
格式的容易出现读取不了文件的现象
我准备的文件如下
文档中需要替换的变量用${变量名}
来表示
循环块要用${tag}
开始用${/tag}
结束
写出的最后效果如下
然后就是php代码部分了
/**
* 简历导出
*
* @param [type] $ids
* @return void
*/
public function export($ids)
{
//找到模板文件的位置
$path = __DIR__.'/resume.docx';
// 实例化
$templateProcessor = new TemplateProcessor($path);
//数据获取
$data = $this->model->get($ids);
$worklist = Db::name('work_history')->where('user_id',$ids)->select();
$worknum = Db::name('work_history')->where('user_id',$ids)->count();
$edulist = Db::name('edu_history')->where('user_id',$ids)->select();
$edunum = Db::name('edu_history')->where('user_id',$ids)->count();
//基础信息填写替换
$templateProcessor->setValue('name', $data['nickname']);
$templateProcessor->setValue('age', $data['age']);
$templateProcessor->setValue('email', $data['email']);
$templateProcessor->setValue('mobile', $data['mobile']);
$templateProcessor->setValue('gender', $data['gender_text']);
$templateProcessor->setValue('address', $data['address']);
$templateProcessor->setValue('native_place', $data['native_place']);
$templateProcessor->setValue('emc', $data['emc']);
$templateProcessor->setValue('emc_mobile', $data['emc_mobile']);
$templateProcessor->setValue('bio', $data['bio']);
//工作经历
$templateProcessor->cloneBlock('WORKBLOCK',$worknum,true,true);
// $templateProcessor->cloneRow('post_content',$worknum);
foreach ($worklist as $key => $item) {
$key +=1;
$templateProcessor->setValue('times#'.$key, $item['join_time']);
$templateProcessor->setValue('com_name#'.$key, $item['work_units']);
$templateProcessor->setValue('job#'.$key, $item['job']);
$templateProcessor->setValue('post_content#'.$key, $item['post_content']);
}
//教育经历
$templateProcessor->cloneRow('school_name',$edunum);
foreach ($edulist as $key => $item) {
$key +=1;
$templateProcessor->setValue('school_name#'.$key, $item['school_name']);
$templateProcessor->setValue('school_type#'.$key, $item['eductional_systme']);
$templateProcessor->setValue('major#'.$key, $item['major']);
$templateProcessor->setValue('join_time#'.$key, $item['times']);
}
$templateProcessor->saveAs('./uploads/resume/'.$data['nickname'].'.docx');
// halt($_SERVER);
$this->redirect('http://'.$_SERVER['HTTP_HOST'].'/uploads/resume/'.$data['nickname'].'.docx');
}
这里再提一下官方的文档中关于块克隆的案例是非常简单的demo
就是这样的 克隆一个 段落就完事儿了????
没办法 我只能去看源码 看能不能找到一些蛛丝马迹
我开始一直用cloneBlock
传的参数和cloneRow
一样 就是只传 变量名和重复次数 后来才发现原来才发现有个indexVariables
的参数
这个参数的作用就是 设置为true
的时候就可以跟cloneRow
一样 生成变量的索引
有了这个就能生成最后的成果