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

作者:黄啊码 时间:2023-05-30 09:18:25 

在这之前我们先回顾以前用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', // 表明返回服务器返回的数据类型,但这里我已经提前申明返回的数据是正常的,这时候又会咋样呢?

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

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

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

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

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

那问题出在哪里呢?读入的文件是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出现乱码的解决方法分享

来源:https://blog.csdn.net/TiaoZhanJi_Xian/article/details/128850738

标签:PHP,excel,乱码
0
投稿

猜你喜欢

  • Python实现号码归属地查询功能

    2023-09-20 13:31:40
  • php tpl模板引擎定义与使用示例

    2023-11-14 22:04:49
  • SQL Server 2008及更高版本数据库恢复方法之日志尾部备份

    2024-01-25 09:22:37
  • PHP工厂模式Factory Pattern的实现及特点

    2023-05-25 05:19:24
  • Python实现删除列表中满足一定条件的元素示例

    2023-11-07 14:38:39
  • 在PyCharm环境中使用Jupyter Notebook的两种方法总结

    2021-10-07 08:06:32
  • javascript面向对象技术基础(二)

    2010-02-07 13:09:00
  • Iinternet Explorer浏览器简介(IE)

    2009-02-05 20:59:00
  • Mysql导出数据的正确方法

    2024-01-22 11:24:06
  • Java基础MAC系统下IDEA连接MYSQL数据库JDBC过程

    2024-01-20 10:41:56
  • Python3.7.0 Shell添加清屏快捷键的实现示例

    2023-02-25 13:39:23
  • Python3爬虫中Ajax的用法

    2023-02-17 15:09:15
  • python检测服务器是否正常

    2022-06-18 05:10:19
  • python使用sklearn实现决策树的方法示例

    2023-03-25 07:44:28
  • 老生常谈Python进阶之装饰器

    2022-05-20 10:51:23
  • 详解mysql的limit经典用法及优化实例

    2024-01-15 19:45:25
  • 不成熟的标准化是我们唯一惧怕的

    2008-08-15 18:55:00
  • python paramiko利用sftp上传目录到远程的实例

    2023-08-10 02:53:23
  • pytorch如何定义新的自动求导函数

    2021-02-10 20:14:49
  • mysql 5.5 安装配置方法图文教程

    2024-01-20 04:28:35
  • asp之家 网络编程 m.aspxhome.com