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

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493


  • 背景
    最近,后台运营职员要求导出的 Excel 文件,
    要求可以或许满足对于 [下单日期] 的筛选利用,即满足在年份、月份上的选择
    通过了解,发现:
    先前导出的文件,默认列数据都是字符串(文本)格式,需对指定的列变动为日期格式
    同时,参考了网上的众多履历都多多少少难以实现
    其次因为 Laravel-excel 控件版本的问题,要实现的方式也不同
    在此,根据控件版本的不同,举行步骤整理,以便能资助到有必要的小同伴 …
  • 所要告竣的目标

  • 框架
  1. Laravel 版本:        Laravel5.8
  2. Excel   版本:        [maatwebsite/excel v2.1.*]  [maatwebsite/excel 3.1]
复制代码

实现步骤

   首先,确保你已经安装了 Laravel-Excel 包,可以通过 Composer 安装
  

  • composer 安装指令如下:
  1. # 默认最新版本安装指令
  2. composer require maatwebsite/excel
  3. # 如果指定版本,需知道版本号
  4. composer require maatwebsite/excel:<version>
复制代码
①. laravel-excel2.1 版本下实现方式



  • 参考技能文档:Laravel Excel2.1 - Column formatting
   参考文章:laravel-excel 导出的时间写入的日期格式数据怎么在excel中正确显示成可以筛选的日期格式数据
  

  • 提示
  1. 1. 根据实际操作,发现,对于下单日期的写入,需计算从 1900-01-01到目标日期的天数
  2. 2. 但是,还需多添加两天(容错处理,验证所得,可百度解释)
  3. 3. 并且,无需手动 在天数后面拼接一个"\t"
复制代码


  • 调用参考
  1. //指定下单日期,需要计算从 1900-01-01到目标日期的天数
  2. ...
  3. //举例
  4. $order_create_date = '2024-07-23';
  5. $excelListData['下单日期'] = get_days_since1900($order_create_date);
  6. $this->saveExcel($title, $excelListData,'订单列表',['W' => 'yyyy-mm-dd']);
复制代码


  • 整理 保存 Excel 文件方法 saveExcel()、get_days_since1900()
  1.     /**
  2.      * @notes:保存 Excel文件
  3.      * @param string $title     标题
  4.      * @param array $cellData   数据
  5.      * @param string $sheetName 工作表名
  6.      * @param array $columnFormat 列格式
  7.      * @Time: 2024/8/6 9:38
  8.      */
  9.     public function saveExcel($title = 'title', $cellData = [], $sheetName = 'sheet1',$columnFormat = [])
  10.     {
  11.         Excel::create($title, function ($excel) use ($cellData, $sheetName,$columnFormat) {
  12.             $excel->sheet($sheetName, function ($sheet) use ($cellData,$columnFormat) {
  13.                 if ($columnFormat){
  14.                         //设置列格式
  15.                     $sheet->setColumnFormat($columnFormat);
  16.                 }
  17.                 $sheet->rows($cellData);
  18.             });
  19.         })->store('xlsx'); // 文件默认保存到storage/exports目录下
  20.     }
  21. /**
  22. * @notes:获取 从1900-01-01的天数
  23. * @param string $curr_date 目标日期
  24. * @return false|int  测试发现,计算所得的天数需加2,才能满足当前应用
  25. * @throws Exception
  26. * @author: zhanghj
  27. * @Time: 2024/8/6 10:10
  28. */
  29. function get_days_since1900($curr_date = '') {
  30.     $date = new \DateTime($curr_date);
  31.     $date1900 = new \DateTime('1900-01-01');
  32.     $interval = $date1900->diff($date)->days;
  33.     return intval($interval+2);
  34. }
复制代码
②. laravel-excel3.1 版本下实现方式



  • 参考技能文档:Laravel Excel3.0 Formatting columns
  • 创建导出类 UserExport.php
  1. <?php
  2. namespace App\Http\Model;
  3. use Maatwebsite\Excel\Concerns\Exportable;
  4. use Maatwebsite\Excel\Concerns\FromCollection;
  5. use Maatwebsite\Excel\Concerns\WithColumnFormatting;
  6. use Maatwebsite\Excel\Concerns\WithHeadings;
  7. use Maatwebsite\Excel\Concerns\WithMapping;
  8. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  9. use PhpOffice\PhpSpreadsheet\Shared\Date;
  10. /**
  11. * Excel 导出类
  12. * Class UserExport
  13. * @package App\Http\Model
  14. */
  15. class UserExport implements FromCollection,WithMapping,WithHeadings,WithColumnFormatting
  16. {
  17.     use Exportable;
  18.     public function collection()
  19.     {
  20.         return (new User())->getExportData();
  21.     }
  22.        
  23.     public function map($row): array
  24.     {
  25.         $dateTime = new \DateTime($row->reg_date);
  26.         // 数据映射逻辑
  27.         return [
  28.             $row->id,
  29.             $row->nick_name,
  30.             Date::dateTimeToExcel($dateTime),// 确保这里是日期格式
  31.             $row->auth_tel,
  32.             // ...其他数据映射
  33.         ];
  34.     }
  35.     public function headings(): array
  36.     {
  37.         // 表头
  38.         return [
  39.             'ID',
  40.             '昵称',
  41.             '注册日期',
  42.             '手机号码'
  43.             // ...其他表头
  44.         ];
  45.     }
  46.     public function columnFormats(): array
  47.     {
  48.         // 设置日期格式的筛选
  49.         return [
  50.             'C' => NumberFormat::FORMAT_DATE_YYYYMMDD,
  51.             // ...其他格式
  52.         ];
  53.     }
  54. }
复制代码


  • 参考,绑定的数据源获取方法
  1.     /**
  2.      * @notes:获取导出的数据
  3.      * @return array 注意返回的数据为 Collection 集合形式
  4.      * @author: zhanghj
  5.      * @Time: 2024/8/6 17:14
  6.      */
  7.     public function getExportData(){
  8.         $list = $this->select('id','nick_name','reg_time','auth_tel')->limit(7)->get();
  9.         foreach ($list as $key => $value){
  10.             $dateString = date("Y-m-d",$value['reg_time']??0);
  11.             $list[$key]['reg_date'] = $dateString;
  12.         }
  13.         return $list??[];
  14.     }
复制代码


  • controller 调用方法,参考如下:
  1. class TestController extends Controller
  2. {
  3.     public function index()
  4.     {
  5.        $filePath = 'exports/users_'.time().'.xlsx';
  6.        //将文件存储到目录 “storage\app\exports” 下
  7.        $export = Excel::store(new UserExport(2018),$filePath);
  8.                 //return Excel::download(new UserExport,$filePath); //如果直接浏览器下载文件,需注意路径不能有 /
  9.         return 'Test - MT';
  10.     }
  11. }
复制代码


  • 导出文件,参考截图如下:


附录



  • 参考文章

    • laravel-excel导出的时间写入的日期格式数据怎么在excel中正确显示成可以筛选的日期格式数据
    • Laravel Excel 3.1 导出表格详解(自界说sheet,归并单位格,设置样式,格式化列数据)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表