P

PHP 生成 csv 用 Mac excel 打开乱码

xyj2156 PHP 2017-12-29

PHP生成 csv 格式 遇到的坑


坑之始

一、 在项目中有一个功能是把数据库中的数据导出来,没有说什么格式。

我就开始在网上遨游,怎么样最简单的导出数据,发现csv 可以转换为excel 并且生成非常简单,于是乎开干。
  1. 先从数据库中查出数据,这个最简单,不多赘述。
  2. 首先我们了解什么是csv格式:

     CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
    最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式
    上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某
    种CSV变体,至少是作为一种可选择的输入/输出格式。
  3. 原来csv 这么简单,PHP的生成方法更简单:

     $arr = [
        [
            'a' => '1',
            'b' => '2',
            'c' => '3',
        ],
        [
            'a' => '12',
            'b' => '22',
            'c' => '32',
        ],
     ];
     $str = "第一列,第二列,第三列\n";
     foreach( $arr as $k => $v){
         $str .= "{$v['a']},{$v['b']},{$v['c']}\n";
     }
    
     header("Expires:0");
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
     header("content-disposition: attachment;filename={$file_name}");
     header( "Cache-Control: public" );
     header( "Pragma: public" );
     header( "Content-type: text/csv" ) ;
     header( "Content-Dis; filename=1.csv" ) ;
     echo $str;

上面的$str 内容 写入文件就是一个csv格式文件,可以导入excel。
个人认为比生成excel 文件简单。我用wps 直接打开即可,可是当我用Mac的excel打开时,会显示在一列中,还是用逗号隔开,并且乱码了。用导入功能选择不同编码 还是乱码。

坑之解

网上遍寻资料,其中有说因为没有BOM头,导致的。
所以加上:

echo chr(239).chr(187).chr(191);

最后打开还是不行,我猜测是因为,导入时已经测试选择 utf8 编码了,这里虽然指定,最终还是 utf8 ,所以还是乱码。
最后用了编码转换,把 utf8 转换为 gbk :

把最后一行代码修改成:
 echo iconv('utf-8', 'gbk//IGNORE', $str);

最终,用这种方式,竟然导入成功,也没有乱码。难道是gbk比 utf8 好(这个是不可能的)。
实际上可能是都在中国区域,默认可能是 ansii (gb10080或者gb2312或者gbk)用utf8 反而不美了,或者可能Mac的utf8编码版本问题。

PREV
捕捉PHP中的warning 和 notice 错误
NEXT
安装nginx 的时候容易出现的问题

评论(0)

评论已关闭