我的流程:
1、去服务器安装composer(自行百度怎么安装),
2、切换到项目的主目录,有composer.json这个文件的主目录,修改composer.json中packagist的URL为:https://mirrors.aliyun.com/composer/,然后composer也切换国内的镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/最后安装执行(安装失败的看看是否切换了镜像):composer require phpoffice/phpword注意:composer不要用2.0,如果是composer2.0以上的一定要降级再安装phpwordcomposer降级:
composer self-update --13、安装完phpword之后,打开项目目录的vendor就有了phpoffice文件夹。接下来修改word模板中的变量如图:

4、打开要写导出方法的控制器,头部添加以下代码:
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\TemplateProcessor;如图:
5、再控制器里面添加渲染模板和导出word文档的代码:
//导出word文档 chaoyue vx:chaoyue3887
public function export_answer_result_word(){
//获取用户id 查询用户要导出的信息
$id = $this->request->get('id');
$user = DB::name($this->table)->Where('id', $id)->find();
$list = Db::name($this->table2)->where('openid', $user['openid'])->order('id asc')->select();
//获取数据前五条
$content1 = array_slice($list,0,5);
$strcontent1 = " ";
$strcontent2 = " ";
$strcontent3 = " ";
$year = '2021';
$mon = '1';
$day = '2';
foreach($content1 as $key => $v){
$strcontent1 .= $v['content'];
}
//获取数据5-10条
$content2 = array_slice($list,5,5);
foreach($content2 as $key=>$v){
$strcontent2 .= $v['content'];
}
//获取数据11条后面所有
$content3 = array_slice($list,10);
foreach($content3 as $key=>$v){
$strcontent3 .= $v['content'];
}
//使用PHPWORD进行数据导出
$phpword=new PhpWord();
$template= $phpword->loadTemplate('static/aa.docx');//读取word模板
$template->setValue('name',iconv("utf-8","gbk",$user['username']));//填充数据
$template->setValue('content1',iconv("utf-8","gbk",$strcontent1));//填充数据
$template->setValue('content2',iconv("utf-8","gbk",$strcontent2));//填充数据
$template->setValue('content3',iconv("utf-8","gbk",$strcontent3));//填充数据
$template->setValue('year',iconv("utf-8","gbk",$year));//填充数据
$template->setValue('mon',iconv("utf-8","gbk",$mon));//填充数据
$template->setValue('day',iconv("utf-8","gbk",$day));//填充数据
$filename = $user['username'].'个性化学力诊断报告'.date('mdHis').'.doc';
$template->saveAs($filename); //另存为新word文档,根据模板和变量生成了新的文档
$file = fopen($filename, "rb");//以只读和二进制模式打开文件
Header("Content-type: application/octet-stream"); //告诉浏览器这是一个文件流格式的文件
Header("Accept-Ranges: bytes"); //请求范围的度量单位
Header("Accept-Length: " . filesize($filename)); //Content-Length是指定包含于请求或响应中数据的字节长度
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header("Content-Disposition: attachment; filename=$filename");
echo fread($file, filesize($filename)); //读取文件内容并直接输出到浏览器
fclose($file);
exit ();
}注意,如果渲染的是汉字,一定要用iconv("utf-8","gbk",$变量),不然会乱码。至此,大功告成!代码拿走一改就能用,还有问题的私信我即可。
最佳答案