thinkphp5.1使用PHPExcel()导出数据

thinkphp5.1使用PHPExcel()导出数据

项目需求需要将数据查询后导出数据,本来是想用layui里面的tool直接下载下来就好了。但是数据量大了,这就行不同了,必须要用到PHPExcel。

在网上找了很多,大部分都是基于5.0的。代码粘贴在5.1里面就跑不起来。唉。。。度娘了几分钟发现,thinkphp5.1已经不在支持vendor和import了,只支持命名空间和懒加载,可是对我这样的新手来说真的是不知道怎么处理了。然后就一直测试,调试,报错,爬坑真的很难,没个大神指导真的难。
然后在某一个角落发现了一个方法,很简单,也很容易理解,所以就记录一下自己的成长。

1、首先composer下载PHPExcel(),这个方法很简单哈!
composer require phpoffice/phpexcel
下载下来,只要里面的classes就好了,这个下载的方法网上有很多,就不做具体说明。
2、放在你想放的位置,只要你自己记着就好,我看thinkphp官网说tp6的正式版本的发布日期推迟到10月24日,我们还是放在vendor里面吧。
3、我对这个命名空间和懒加载理解还是不够深刻,就是解决不了,所以就只能 用require的方法来实现引入了,这里面我走了好多坑

require dirname(dirname(dirname(__DIR__))).'/vendor/PHPExcel/PHPExcel.php';

就这一句代码,放在最开头,替换掉之前的import或者是vendor,然后再控制器里面调用,记得要加上反斜杠,

 $objPhpExcel=new \PHPExcel();

好了,现在把我的例子在放出来,供大家参考

 //查找出需要导出的数据
    public function DatasToExcel(){
        $data = input('param.');
        $data['time'] = $data['time']=="" ? '' : $this->cut_time($data['time']);
        $arr = $this->sele_data($data);
        return $arr;
    }
 //需要下载的数据
    public function sele_data($data){

        //什么都没选择none
        if($data['app_url']=='0' && $data['time']==''){
            $arr['data'] = con::con('allshow')
                ->order('id desc')
                ->select();
            return $arr;
            //only url
        }elseif ($data['app_url']!='0' && $data['time']=='') {

            $arr['data'] = con::con('allshow')
                ->where('location',$data['app_url'])
                ->order('id desc')
                ->select();

            return $arr;
            //only time
        }elseif ($data['app_url']=='0' && $data['time'] !='') {

            $arr['data'] = con::con('allshow')
                ->where('time','>',$data['time']['Btime'])
                ->where('time','<',$data['time']['Etime'])
                ->order('id desc')
                ->select();

            return $arr;
            //choose all
        }else{
            $arr['data'] = con::con('allshow')
                ->where('location',$data['app_url'])
                ->where('time','>',$data['time']['Btime'])
                ->where('time','<',$data['time']['Etime'])
                ->order('id desc')
                ->select();
            return $arr;
        }

    }


