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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章