TP5使用PHPExcel将数据动态导出为Excel表格

数据表导出为Excel是CMS系统中很常见的功能,PHPExcel即使已经被作者停更但是依然是一个很好的选择,首先要知道的是PHPExcel不支持Composer下载,所以我们需要去Github中手动下载并导入到TP5框架中。可以点我下载。

下载好压缩包解压出来后找到Classes中的PHPExcel文件夹和PHPExcel.php,我们只需要这两个文件,接下来打开你项目中的vendor目录,在里面新建一个名为PHPExcel的文件夹(文件夹命名可以自定义但是手动导入时要对应起来,这里以我的项目为例),至此我们就将PHPExcel导入到我们项目中了。

接下来直接说明如何在控制器中得以运用,因为导出Excel属于公共功能,所以我习惯将其放入TP5公共函数common.php中,这样不管在CMS哪个模块只需调用方法即可。

目前网上也有很多PHPExcel的教程但是里面内容都是写死的,比如表头命名,表里数据都是写死的,这样重用性太低了,既然作为公共函数使用那么一定要具有动态性,所以我对其进行了改进,使用时只需在其他控制器中定义好表头,数据数组,表名,将其作为参数传入即可得到想要的Excel表,代码如下:

function exportExcel($tableHead='',$tableBody='',$title='')
    {
        $path = dirname(__FILE__);
        //通过vendor手动导入PHPExcel
        vendor("PHPExcel.PHPExcel.PHPExcel");
        vendor("PHPExcel.PHPExcel.Writer.IWriter");
        vendor("PHPExcel.PHPExcel.Writer.Abstract");
        vendor("PHPExcel.PHPExcel.Writer.Excel5");
        vendor("PHPExcel.PHPExcel.Writer.Excel2007");
        vendor("PHPExcel.PHPExcel.IOFactory");
        $objPHPExcel = new \PHPExcel();
        $objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
        $objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel);

    //	示例数据
    //	$tableHead = ['用户编号','姓名','会员状态','头像地址','已提现金额','可提现金额','不可提现金额','电话',
    //	'注册时间','更新时间','IP地址', '积分','密码','上级ID','顶级ID','身份证','token','最后登陆时间','银行卡号'];
    // 	$tableBody = Db::table('user')->select();
    // 	$title = 'UserSheet';

        $cellKey = array(
            'A','B','C','D','E','F','G','H','I','J','K','L','M',
            'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
            'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM',
            'AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'
        );

        //写入表头字段
        $i = 0;
        foreach ($tableHead as $key=>$value)
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$i++].'1',$value);

        //写入表体数据
        $count = count($tableBody);
        for ($i = 2; $i < $count+2 ; $i++) {
            $x = 0;
            foreach ($tableBody[$i-2] as $key=>$value)
            {
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$x++].$i,$value);
            }
        }

    $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth('20');    //修改默认列宽
    $objPHPExcel->getActiveSheet()->setTitle('companyInformation');      //设置sheet的名称
    $objPHPExcel->setActiveSheetIndex(0);                   //设置sheet的起始位置
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');   //通过PHPExcel_IOFactory的写函数将上面数据写出来
    $PHPWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
    $ua = $_SERVER['HTTP_USER_AGENT'];
    $ua = strtolower($ua);
    if(preg_match('/msie/',$ua) || preg_match('/edge/',$ua)) { //判断是否为IE或Edge浏览器
        $title = str_replace('+', '%20', urlencode($title)); //使用urlencode对文件名进行重新编码
    }
    header('Content-Disposition: attachment;filename='.$title.'.xlsx');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

    $PHPWriter->save("php://output"); //表示在$path路径下面生成xlsx文件
    }

这里注意PHPExcel不是通过composer安装所以在TP框架中没有命名空间,需要使用vendor手动导入,如果你的PHPExcel文件夹和PHPExcel.php在框架中的目录位置和我不同则需修改vendor中的路径。

发布了29 篇原创文章 · 获赞 1 · 访问量 7833

猜你喜欢

转载自blog.csdn.net/qq_38280150/article/details/100040402