用 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 避免内存爆。

Comments 3 条评论
订单号变 1.38E+10 太真实了
游标分批查避免内存爆,实用
几十万行还是导出 xlsx 省心