匯出csv

風吹過有夏天的味道發表於2020-09-25

匯出方法

  /**
     * 匯出csv
     *
     * @param String $sFileName
     * @param array $aTitle
     * @param $oQuery
     * @param Closure $closure
     * @author zjh
     */
    public function csv(String $sFileName,Array $aTitle, $oQuery, Closure $closure)
    {
        // 設定過期時間
        set_time_limit(0);
        //處理需要匯出的資料
        //設定好告訴瀏覽器要下載excel檔案的headers
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment; filename="'. $sFileName .'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        $fp = fopen('php://output', 'a');//開啟output流
        fwrite($fp, "\xEF\xBB\xBF"); // 寫入bom 頭 可識別 utf8
        fputcsv($fp, $aTitle);//將資料格式化為CSV格式並寫入到output流中
        $accessNum = $oQuery->count();//從資料庫獲取總量,假設是一百萬
        $perSize = 10000;//每次查詢的條數
        $pages   = ceil($accessNum / $perSize);
        for($i = 1; $i <= $pages; $i++) {
            //需要匯出的資料
            $oCollection = $oQuery->forPage($i,$perSize)->get();
            foreach($oCollection as $obj) {
                $rowData = $closure($obj); //返回 array
                fputcsv($fp, $rowData);
            }
            unset($oCollection);//釋放變數的記憶體
            //重新整理輸出緩衝到瀏覽器
            if (ob_get_level() > 0) {
                ob_flush();
            }
        }
        fclose($fp);
        exit();
    }

使用

   // 定義表頭
        $aTitle=[
            '編號','使用者姓名','郵箱','建立時間'
        ];
        // 匯出檔名
        $csvFileName = '使用者資料統計.csv';
        // 資料來源 使用DB::table方式更高效
        $oQuery = DB::table("users")->select('id','name','email','created_at');
        // 資料加工
        $this->csv($csvFileName,$aTitle,$oQuery,function ($obj){
            return [
                $obj->id , $obj->name ,$obj->email, $obj->created_at
            ];
        });

注意事項

  • 表頭Tile不要以英文字母開頭,否則開啟會有檔案損壞的不友好提示
本作品採用《CC 協議》,轉載必須註明作者和本文連結
喜歡的話就點個贊吧!

相關文章