1. 程式人生 > >PHP實現匯出CSV檔案

PHP實現匯出CSV檔案

在做匯出一個資訊表為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鍵上方的鍵),據說微信導資料是這樣處理的。哈哈哈 我這邊的困擾的時候老大讓我加上公司字首。我怎麼沒想到,我怎麼沒想到,我怎麼沒想到。。。估計為了轉這個也是腦折路了。