CSV,是Comma Separated Value(逗號分隔值)的英文縮寫,一般都是純文本文件。php
fgetcsv() 函數從文件指針中讀入一行並解析 CSV 字段。數組
與 fgets() 相似,不一樣的是 fgetcsv() 解析讀入的行並找出 CSV 格式的字段,而後返回一個包含這些字段的數組。瀏覽器
fgetcsv() 出錯時返回 FALSE,包括碰到文件結束時。服務器
具體使用時封裝函數以下:app
/** * 導入Excel數據表格 * @param string $fileName 文件名 * @param int $line 讀取幾行,默認所有讀取 * @param int $offset 從第幾行開始讀,默認從第一行讀取 * @return bool|array */ public function importCsv($fileName, $line=0, $offset=0){ //set_time_limit(0);//防止超時 //ini_set("memory_limit", "512M");//防止內存溢出 $handle = fopen($fileName,'r'); if(!$handle){ return '文件打開失敗'; } $i = 0; $j = 0; $arr = []; while($data = fgetcsv($handle)){ //小於偏移量則不讀取,但$i仍然須要自增 if($i < $offset && $offset){ $i++; continue; } //大於讀取行數則退出 if($i > $line && $line){ break; } foreach ($data as $key => $value) { $content = iconv("gbk","utf-8//IGNORE",$value);//轉化編碼 $arr[$j][] = $content; } $i++; $j++; } return $arr; }
前言:Excel表格最高支持104W行,導出數據達到上萬的量,PHPExcel就顯得有點無力了,常常卡死或者內存溢出,若作普通的數據導出功能,建議使用fputcsv()函數,由於此函數要比PHPexcel要高效的多,二十萬數據導出大概須要2到3秒。函數
fputcsv() 函數將行格式化爲 CSV 並寫入一個打開的文件。編碼
該函數返回寫入字符串的長度。若出錯,則返回 false。spa
具體使用時封裝函數以下:指針
(注意點:excel
參數:$exportUrl分兩種狀況,根據需求選擇其一
1.$exportUrl = 'php://output' 表示表示直接輸出到瀏覽器自動下載。
2.$exportUrl = "服務器目錄地址/文件名.csv" 表示輸出到指定路徑文件下。舉例:$exportUrl = "/data/a.csv")。
/** * 導出Excel數據表格 * @param array $dataList 要導出的數組格式的數據 * @param array $headList 導出的Excel數據第一列表頭 * @param string $fileName 輸出Excel表格文件名 * @param string $exportUrl 直接輸出到瀏覽器or輸出到指定路徑文件下 * @return bool|false|string */ public static function toExcel($dataList,$headList,$fileName,$exportUrl){ //set_time_limit(0);//防止超時 //ini_set("memory_limit", "512M");//防止內存溢出 header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$fileName.'.csv"'); header('Cache-Control: max-age=0'); //打開PHP文件句柄,php://output 表示直接輸出到瀏覽器,$exportUrl表示輸出到指定路徑文件下 $fp = fopen($exportUrl, 'a'); //輸出Excel列名信息 foreach ($headList as $key => $value) { //CSV的Excel支持GBK編碼,必定要轉換,不然亂碼 $headList[$key] = iconv('utf-8', 'gbk', $value); } //將數據經過fputcsv寫到文件句柄 fputcsv($fp, $headList); //計數器 $num = 0; //每隔$limit行,刷新一下輸出buffer,不要太大,也不要過小 $limit = 100000; //逐行取出數據,不浪費內存 $count = count($dataList); for ($i = 0; $i < $count; $i++) { $num++; //刷新一下輸出buffer,防止因爲數據過多形成問題 if ($limit == $num) { ob_flush(); flush(); $num = 0; } $row = $dataList[$i]; foreach ($row as $key => $value) { $row[$key] = iconv('utf-8', 'gbk', $value); } fputcsv($fp, $row); } return $fileName; }