php生成csv文件,完美解决乱码和失真

//生成csv文件,完美解决中文乱码和大数据失真问题
if(!function_exists('toCSV')) {
    function toCSV(array $data, array $colHeaders, $asString = false) {
        $stream = ($asString)
            ? fopen("php://temp/maxmemory", "w+") //生成临时csv
            : fopen("php://output", "w");//浏览器下载


        //在写入的第1行第1列的开头加bom,解决excel打开乱码问题
        $bom = chr(0xEF).chr(0xBB).chr(0xBF);
        if (!empty($colHeaders)) {//标题的第1行第1列,开头加bom
            $colHeaders[0] = $bom.$colHeaders[0];
            fputcsv($stream, $colHeaders);
        } else {//内容的第1行第1列,开头加bom
            foreach ($data as $key => $record) {
                $data[$key] = $bom.$record;
                break;
            }
        }

        foreach ($data as $key => $record) {
            //数字超过15位加"\t"防止失真
            foreach ($record as $k => $v) {
                if (is_numeric($v) && strlen($v) > 15) {
                    $record[$k] = "\t".$v;
                }
            }
            fputcsv($stream, $record);
        }

        if ($asString) {
            rewind($stream);
            $returnVal = stream_get_contents($stream);
            $returnVal = iconv('utf-8', 'gbk//ignore', $returnVal);
            fclose($stream);
            return $returnVal;
        } else {
            fclose($stream);
            header('Content-Type: application/vnd.ms-excel');
            header('Content-Disposition: attachment;filename="'.time().'.csv"');
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值