【laravel】laravel Excel V3.1 导出方法详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010324331/article/details/83658747

放前面说的

本篇文章不适用于 laravel Excel 3.0 以下版本。

放中间说的( 这里是正文了 )

  1. 介绍
    LaravelExcel 旨在成为 Laravel 风格的 PhpSpreadsheet:围绕 PhpSpreadsheet 的简单但优雅的包装,其目标是简化导出和导入。
  2. 安装
composer require maatwebsite/excel

该Maatwebsite\Excel\ExcelServiceProvider是自动发现,并在默认情况下注册,但如果你想自己注册它:

添加 ServiceProvider config/app.php

'providers' => [
     /*
      * Package Service Providers...
      */
     Maatwebsite\Excel\ExcelServiceProvider::class,
]

该Excel门面也是自动发现,但如果你想手动添加:

添加 Facade in config/app.php

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]

要发布配置,请运行 vendor publish 命令:

php artisan vendor:publish

这将创建一个名为的新配置文件config/excel.php。

  1. 用法

先创建导出类,以导出账单为例

php artisan make:export OrderExport

导出类代码在这( 这里就不写太多,代码里面有注释,看看就明白 )

<?php

   namespace App\Exports;

   use Maatwebsite\Excel\Concerns\FromCollection;    // 导出集合
   use Maatwebsite\Excel\Concerns\WithEvents;     // 自动注册事件监听器
   use Maatwebsite\Excel\Concerns\WithStrictNullComparison;    // 导出 0 原样显示,不为 null
   use Maatwebsite\Excel\Concerns\WithTitle;    // 设置工作䈬名称
   use Maatwebsite\Excel\Events\AfterSheet;    // 在工作表流程结束时会引发事件
 
   class BillExport implements FromCollection, WithTitle, WithEvents, WithStrictNullComparison
   {
       public $data;

       public $dateTime;

       public $payways;

       public function __construct(array $data, $dateTime, $payways)
       {
           $this->data     = $data;
           $this->dateTime = $dateTime;
           $this->payways  = $payways;
       }

       /**
        * registerEvents    freeze the first row with headings
        * @return array
        * @author   liuml  <[email protected]>
        * @DateTime 2018/11/1  11:19
        */
       public function registerEvents(): array
       {
           return [
               AfterSheet::class => function(AfterSheet $event) {
               	// 合并单元格
                   $event->sheet->getDelegate()->setMergeCells(['A1:O1', 'A2:C2', 'D2:O2']);
                   // 冻结窗格
                   $event->sheet->getDelegate()->freezePane('A4');
                   // 设置单元格内容居中
                   $event->sheet->getDelegate()->getStyle('A1:A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
                   // 定义列宽度
                   $widths = ['A' => 10, 'B' => 15, 'C' => 25,...];
                   foreach ($widths as $k => $v) {
                   	// 设置列宽度
                       $event->sheet->getDelegate()->getColumnDimension($k)->setWidth($v);
                   }
                   // 其他样式需求(设置边框,背景色等)处理扩展中给出的宏,也可以自定义宏来实现,详情见官网说明
                   ...
               },
           ];
       }

       /**
        * 需要导出的数据统一在这个方法里面处理 这个方法里面也可以直接用 Model取数据
        * 我这里的数据是 Controller 传过来的,至于怎么传的看下面给出的 Controller 里面的代码就知道了
        * 里面数据处理太长了,多余的我都用 ... 表示,大家明白就行
        * @return \Illuminate\Support\Collection
        */
       public function collection()
       {
           $i         = 1;
           $total_amount = 0;    // 交易金额总计
           if (empty($this->data)) {
               foreach ($this->data as $key => $vo) {
                	...
                	
                   $data[$key]['num'] = $i;    // 编号
                   $data[$key]['consume_type'] = $vo['consume_type'];    // 项目类型
                   ...
                   
                   $total_amount += $data[$key]['total_amount '];    // 交易金额总计
                   $i++;
               }
           }

           $total = ['总计', ...];

           $data[]   = $total;
           $title    = [$this->payways . '对账单'];
           $headings = ['编号', ...];
           $date     = ['下载时间:' . date('Y-m-d H:i:s'), '', '', '数据时间范围:' . $this->dateTime];
           array_unshift($data, $title, $date, $headings);
		// 此处数据需要数组转集合
           return collect($data);
       }

       public function title(): string
       {
       	// 设置工作䈬的名称
           return $this->payways . '账单明细';
       }
   }

下面是 Controller 中的调用方法

public function billExportExcel(OrderRequest $request)
{
    $start_date = $request->get('start_date', '');
    $end_date   = $request->get('end_date', '');
    $payways    = $request->get('payways', '');
    $data       = $this->OrdersLogic->BillExportExcel($request->all());
    // download 方法直接下载,store 方法可以保存。具体的导出类型等看官方的文档吧
    return Excel::download(new BillExport($data, $start_date . '-' . $end_date, $payways, '**账单-' . date('Y-m-d_H_i_s') . '.xls');
}

放在最后面说的

官方 Github https://github.com/Maatwebsite/Laravel-Excel
官网地址 Laravel Excel
有关 PhpSpreadsheet 方法,请参阅其文档

猜你喜欢

转载自blog.csdn.net/u010324331/article/details/83658747