public function ExportExcel(){
        $datas = $this->DatasToExcel();//将需要导出的数据转换成数组格式
       // var_dump($datas);
        //此处需要自己根据自己的数据进行修改
        for ($i=0; $i < count($datas['data']) ; $i++) {//拼接数据,形成新的数组,用来装新导出的数据
            $data[$i]['id'] = $datas['data'][$i]["id"];
            $data[$i]['location'] = $datas['data'][$i]["location"];
            $data[$i]['souword'] = $datas['data'][$i]["souword"];
            $data[$i]['copy_content'] = $datas['data'][$i]["copy_content"];
            $data[$i]['equipment'] = $datas['data'][$i]["equipment"];
            $data[$i]['sourceType']=$datas['data'][$i]["sourceType"];
            if($datas['data'][$i]["user_type"]=='1'){
                $data[$i]['user_type'] ="点击复制";
            }elseif ($datas['data'][$i]["user_type"]=='2'){
                $data[$i]['user_type'] ="长按复制";
            }
            //$data[$i]['user_type'] = $datas['data'][$i]["user_type"];

            $data[$i]['user_ip'] = $datas['data'][$i]["user_ip"];
            $data[$i]['utm_medium'] = $datas['data'][$i]["utm_medium"];
            $data[$i]['utm_content'] = $datas['data'][$i]["utm_content"];
            $data[$i]['utm_term'] = $datas['data'][$i]["utm_term"];
            $data[$i]['region'] = $datas['data'][$i]["region"];
            $data[$i]['city'] = $datas['data'][$i]["city"];
            $data[$i]['time'] = date("Y-m-d H:i:s",$datas['data'][$i]["time"]);
            $data[$i]['times'] =  date("H",$datas['data'][$i]["time"]);

        }
        // var_dump($data);

        try {
           

            //实例化类包 不用改
            $objPhpExcel=new \PHPExcel();


            //所有单元格进行垂直和水平居中设置  不用改
            $objPhpExcel ->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPhpExcel->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);


            /*
             设置表头标题,这里根据自己实际数据的需求写
            */
            $rowVal = array(
                0=>'编号',
                1=>'链接',
                2=>'搜索词',
                3=>'复制内容',
                4=>'平台',
                5=>'设备',
                6=>'操作类型',
                7=>'访问ip',
                8=>'计划',
                9=>'单元',
                10=>'关键字',
                11=>'省',
                12=>'市',
                13=>'时间',
                14=>'小时'
            );



            //设置表头的样式,你别管,这里不用你改,照抄。
            foreach ($rowVal as $k=>$r){
                $objPhpExcel
                    ->getActiveSheet()
                    ->getStyleByColumnAndRow($k,1)
                    ->getFont()->setBold(true);//字体加粗
                $objPhpExcel
                    ->getActiveSheet()
                    ->getStyleByColumnAndRow($k,1)
                    ->getAlignment()
                    ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//文字居中
                $objPhpExcel
                    ->getActiveSheet()
                    ->setCellValueByColumnAndRow($k,1,$r);

            }

            //设置当前的sheet索引 用于后续内容操作  这里也不用你改,抄吧
            $objPhpExcel->setActiveSheetIndex(0);
            $objActSheet=$objPhpExcel->getActiveSheet();

            //设置表格的宽度  根据情况修改
            $objActSheet->getColumnDimension('A')->setWidth(10);//编号
            $objActSheet->getColumnDimension('B')->setWidth(30);//备注
            $objActSheet->getColumnDimension('C')->setWidth(30);//备注
            $objActSheet->getColumnDimension('D')->setWidth(30);//备注
            $objActSheet->getColumnDimension('E')->setWidth(10);//备注
            $objActSheet->getColumnDimension('F')->setWidth(20);//备注
            $objActSheet->getColumnDimension('G')->setWidth(20);//备注
            $objActSheet->getColumnDimension('H')->setWidth(50);//备注
            $objActSheet->getColumnDimension('I')->setWidth(50);//备注
            $objActSheet->getColumnDimension('J')->setWidth(50);//备注
            $objActSheet->getColumnDimension('K')->setWidth(50);//备注
            $objActSheet->getColumnDimension('L')->setWidth(50);//备注
            $objActSheet->getColumnDimension('M')->setWidth(50);//备注
            $objActSheet->getColumnDimension('N')->setWidth(50);//备注
            $objActSheet->getColumnDimension('O')->setWidth(50);//备注

            /*
           设置Excel表的名称  别抄 自己写
            */
            $title="数据总表";//
            $objActSheet->setTitle($title);

            //设置单元格内容
            //var_dump($data);die;
            foreach($data  as $k => $v)
            {
                $num=$k+2;
                $objPhpExcel ->setActiveSheetIndex(0)
                    //Excel的第A列,id是你查出数组的键值,下面以此类推

                    /*这里你别抄,我们不一样,$v['id']这些是你数据库中拿出来的数据字段  修改成自己的
                    //*/
                    ->setCellValue('A'.$num, $v['id'])/*编号*/
                    ->setCellValue('B'.$num, $v['location'])/*仓库名*/
                    ->setCellValue('C'.$num, $v['souword'])/*创建时间*/
                    ->setCellValue('D'.$num, $v['copy_content'])/*最近的修改时间*/
                    ->setCellValue('E'.$num, $v['sourceType'])/*状态*/
                    ->setCellValue('F'.$num, $v['equipment'])/*有无货架*/
                    ->setCellValue('G'.$num, $v['user_type'])/*创建ip*/
                    ->setCellValue('H'.$num, $v['user_ip'])/*创建ip*/
                    ->setCellValue('I'.$num, $v['utm_medium'])/*创建ip*/
                    ->setCellValue('J'.$num, $v['utm_content'])/*创建ip*/
                    ->setCellValue('K'.$num, $v['utm_term'])/*创建ip*/
                    ->setCellValue('L'.$num, $v['region'])/*创建ip*/
                    ->setCellValue('M'.$num, $v['city'])
                    ->setCellValue('N'.$num, $v['time'])
                    ->setCellValue('O'.$num, $v['times']);
                }

                $name=date('Y-m-d-H-i');//设置文件名

                //*抄吧*/
                header("Content-Type: application/force-download");
                header("Content-Type: application/octet-stream");
                header("Content-Type: application/download");
                header("Content-Transfer-Encoding:utf-8");
                header("Pragma: no-cache");
                header('Content-Type: application/vnd.ms-excel');
                header('Content-Disposition: attachment;filename="'.$title.'_'.urlencode($name).'.xls"');
                header('Cache-Control: max-age=0');
                $objWriter = \PHPExcel_IOFactory::createWriter($objPhpExcel, 'Excel5');
                $objWriter->save('php://output');
                // return $objWriter;

        } catch (Exception $e) {
            $this->error('操作异常');
        }

    }


好了,现在在前端页面调用ExportExcel()方法就能实现了数据转excel了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值