作者:阿dai哥
教程分享
Tutorial to share
网络上关于Thinkphp5的教程非常多,从基础到实战,从简单到困难,应有尽有。以后我会在每天给大家分享一些项目实战的功能点,这些功能点都是我平时开发用到的,如果写的不好还望您指出来,大家一起学习交流。每天只需花2分钟的时间就可以丰富自己的知识和提高专业技能。
分享效果说明
Share the body
这是一个使用Thinkphp5导出Excel表格数据的功能,Thinkphp我用的是5.1的版本。只需要写一个函数就可以导出Excel,全网最简单使用的方法,没有之一。😂😂😂
1、html页面布局效果(代码就不贴出来了)
2、导出数据的Excel表格效果图
实现代码
The implementation code
由于我使用的是Thinkphp5框架实现的效果,所以开发先composer一下要用到的Excel包。
"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.*",
"phpoffice/phpexcel": "^1.8"
},
然后在common.php全局函数中写一个导出Excel类,这个很关键。整合过程主要是围绕当前类展开,这个类也很简单,稍微优点基础的人都能看得懂。下面就把代码贴出来来,直接拿过去就能用,什么都不需要改。
/**
* excel表格导出
* @param string $fileName 文件名称
* @param array $headArr 表头名称
* @param array $data 要导出的数据
* @author static7 */
function excelExport($fileName = '', $headArr = [], $data = []) {
$fileName .= "_" . date("Y_m_d", time()) . ".xls";
$objPHPExcel = new \PHPExcel();
$objPHPExcel->getProperties();
$key = ord("A"); // 设置表头
foreach ($headArr as $v) {
$colum = chr($key);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($colum . '1', $v);
$key += 1;
}
$column = 2;
$objActSheet = $objPHPExcel->getActiveSheet();
foreach ($data as $key => $rows) { // 行写入
$span = ord("A");
foreach ($rows as $keyName => $value) { // 列写入
$objActSheet->setCellValue(chr($span) . $column, $value);
$span++;
}
$column++;
}
$fileName = iconv("utf-8", "gb2312", $fileName); // 重命名表
$objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=$fileName");
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); // 文件通过浏览器下载
exit();
}
如何使用这个类呢?这个就更简单了,只要在你的控制器需要的地方直接引用当前的方法就可以了,根据上面的效果图,我的实现逻辑是这样的。在控制器中写一个 excel_class_save 的方法,根据相关的逻辑写代码就可以了,就是这么简单。当然只是实现功能而已,如果要做更好的优化性能请根据自己的需要相应的优化即可。
public function excel_class_save(Request $request)
{
$map = [];
$data = $this->request->param();
if(!empty($data['token'])){
$map['token'] = $data['token'];
}
if(!empty($data['domain'])){
$map['domain'] = $data['domain'];
}
if(!empty($data['pathname'])){
$map['pathname'] = $data['pathname'];
}
if($data['start_time'] && $data['end_time']){
$start_time = strtotime($data['start_time']);
$end_time = strtotime($data['end_time']) + 86300;
$list = OrderModel::order('create_at DESC')
->whereTime('create_at', 'between', [$start_time, $end_time])
->where($map)
->field('name, phone, address, domain, pathname, ip, create_at as times, time_id')
->select();
} else{
$list = OrderModel::order('create_at DESC')
->where($map)
->field('name, phone, address, domain, pathname, ip, create_at as times, time_id')
->select();
}
$list = json_decode( json_encode( $list),true);
$header = ['姓名', '手机号码', '详细地址', 'URL', '渠道', 'IP', '下单时间', '接听时段'];
excelExport('下单列表', $header, $list);
}
到了这里整个实现的逻辑都完成了,是不是很简单呀!