使用PHP导出数据到CSV文件

CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。

如果你导出的Excel没有什么高级用法的话,只是做导出数据用,那么建议使用本方法,要比PHPExcel要高效的多,二十万数据导出大概要2到3秒。

如果需要对表格再次处理的话,可以把导出后的CSV文件另存为.xlsx格式后,再处理即可。

代码实现:

 1 /**
 2  * 导出Excel(csv)文件
 3  * @param array $data 要导出的数据
 4  * @param array $headList 第一行列名
 5  * @param string $fileName 输出Excel表格文件名
 6  * @param string $exportUrl 直接输出到浏览器 or 输出到指定路径文件下
 7  * @return string
 8  */
 9 public static function exportCsv(array $data, array $headList, string $fileName = '', string $exportUrl = 'php://output')
10 {
11     set_time_limit(0);// 取消脚本运行时间的限制
12     ini_set('memory_limit', '256M');// 设置php内存限制
13 
14     $fileName = empty($fileName) ? date('YmdHis') : $fileName;
15     header('Content-Type: application/vnd.ms-excel');
16     header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
17     header('Cache-Control: max-age=0');
18 
19     // 打开PHP文件句柄,php://output 表示直接输出到浏览器
20     $fp = fopen($exportUrl, 'a');
21 
22     // 输出Excel列名信息
23     foreach ($headList as $key => $value) {
24         // CSV的Excel支持GBK编码,一定要转换,否则乱码
25         try {
26             $headList[$key] = iconv('utf-8', 'gbk', $value);
27         } catch (Throwable $e) {
28             $headList[$key] = mb_convert_encoding($value, "GBK", "UTF-8");
29         }
30     }
31 
32     // 将数据通过fputcsv写到文件句柄
33     fputcsv($fp, $headList);
34 
35     // 计数器
36     $num = 0;
37     // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小,大数据量时处理
38     $limit = 100000;
39     // 逐行取出数据,不浪费内存
40     $count = count($data);
41 
42     for ($i = 0; $i < $count; $i++) {
43         $num++;
44 
45         // 刷新一下输出buffer,防止由于数据过多造成问题
46         if ($limit == $num) {
47             ob_flush();
48             flush();// 刷新buffer
49             $num = 0;
50         }
51 
52         $row = $data[$i];
53         foreach ($row as $k => $v) {
54             try {
55                 $row[$k] = iconv('utf-8', 'gbk', $v);
56             } catch (Throwable $e) {
57                 $row[$k] = mb_convert_encoding($v, "GBK", "UTF-8");
58             }
59         }
60         fputcsv($fp, $row);
61     }
62     return $fileName;
63 }

 

posted on 2020-09-28 18:02  Rover_Lee  阅读(577)  评论(0编辑  收藏  举报

导航