PHP生成 csv 格式 遇到的坑
坑之始
一、 在项目中有一个功能是把数据库中的数据导出来,没有说什么格式。
我就开始在网上遨游,怎么样最简单的导出数据,发现csv 可以转换为excel 并且生成非常简单,于是乎开干。
- 先从数据库中查出数据,这个最简单,不多赘述。
首先我们了解什么是csv格式:
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。 最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式 上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某 种CSV变体,至少是作为一种可选择的输入/输出格式。
原来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编码版本问题。
评论已关闭