PHP 导出 CSV 出现乱码和科学计数法的解决

Cold 发布于 2018-05-20 23 次阅读 281 字 预计阅读时间: 1 分钟 后端开发


用 PHP 导出 CSV 给运营,反馈两个问题:Excel 打开中文乱码;订单号、手机号变成 1.38E+10 这种科学计数法。

乱码:加 BOM

Excel 默认用系统编码打开 CSV,中文 Windows 下是 GBK。最简单是输出 UTF-8 BOM 头,告诉 Excel 这是 UTF-8。

header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename="export.csv"');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

科学计数法:强制文本

Excel 会把长数字自动转成数字格式。解决办法是在字段前后加制表符或等号,或者用 ="" 包裹。

function csvText($val) {
    // 防止科学计数法,同时转义引号
    $val = str_replace('"', '""', $val);
    return '"' . $val . '"';
}

// 对订单号、手机号等字段用
fputcsv($fp, [
    csvText($orderNo),
    csvText($mobile),
    $amount
]);

更稳的做法

如果运营能接受,直接导出 xlsx(用 PhpSpreadsheet),格式可控,不会有这些问题。CSV 胜在简单、内存占用低,几十万行也没事。

大文件导出

别一次性查全表再拼字符串,用游标分批查,边查边 fputcsv 输出,配合 ob_flush + flush 避免内存爆。

和喜欢的一切在一起~
最后更新于 2018-05-20