使用csv批量匯入、匯出資料的需求處理

ruanwenwu發表於2020-09-30

需求

運營的同學編輯好問題後,放入csv檔案中。上傳csv檔案,將檔案中的問題批量匯入問答庫中,並記錄編輯考核數量。需要按批次記錄上傳資料,並可以進行分批次查詢與資料匯出

匯入

讀取csv檔案有兩種辦法,一種是用file方法讀取全部行,然後用逗號進行分割。但是這種辦法碰到文章中本身有逗號的情況就會有問題。另外一種就是用fgetcsv方法,這種方法比較靠譜。

 while($data = fgetcsv($fileObj)){
            $title = $data[0];
            $content = $data[1];
}

讀取出來有個編碼的問題。因為每個人環境不一樣,導致上傳者的編碼很有可能不一致。這樣解決:

 function getSafeStr($str){
        $s1 = iconv('utf-8','gbk//IGNORE',$str);
        $s0 = iconv('gbk','utf-8//IGNORE',$s1);
        if($s0 == $str){
            return $s1;
        }else{
            return $str;
        }
    }

之前試過通過判斷輸入資料的編碼得到這個編碼,然後再做編碼轉化,效果不行。

匯出

用table的方式匯出資料。注意頭資訊的設定:

$ExcelStr = '<html>
                        <head>
                           <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
                        </head>
                        <body><table><tr><th>Id</th><th>標題</th><th>使用者</th><th>回覆數</th><th>提問時間</th><th>url地址</th></tr> ';
        if($data && is_array($data)){


            foreach ($data as $dk => $dv){
                $url = "http:///{$dv['z_id']}.html";
                $key = $dk + 1;
                $askTime = date("Y-m-d H:i:s",$dv['z_ask_time']);
                $ExcelStr.= "<tr><td>{$key}</td><td>{$dv['z_title']}</td><td>{$dv['z_userid']}</td><td>{$dv['z_reply']}</td><td>{$askTime}</td><td>{$url}</td></tr>";
            }
        }
        $ExcelStr .= "</table></body></html>";
        $ExcelStr = Libs_Global_Fun::changeCode($ExcelStr);
        header('Cache-Control: no-cache, must-revalidate');
        header('Content-type: application/vnd.ms-excel;');
        header('Content-Disposition: filename=' . date("Y年m月d日") . $patchId . '.xls');
        exit($ExcelStr);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章