- 背景
最近,后台运营职员要求导出的 Excel 文件,
要求可以或许满足对于 [下单日期] 的筛选利用,即满足在年份、月份上的选择
通过了解,发现:
先前导出的文件,默认列数据都是字符串(文本)格式,需对指定的列变动为日期格式
同时,参考了网上的众多履历都多多少少难以实现
其次因为 Laravel-excel 控件版本的问题,要实现的方式也不同
在此,根据控件版本的不同,举行步骤整理,以便能资助到有必要的小同伴 …
- 所要告竣的目标
- 框架
- Laravel 版本: Laravel5.8
- Excel 版本: [maatwebsite/excel v2.1.*] [maatwebsite/excel 3.1]
复制代码 实现步骤
首先,确保你已经安装了 Laravel-Excel 包,可以通过 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??[];
- }
复制代码
- 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,归并单位格,设置样式,格式化列数据)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |