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:<version>

①. 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 版本下实现方式

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

附录

$colKey = 'W';
$columnFormat = ['W'=>'yyyy-mm-dd'];
$work_sheet->getStyle($colKey)->getNumberFormat()->setFormatCode($columnFormat[$colKey]);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值