使用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 }