• Laravel 使用Excel导出的文件中,指定列数据格式为日期,方便后期的数据筛选操作


    • 背景

      最近,后台运营人员要求导出的 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:
    

    ①. laravel-excel2.1 版本下实现方式

    参考文章: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 版本下实现方式

    
    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';
        }
    }
    
    • 导出文件,参考截图如下:

    附录

  • 相关阅读:
    [Linux] 进程等待
    SystemVerilog——class类
    密码学 aes rsa 分段加密 填充 rsakey 生成
    Windows与网络基础-17-组策略应用
    centos7安装tomcat9过程
    un9.20:解决项目启动时端口被占用的问题。
    css实现动画效果 animation: showLayer 0.2s linear both
    docker入门加实战—Docker镜像和Dockerfile语法
    云计算基础-计算虚拟化-CPU虚拟化
    华为机试真题 Java 实现【最多团队】
  • 原文地址:https://blog.csdn.net/u011415782/article/details/140948596