PHP實現匯出CSV檔案
阿新 • • 發佈:2019-01-10
在做匯出一個資訊表為excel檔案這個功能完成之後,自己用得好好的,但是到HR那邊就告訴我匯出的檔案無法用她電腦上的office開啟,心想,相容沒做好,想問下她的版本號,結果半天沒回復訊息。我老大來了句:轉csv檔案吧,沒有相容性的說法。
然後開始折騰csv,在這之前我只是見過“匯出csv檔案”的字樣,沒有涉及過這個。
當然一開始要去了解一下csv是什麼: https://baike.baidu.com/item/CSV/10739。
然後還是先附上程式碼:
public function exportCSVAction() { $id = intval($this->_req->getParam('cid',0)); $reg = new RegistrationModel(); $studentsArr = $reg->getStudents($id); // 獲取課程及報名學員資訊 $fileName = $studentsArr['info']['title']; //這裡定義表名。簡單點的就直接 $fileName = time(); header('Content-Type: application/vnd.ms-excel'); //header設定 header("Content-Disposition: attachment;filename=".$fileName.".csv"); header('Cache-Control: max-age=0'); $fp = fopen('php://output','a'); //開啟php檔案控制代碼,php://output表示直接輸出到PHP快取,a表示將輸出的內容追加到檔案末尾 $head = array('工號','部門名','崗位名','學員名','報名時間','狀態','課程建議'); //表頭資訊 foreach($head as $k=>$v){ $head[$k] = iconv("UTF-8","GBK//IGNORE",$v); //將utf-8編碼轉為gbk。理由是: Excel 以 ANSI 格式開啟,不會做編碼識別。如果直接用 Excel 開啟 UTF-8 編碼的 CSV 檔案會導致漢字部分出現亂碼。 } fputcsv($fp,$head); //fputcsv() 函式將行格式$head化為 CSV 並寫入一個開啟的檔案$fp。 if (!empty($studentsArr['students'])) { $data = []; //要匯出的資料的順序與表頭一致;提前將最後的值準備好(比如:時間戳轉為日期等) foreach ($studentsArr['students'] as $key => $val) { $data['empno'] = "xm-".$val['empno']; $data['dept'] = $val['dept_name'].'-'.$val['job_name']; $data['post'] = $val['post']; $data['username'] = $val['username']; $data['create_time'] = " ".date('Y-m-d H:i', $val['create_time']); //excel對大數字會自動轉科學計數法表示,所以這裡加個“”空格是將數字轉字串,這個有多種方式,具體怎麼方便怎麼來。 switch ($val['status']) { case 0: $data['status'] = '請假'; break; case 1: $data['status'] = '正常'; break; case 2: $data['status'] = '已取消'; break; case 3: $data['status'] = '缺席'; break; } $data['advices'] = $val['advices']; foreach($data as $i=> $item){ //$item為一維陣列哦 $data[$i] = iconv("UTF-8","GBK//IGNORE",$item); //轉為gbk的時候可能會遇到特殊字元‘-’之類的會報錯,加 ignore表示這個特殊字元直接忽略不做轉換。 } fputcsv($fp,$data); } exit; //記得加這個,不然會跳轉到某個頁面。 } }
過程中遇到知識點:
* iconv的使用:http://php.net/manual/zh/function.iconv.php;
* fputcsv的使用:http://php.net/manual/zh/function.fputcsv.php。
匯出檔案實現過程中折騰點:
* 我這裡的工號其實有存在前面的數字為0的情況(比如:0123、0001),匯出的檔案用excel開啟後就變成123、1 啦,這明顯不合我的要求。然後就開始找如何加上這前面的0呢。想著是不是有個函式處理一下,好吧。沒有。阿歐。
最後看到的比較好的處理方法:
在要處理的欄位前加個轉義符‘`’(英文輸入法下的tab鍵上方的鍵),據說微信導資料是這樣處理的。哈哈哈 我這邊的困擾的時候老大讓我加上公司字首。我怎麼沒想到,我怎麼沒想到,我怎麼沒想到。。。估計為了轉這個也是腦折路了。