PHP结合vue导出excel出现乱码的解决方法分享

 更新时间:2023年02月03日 11:04:38   作者:黄啊码  
这篇文章主要为大家详细介绍了PHP结合vue导出excel出现乱码的解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在这之前我们先回顾以前用php导出excel,我直接写成方法在这里:

public static function phpExcelList($field, $list, $title='文件',$file_time){
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        foreach ($list as $key => $value) {
            foreach ($field as $k => $v) {
                if ($key == 0) {
                    $sheet->setCellValue($k . '1', $v[1]);
                }
                $i = $key + 2; //表格是从2开始的
                $sheet->setCellValue($k . $i, $value[$v[0]]);
            }
        }
        
        ob_clean();
        header("Content-type:application/vnd.ms-excel;charset=UTF-8");
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$title.'.csv"');
        header('Cache-Control: max-age=0');
        $writer = new Csv($spreadsheet);
        $writer->save('php://output');
        exit;
    }

一般有设置charset基本在前端就没啥问题,问题就在于vue导出时就出现乱码了,有可能是这个,大多数网友的解决方案就是在请求里边加上参数:responseType: 'blob', // 表明返回服务器返回的数据类型,但这里我已经提前申明返回的数据是正常的,这时候又会咋样呢?

咱们试试用国产的wps打开吧:

咦?没问题?再用office打开:啊哈》》?what?

那问题出在哪里呢?读入的文件是utf-8格式,下载下来Excel打开乱码,但是用其他编辑器打开并不是乱码,一开始解决问题的思路是,下载文件的时候,是不是没有指定编码方式,导致文件编码方式不对,于是乎使用了Blob里的type参数,硬塞了一个类型以及编码方式,但是这种方法似乎并不管用,仔细读了官方文档之后,关于type的解读如下:

type,默认值为 “”,它代表了将会被放入到blob中的数组内容的MIME类型。

这里明确表明,此type只是一个类型标记,并不会起到转码的作用,想想也是,blob仅仅是内存里开辟的0,1代码,怎么可能在下载的过程中去解码编码呢?

发现这其实是微软家的坑,微软家发明了一个东西叫bom头,关于bom头:

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入UTF-8 BOM头。记事本等编辑器通过它来识别这个文件是否以UTF-8编码(当然即便没有UTF-8 BOM头记事本也能通过其它方式正确识别UTF-8编码)。

那么如果一个UTF-8编码的字符串的开头处没有BOM头又会发生什么?答:不认识你,乱码给你看

所以我们在这需要手动加一个微软看得懂的BOM头:

window.URL.createObjectURL(new Blob(['\uFEFF' + content]))

总的代码示例如下,不懂可以直接抄:

this.$http.get(common.webapi+'/api/exportExcel',{params:{参数名称:参数值}}, {emulateJSON:true,responseType: 'blob'}).then((res)=>{
              if(res.data){
              const link = document.createElement('a');// 创建a标签
              let blob = new Blob(['\uFEFF' + res.data],{type: 'application/vnd.ms-excel;'}); // 设置文件类型并在返回值前加bom头,避免乱码
              link.style.display = "none";
              link.href = URL.createObjectURL(blob); // 创建URL
              link.setAttribute("download", "数据"+ this.$moment(new Date().getTime()).format("YYYY-MM-DD")+'.csv');
              document.body.appendChild(link);
              link.click();
              document.body.removeChild(link);
              //如果不会出现乱码,直接一句代码搞定:this.$fileDownload(res.data, "发票数据"+ this.$moment(new Date().getTime()).format("YYYY-MM-DD")+'.csv')
             }
           
          })

//如果不会出现乱码,直接一句代码搞定:this.$fileDownload(res.data, "数据"+ this.$moment(new Date().getTime()).format("YYYY-MM-DD")+'.csv'),接下来就是见证奇迹的时刻:

到此这篇关于PHP结合vue导出excel出现乱码的解决方法分享的文章就介绍到这了,更多相关PHP导出excel出现乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP+Javascript实现在线拍照功能实例

    PHP+Javascript实现在线拍照功能实例

    这篇文章主要介绍了PHP+Javascript实现在线拍照功能的方法,涉及javascript插件的使用及php图片上传的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • PHP编程实现csv文件导入mysql数据库的方法

    PHP编程实现csv文件导入mysql数据库的方法

    这篇文章主要介绍了PHP编程实现csv文件导入mysql数据库的方法,涉及php文件读取、转换、数据库的连接、插入等相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • php站内搜索关键词变亮的实现方法

    php站内搜索关键词变亮的实现方法

    这篇文章主要介绍了php站内搜索关键词变亮的实现方法,以实例形式较为详细的分析了数据库表的创建及针对数据库的搜索关键字高亮的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • 不用mod_rewrite直接用php实现伪静态化页面代码

    不用mod_rewrite直接用php实现伪静态化页面代码

    不用mod_rewrite直接用php代码实现伪静态效果,大家看后就会发现php真的很方便
    2008-10-10
  • PHP内存缓存Memcached类实例

    PHP内存缓存Memcached类实例

    这篇文章主要介绍了PHP内存缓存Memcached类,以实例形式分析了PHP内存缓存Memcached的实现方法,是php操作memcached的典型应用,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • PHP Token(令牌)设计

    PHP Token(令牌)设计

    PHP Token(令牌)设计 设计目标: 避免重复提交数据. 检查来路,是否是外部提交 匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作) 这里所说的token是在页面显示的时候,写到FORM的一个隐藏表单项(type=hidden). token不可明文,如果是明文,那就太危险了,所以要采用一定的加密方式.密文要可逆.俺算法很白痴,所以采用了网上一个现成的方法.
    2008-03-03
  • php adodb连接带密码access数据库实例,测试成功

    php adodb连接带密码access数据库实例,测试成功

    最近前台有个开票系统需要改进导致需要用PHP去连接那个系统的 数据库,ACCESS的带密码的。写了个简单的实例,记录下。
    2008-05-05
  • php ajax异步读取rss文档数据

    php ajax异步读取rss文档数据

    这篇文章主要介绍了php ajax异步读取rss文档数据的相关资料,RSS是一种描述和同步网站内容的格式,需要的朋友可以参考下
    2016-03-03
  • php 的多进程操作实践案例分析

    php 的多进程操作实践案例分析

    这篇文章主要介绍了php 的多进程操作,结合具体实例形式总结分析了php多进程的常见操作技巧与相关使用注意事项,需要的朋友可以参考下
    2020-02-02
  • 用php随机生成福彩双色球号码的2种方法

    用php随机生成福彩双色球号码的2种方法

    这里为大家介绍用php随机生成福彩双色球号码的二种方法,供朋友们学习参考。新的一年,祝大家中大奖,发大财
    2013-02-02

最新评论