数据表导出为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中的路径。