關於csv文件格式的導出導入個人見解
先上代碼:
<?php namespace think; class Csv { /** * 導出csv文件 * @param $list 數據源 * @param $title 數據列表 */ public function put_csv($list,$title) { $file_name = "exam".time().".csv";//文件名 header('Content-Type: application/vnd.ms-excel');//設置內容類型為Excel header('Content-Disposition: attachment;filename='.$file_name );//下載文件 header('Cache-Control: max-age=0');//表示當訪問此網頁后的0秒內再次訪問不會去服務器 $file = fopen('php://output',"a");//打開文件或者 URL, php://output 是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩沖區, a:寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創建之。 $limit = 1000; $calc = 0; foreach ($title as $v){ $tit[] = iconv('UTF-8', 'GB2312//IGNORE',$v);//轉碼 } fputcsv($file,$tit);//將行格式化為 CSV 並寫入一個打開的文件中。(標題) foreach ($list as $v){ $calc++; //-------核心!!!清空緩存,將緩存上的數據寫入到文件-------- if($limit == $calc){ ob_flush();//將本來存在輸出緩存中的內容取出來,調用ob_flush()之后緩沖區內容將被丟棄。 flush(); //待輸出的內容立即發送。 具體查看:https://www.jb51.net/article/37822.htm $calc = 0; }//-------核心-------- foreach($v as $t){ $tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t); } fputcsv($file,$tarr);//將行格式化為 CSV 並寫入一個打開的文件中。(內容) unset($tarr);//銷毀指定的變量 } unset($list);//銷毀指定的變量 fclose($file);//關閉打開的文件 exit(); } // csv導入,此格式每次最多可以處理1000條數據(我覺得這個是不對的,他規定的是讀取一行的最大長度) //$filename 文件路徑 public function input_csv($filename) { $csv_file = $handle = fopen($filename,'r');//只讀方式打開,將文件指針指向文件頭] $result_arr = array (); $i = 0; //函數從文件指針中讀入一行並解析 CSV 字段(一維數組) while($data_line = fgetcsv($csv_file,1000)) { //跳過第一行標題讀取 if ($i == 0) { $GLOBALS ['csv_key_name_arr'] = $data_line;//將標題存儲起來 $i ++; continue; } //讀取內容 foreach($GLOBALS['csv_key_name_arr'] as $csv_key_num => $csv_key_name ) { $csv_key_name = iconv('gb2312','utf-8', $csv_key_name);//標題 if(empty($data_line[$csv_key_num])) { $result_arr[$i][$csv_key_name] = ''; }else { $value = iconv('gb2312','utf-8', $data_line[$csv_key_num]);//標題對應的內容 $result_arr[$i][$csv_key_name] = $value; } } $i++; } fclose($handle); // 關閉指針 return $result_arr; } }
控制器的使用:
/** * 大數據改 導出 */ public function excelOut2() {// 不限制腳本執行時間以確保導出完成 // set_time_limit(0); $data = db('receive') -> where($where) -> order('create_time desc')-> select(); $csv_title = array('訂單編號','客戶姓名','客戶聯電','身份證號碼','收貨地址','發展渠道編碼','訂單日期','總部商城號碼','是否開戶','備注','用戶標識','開戶號碼','卡號','套餐','運單號','簽收時間','簽收狀態','異常標記','入網時間','首充時間','首充金額','發展渠道','對應區分','發展人電話','兌換碼','訂單類型','發貨人','發貨日期','異常原因','異常轉化情況','異常操作員工','異常操作時間','店鋪','登記時間'); //csv導出 $csv = new Csv(); //實例化后才可以調用之前類文件定義好的方法 $csv->put_csv($data, $csv_title); } /** * 大數據改 導入 */ public function excelIn3() { if (request() -> isPost()) { // 獲取表單上傳文件 $file = request()->file('examfile'); if(empty($file)) { $this->error('請選擇上傳文件'); } $info = $file->move(ROOT_PATH.'public'.DS.'upload'); //獲取文件(日期/文件),$info->getFilename(); $filename = ROOT_PATH.'public'.DS.'upload/'.$info->getSaveName(); // $handle = fopen($filename,'r');//只讀方式打開,將文件指針指向文件頭] $csv = new Csv(); $result = $csv->input_csv($filename); // 解析csv $len_result = count($result);//返回數目 if($len_result == 0){ $this->error('此文件中沒有數據!'); } // fclose($handle); // 關閉指針 dump($result); return ; } return $this -> fetch(); }
有什么不對的歡迎提出建議。
