要点:
1.header头的设置,正确的设置可以防止导出的csv文件内容出现乱码
2.有了正确的header头设置不需要再去使用iconv
函数去转换字符编码
3.输出文件名的设置(这个会体现在代码中)
4.逐行取数据,防止数据过多造成内存溢出等的问题
5.计数器和buffer刷新阈值的设定
6.fputcsv()
函数的使用;
7.ob_flush()
函数和flush()
函数的使用;
代码简单易懂,因为几乎每行都有注释
public function exportCsv($data){
//设置header头信息
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Type: application/vnd.ms-excel');
$file_name = date('YmdHis').'.csv';
header('Content-Disposition: attachment;filename="'.$file_name.'"');
// 打开PHP文件句柄,php://output 表示直接输出到浏览器
$fp = fopen('php://output', 'a');
//设置csv文件表头
$table_header = array('券码','核销金额','订单号','核销时间','商品名称','核销员');
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $table_header);
//计数器
$cnt = 0;
//buffer刷新间隔
$flush = 500;
//逐行取出数据
$count = count($data);
for ($i = 0;$i<$count;$i++){
//刷新一下输出buffer,防止由于数据过多造成问题
if($flush == $cnt){
ob_flush();
flush();
$cnt = 0;//重置计数器
}
$row = $data[$i];//根据主键逐行取数据
$row['virtual_code'] = '='.'"'.$row['virtual_code'].'"';//防止这个值被excel自动转换所作的处理
$row['virtual_time'] = '='.'"'.$row['virtual_time'].'"';//防止这个值被excel自动转换所作的处理
//将数据格式化为CSV,并写入文件指针
fputcsv($fp,$row);
$cnt += 1;
}
//关闭打开的文件
fclose($fp);
}
补充
-
导出的数据比如比较长的纯数字,日期在Excel中会被自动转换,如下图
解决办法:
- 在不希望被自动转换的值前边拼接加上
=
号,比如:
时间可以这么处理:
=2018-7-12
(注意等于号)