【laravel】laravel Excel V3.1 匯出方法詳解
阿新 • • 發佈:2018-11-20
放前面說的
本篇文章不適用於 laravel Excel 3.0 以下版本。
放中間說的( 這裡是正文了 )
- 介紹
LaravelExcel 旨在成為 Laravel 風格的 PhpSpreadsheet:圍繞 PhpSpreadsheet 的簡單但優雅的包裝,其目標是簡化匯出和匯入。 - 安裝
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。
- 用法
先建立匯出類,以匯出賬單為例
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 方法,請參閱其文件