---
tags: laravel,套件
---
# Laravel Excel處理解決方案
[官方網站](https://docs.laravel-excel.com/3.1/getting-started/)
## 安裝套件
開啟Terminal,輸入以下指令
`composer require maatwebsite/excel`
## 匯入
### 5分鐘簡易匯入Excel
#### Step 1.生成Import類別
可透過以下指令來生成此類別,生成的類別位在app/Imports資料夾內
`php artisan make:import UsersImport --model=User`
.
├── app
│ ├── Imports
│ │ ├── UsersImport.php
│
└── composer.json
或者你可以自己撰寫,格式如下:
```php
<?php
namespace App\Imports;
use App\User;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Concerns\ToModel;
class UsersImport implements ToModel
{
/**
* @param array $row
*
* @return User|null
*/
public function model(array $row)
{
//可設定如果沒有某欄位,該行就不要匯入
if(!isset($row[0])){
return null;
}
return new User([
//設定欄位對應,第一欄對應name欄位,第二欄對應email欄位
'name' => $row[0],
'email' => $row[1],
'password' => Hash::make($row[2]),
]);
}
}
```
#### Step 2.在控制器使用Import類別來進行載入
```php
use App\Imports\UsersImport;
use Maatwebsite\Excel\Facades\Excel;
use App\Http\Controllers\Controller;
class UsersController extends Controller
{
public function import()
{
Excel::import(new UsersImport, 'users.xlsx');
return redirect('/')->with('success', 'All good!');
}
}
```
### 如果有多個Sheet,只需要匯入某個Sheet...
Step 1.在Import類別導入類別並實作
```php
<?php
namespace App\Imports;
...
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
...
class UserImport implements ToModel,WithMultipleSheets
```
Step 2.在Import類別加入以下函式
下列程式表示只匯入第一個sheet
```php
public function sheets(): array
{
return [
0 => $this,
];
}
```
### 從Sheet的第幾行開始讀
Step 1.在Import類別導入類別並實作
```php
<?php
namespace App\Imports;
...
use Maatwebsite\Excel\Concerns\WithStartRow;
...
class UserImport implements ToModel,WithStartRow
```
Step 2.在Import類別加入以下程式碼
```php
public function startRow(): int
{
return 4; //從第4行開始讀
}
```
### 匯入時進行欄位驗證
Step 1.在Import類別導入類別並實作
```php
<?php
namespace App\Imports;
...
use Maatwebsite\Excel\Concerns\WithValidation;
...
class UserImport implements ToModel,WithValidation
```
Step 2.在Import類別加入以下程式碼
```php
//匯入時的驗證規則
public function rules(): array
{
return [
'0' => 'required|string',
'1' => 'required|email',
];
}
```
```php
//驗證訊息使用的欄位名稱
public function customValidationAttributes()
{
return [
'0' => '姓名',
'1' => 'Email',
];
}
```
## 匯出
### 5分鐘簡易匯出Excel
#### Step 1. 建立輸出類別
你能夠利用以下指令建立一個位於 app/Exports 資料夾內的輸出類別
`php artisan make:export UsersExport --model=User`
輸出內容如下:
```php=
<?php
namespace App\Exports;
use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;
class UsersExport implements FromCollection
{
public function collection()
{
return User::all();
}
}
```
#### Step 2.撰寫輸出方法
在控制器裡頭建立一個輸出方法
```php=
<?php
namespace App\Http\Controllers;
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
class UsersController extends Controller
{
public function export()
{
return Excel::download(new UsersExport, 'users.xlsx');
}
}
```
#### Step 3.建立一個用來輸出Excel的路由規則
`Route::get('users/export/', 'UsersController@export');`
### 為Excel檔案加上標頭
#### Step 1.導入名為 WithHeadings 的 Trait
```php
...
use Maatwebsite\Excel\Concerns\WithHeadings;
class ServiceExport implements FromCollection, WithHeadings
{
...
}
```
#### Step 2.在輸出類別內加入 headings()
陣列內的字串將依序作為Excel的標頭
```php
public function headings(): array
{
return [
'Code',
'Description',
'Pos',
'Mod A',
'Mod B',
'Charge',
];
}
```