php 大數據量導入並直接下載CSV文件

php 大數據量導入並下載CSV文件

下面是實現代碼:

代碼解析:
頁面中的form表單提交到downExcel()這個方法中,然後這個方法調用setHeader()dataToCsv()
這兩個方法將從數據庫中讀取的數據通過瀏覽器下載到客戶端
其中dataToCsv()的最後exit()是必須的,否則會將頁面的代碼也下載到csv文件中

Class DownloadCsv{
   protected $tHead = [
    'ID',
    '測試1',
    '測試2',
    '測試3',
    '測試4',
    ];

    /**
     * 下載成csv文件,數據量大,所以不適用phpExcel
     * @return void
     */
    public function downExcel()
    {
        if($_POST) {
            $_POST['start'] && $_POST['end'] && $map['menu.loginTime']=['between',[strtotime($_POST['start']),strtotime($_POST['end'])]];
            !$_POST['start'] && $_POST['end'] && $map['menu.loginTime']=['<=',strtotime($_POST['end'])];
            $_POST['start'] && !$_POST['end'] && $map['menu.loginTime']=['>=',strtotime($_POST['start'])];
            $_POST['username'] && $map['user.username']=['=',$_POST['username']];
        }
        $map['menu.projectid'] = Session::get("project_id");
        $this->setHeader('ceshi');
        $this->dataToCsv($map,$this->tHead);
    }

    /**
     *  數據直接輸出到網頁下載
     * @param string $file csv文件的名稱
     * @return void
     */
    protected function setHeader($file)
    {
        $csvFileName = rtrim($file,'.'). '.csv';
        set_time_limit(0);
        header('Content-Description: File Transfer');
        header('Content-Type:text/csv');
        header('Content-Disposition: attachment; filename="'. $csvFileName .'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header("Content-Transfer-Encoding: binary");
    }

    /**
     * 從數據庫中循環查詢數據,並且需要處理的數據,
     * 可以在這裏驚醒替換等操作,然後寫入到瀏覽器中
     * 此方法是每次從數據庫中查詢500條信息,直到查詢到的數據
     * 小於500	
     * @param array $map 數據庫搜索的條件
     * @param array $columns 設置的表頭信息
     * @return void
     */
    protected function dataToCsv($map,$columns)
    {
        $record = new RecordModel();//實例化模型類
        $fp = fopen('php://output', 'a');
        mb_convert_variables('GBK', 'UTF-8', $columns);
        fputcsv($fp, $columns);
        $i  = 0;
        do
        {
            $list = $record -> record($map,$i*500);//每次從數據庫中查詢500條信息
            $num = count($list);
            foreach($list as $v) {
                $v['loginTime'] = date("Y-m-d H:i:s",$v['loginTime']);
                $v['status'] = $v['status']==1?'已完成':'未完成';
                mb_convert_variables('GBK', 'UTF-8', $v);
                fputcsv($fp, $v);
            }
            unset($list);
            $i++;
            ob_flush();
            flush();
        }while($num);
        fclose($fp);
        unset();
        exit(0);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章