--- 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', ]; } ```