thinkphp5.1使用phpword调取数据渲染到word导出word文档成功并解决乱码经验分享

浏览:577 发布日期:2021/01/19 分类:ThinkPHP5专区
最近需求是使用tp5导出word文档,必须选择PHPword了。
我的流程:
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以上的一定要降级再安装phpword
composer降级: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",$变量),不然会乱码。
至此,大功告成!代码拿走一改就能用,还有问题的私信我即可。
最佳答案
评论( 相关
后面还有条评论,点击查看>>