1. 程式人生 > >【laravel】laravel Excel V3.1 匯出方法詳解

【laravel】laravel Excel V3.1 匯出方法詳解

放前面說的

本篇文章不適用於 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 方法,請參閱其文件