owned this note changed a year ago
Linked with GitHub

Laravel Excel處理解決方案

官方網站

安裝套件

開啟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

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類別來進行載入

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

namespace App\Imports;

...
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
...

class UserImport implements ToModel,WithMultipleSheets

Step 2.在Import類別加入以下函式

下列程式表示只匯入第一個sheet

public function sheets(): array
{
    return [
        0 => $this,
    ];
}

從Sheet的第幾行開始讀

Step 1.在Import類別導入類別並實作

<?php

namespace App\Imports;

...
use Maatwebsite\Excel\Concerns\WithStartRow;
...

class UserImport implements ToModel,WithStartRow

Step 2.在Import類別加入以下程式碼

public function startRow(): int
{
    return 4; //從第4行開始讀
}

匯入時進行欄位驗證

Step 1.在Import類別導入類別並實作

<?php

namespace App\Imports;

...
use Maatwebsite\Excel\Concerns\WithValidation;
...

class UserImport implements ToModel,WithValidation

Step 2.在Import類別加入以下程式碼

//匯入時的驗證規則
public function rules(): array
{
    return [
            '0' => 'required|string',
            '1' => 'required|email',

    ];
}
//驗證訊息使用的欄位名稱
public function customValidationAttributes()
{
    return [
        '0' => '姓名',
        '1' => 'Email',
    ];
}

匯出

5分鐘簡易匯出Excel

Step 1. 建立輸出類別

你能夠利用以下指令建立一個位於 app/Exports 資料夾內的輸出類別

php artisan make:export UsersExport --model=User

輸出內容如下:

<?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 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

...
use Maatwebsite\Excel\Concerns\WithHeadings;

class ServiceExport implements FromCollection, WithHeadings
{
...
}

Step 2.在輸出類別內加入 headings()

陣列內的字串將依序作為Excel的標頭

public function headings(): array
{
    return [
        'Code',
        'Description',
        'Pos',
        'Mod A',
        'Mod B',
        'Charge',
    ];
}
Select a repo