数据表导出为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手动导入PHPExcelvendor("PHPExcel.PHPExcel.PHPExcel");vendor("PHPExcel.PHPExcel.Writer.IWriter");vendor("PHPExcel.PHPExcel.Writer.Abstract");vendor("PHPExcel.PHPExcel.Writer.Excel5");vendor("PHPExcel.PHPExcel.Writer.Excel");vendor("PHPExcel.PHPExcel.IOFactory");$objPHPExcel = new \PHPExcel();$objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);$objWriter = new \PHPExcel_Writer_Excel($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, "Excel");$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中的路径。