-
背景
最近,后台运营人员要求导出的
Excel
文件,
要求能够满足对于 [下单日期] 的筛选操作,即满足在年份、月份上的选择通过了解,发现:
先前导出的文件,默认列数据都是字符串(文本)格式,需对指定的列变更为日期格式
同时,参考了网上的众多经验都多多少少难以实现
其次因为Laravel-excel
控件版本的问题,要实现的方式也不同
在此,根据控件版本的不同,进行步骤整理,以便能帮助到有需要的小伙伴 … -
所要达成的目标
-
框架
Laravel 版本: Laravel5.8
Excel 版本: [maatwebsite/excel v2.1.*] [maatwebsite/excel 3.1]
实现步骤
首先,确保你已经安装了
Laravel-Excel
包,可以通过Composer
安装
composer
安装指令如下:
# 默认最新版本安装指令
composer require maatwebsite/excel# 如果指定版本,需知道版本号
composer require maatwebsite/excel:<version>
①. laravel-excel2.1 版本下实现方式
- 参考技术文档:Laravel Excel2.1 - Column formatting
参考文章:laravel-excel 导出的时候写入的日期格式数据怎么在excel中正确显示成可以筛选的日期格式数据
提示
1. 根据实际操作,发现,对于下单日期的写入,需计算从 1900-01-01到目标日期的天数
2. 但是,还需多添加两天(容错处理,验证所得,可百度解释)
3. 并且,无需手动 在天数后面拼接一个"\t"
- 调用参考
//指定下单日期,需要计算从 1900-01-01到目标日期的天数
...
//举例
$order_create_date = '2024-07-23';
$excelListData['下单日期'] = get_days_since1900($order_create_date);
$this->saveExcel($title, $excelListData,'订单列表',['W' => 'yyyy-mm-dd']);
- 整理 保存 Excel 文件方法
saveExcel()
、get_days_since1900()
/*** @notes:保存 Excel文件* @param string $title 标题* @param array $cellData 数据* @param string $sheetName 工作表名* @param array $columnFormat 列格式* @Time: 2024/8/6 9:38*/public function saveExcel($title = 'title', $cellData = [], $sheetName = 'sheet1',$columnFormat = []){Excel::create($title, function ($excel) use ($cellData, $sheetName,$columnFormat) {$excel->sheet($sheetName, function ($sheet) use ($cellData,$columnFormat) {if ($columnFormat){//设置列格式$sheet->setColumnFormat($columnFormat);}$sheet->rows($cellData);});})->store('xlsx'); // 文件默认保存到storage/exports目录下}/*** @notes:获取 从1900-01-01的天数* @param string $curr_date 目标日期* @return false|int 测试发现,计算所得的天数需加2,才能满足当前应用* @throws Exception* @author: zhanghj* @Time: 2024/8/6 10:10*/
function get_days_since1900($curr_date = '') {$date = new \DateTime($curr_date);$date1900 = new \DateTime('1900-01-01');$interval = $date1900->diff($date)->days;return intval($interval+2);
}
②. laravel-excel3.1 版本下实现方式
-
参考技术文档:Laravel Excel3.0 Formatting columns
-
创建导出类 UserExport.php
<?php
namespace App\Http\Model;use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Shared\Date;/*** Excel 导出类* Class UserExport* @package App\Http\Model*/
class UserExport implements FromCollection,WithMapping,WithHeadings,WithColumnFormatting
{use Exportable;public function collection(){return (new User())->getExportData();}public function map($row): array{$dateTime = new \DateTime($row->reg_date);// 数据映射逻辑return [$row->id,$row->nick_name,Date::dateTimeToExcel($dateTime),// 确保这里是日期格式$row->auth_tel,// ...其他数据映射];}public function headings(): array{// 表头return ['ID','昵称','注册日期','手机号码'// ...其他表头];}public function columnFormats(): array{// 设置日期格式的筛选return ['C' => NumberFormat::FORMAT_DATE_YYYYMMDD,// ...其他格式];}
}
- 参考,绑定的数据源获取方法
/*** @notes:获取导出的数据* @return array 注意返回的数据为 Collection 集合形式* @author: zhanghj* @Time: 2024/8/6 17:14*/public function getExportData(){$list = $this->select('id','nick_name','reg_time','auth_tel')->limit(7)->get();foreach ($list as $key => $value){$dateString = date("Y-m-d",$value['reg_time']??0);$list[$key]['reg_date'] = $dateString;}return $list??[];}
- controller 调用方法,参考如下:
class TestController extends Controller
{public function index(){$filePath = 'exports/users_'.time().'.xlsx';//将文件存储到目录 “storage\app\exports” 下$export = Excel::store(new UserExport(2018),$filePath);//return Excel::download(new UserExport,$filePath); //如果直接浏览器下载文件,需注意路径不能有 /return 'Test - MT';}
}
- 导出文件,参考截图如下:
附录
- 参考文章
- laravel-excel导出的时候写入的日期格式数据怎么在excel中正确显示成可以筛选的日期格式数据
- Laravel Excel 3.1 导出表格详解(自定义sheet,合并单元格,设置样式,格式化列数据)