php csv导出封装方法 不需要三方类

记录下方法,日后Ctrl+c  Ctrl+v  做一个好的工程师~

<?php

    //导出csv 提交报告  
    public function contentDataExport(Request $request){
        $sql = 'SELECT q.title,t.content,t.created_at,u.truename FROM hy_questions_text t
        LEFT JOIN hy_questions q on t.qid = q.id
        LEFT JOIN hy_user u on t.uid = u.id
        WHERE t.del_status = 1';
        $list = DB::select($sql);

        $columnList = [
            ['width' => 30, 'name_str' => '调研问题', 'name' => 'title'],
            ['width' => 30, 'name_str' => '提交者姓名', 'name' => 'truename'],
            ['width' => 30, 'name_str' => '提交内容', 'name' => 'content'],
            ['width' => 30, 'name_str' => '提交时间', 'name' => 'created_at'],
        ];
        $results = [];
        for ($i=0; $i < count($list); $i++) { 
            $results[$i]['title'] = $list[$i]->title;
            $results[$i]['truename'] = $list[$i]->truename;
            $results[$i]['content'] = $list[$i]->content;
            $results[$i]['created_at'] = date('Y-m-d H:i:s',$list[$i]->created_at);
        }

        $tableList[] = [
            'title' => 'sheet1',
            'columnList' => $columnList,
            'dataList' => $results,
        ];
        $fileName = '痣在四方';
        $this->exportCsv($tableList,$fileName);
    }

  //生成csv方法
    public function exportCsv($tableList, $fileName)
    {
        try {
            set_time_limit(0);
            ini_set('memory_limit', '1024M');

            header('Content-Type: text/csv');
            header('Content-Disposition: attachment; filename="'.$fileName.'.csv"');
            header('Expires: 0');
            header('Cache-Control: must-revalidate,post-check=0,pre-check=0');
            header('Pragma: public');

            print(chr(0xEF).chr(0xBB).chr(0xBF));//设置utf-8 + bom ,处理汉字显示的乱码
            //fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 添加 BOM

            $fp = fopen('php://output', 'a');//打开output流

            //写入文件头
            $columns = collect($tableList[0]['columnList'])->pluck("name_str")->all();
            //mb_convert_variables('GBK', 'UTF-8', $columns);
            fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中


            //获取总数,分页循环处理
            $accessNum = collect($tableList[0]['dataList'])->count();
            $perSize = 1000;
            $pages   = ceil($accessNum / $perSize);
            for($i = 1; $i <= $pages; $i++) {
                $db_data = collect($tableList[0]['dataList'])->forPage($i,$perSize)->all();
                foreach($db_data as $key => $value) {
                    $rowData = [];

                    //获取每列数据,转换处理成需要导出的数据
                    foreach ($tableList[0]['columnList'] as $item){
                        $keyName = $item['name'];
                        $rowData[] = @$value[$keyName];
                    }

                    //需要格式转换,否则会乱码
                    //mb_convert_variables('GBK', 'UTF-8', $rowData);

                    fputcsv($fp, $rowData);
                }            //释放变量的内存
                unset($db_data);            //刷新输出缓冲到浏览器
                ob_flush();            //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
                flush();
            }

            fclose($fp);
            exit;
        }catch (\Exception $e){
            // \Log::DEBUG('[common/excel]'.$e->getMessage());
            return '';
        }
    }

两个function配合使用,contentDataExport作为访问方法, 直接生成文件 输出到浏览器~

C + V 即用,妈妈再也不用担心我百度三方导出excel插件了~

猜你喜欢

转载自blog.csdn.net/weixin_42616063/article/details/114632207