官方文檔
https://docs.laravel-excel.com/3.1/getting...
GIT 地址
https://github.com/maatwebsite/Laravel-Exc...
作為一個和 laravel 契合度很高的 excel 工具包,大家應該都是用過這個工具。特別是 2.x
版本幾乎是用 laravel 框架都接觸過,3.x
基本上全部重構,全網幾乎找不到比較完善的教程,我就先拋磚引玉,大概把我用到的功能使用方式列一下,歡迎大家補充。
環境要求
-
PHP:
^7.0
-
Laravel:
^5.5
安裝方式
composer require maatwebsite/excel
因為目前 3.1 只支持 Laravel 5.5 以上,所以會自動注冊。
excel 導入
新建導入文件,導入導出業務代碼盡量不要和原來業務耦合。我們拿官網 user 模塊舉例
php artisan make:import UsersImport --model=User
會在 app 目錄下創建 Exports 目錄
. ├── app │ ├── Imports │ │ ├── UsersImport.php │ └── composer.json
UsersImport.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) { return new User([ 'name' => $row[0], 'email' => $row[1], 'password' => Hash::make($row[2]), ]); } }
業務控制器中調用
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'); } }
需要說明的是,上面所用的模式是 toModel,不需要手動去調用 save 方法,如果需要手動控制存儲過程,請使用下列方法。
<?php namespace App\Imports; use App\User; use Illuminate\Support\Facades\Hash; //替換 toModel use Maatwebsite\Excel\Concerns\ToCollection; class UsersImport implements ToModel { /** * 使用 ToCollection * @param array $row * * @return User|null */ public function ToCollection(Collection $rows) { //如果需要去除表頭 unset($rows[0]); //$rows 是數組格式 $this->createData($rows); } public function createData($rows) { //todo } }
Excel 導入基本功能到這基本完成,應該可以滿足 80% 業務需求。如果有更多需求請繼續閱讀,下面將介紹分塊導入、多表導入。
分塊導入
如果 excel 數據量比較大,不適合一次性導入數據庫,可以通過按量分塊導入的方式節約內存。
按 1000 條為基准取出導入
namespace App\Imports; use App\User; use Maatwebsite\Excel\Concerns\ToModel; //新增 use Maatwebsite\Excel\Concerns\WithBatchInserts; use Maatwebsite\Excel\Concerns\WithChunkReading; class UsersImport implements ToModel, WithBatchInserts, WithChunkReading { public function model(array $row) { return new User([ 'name' => $row[0], ]); } //批量導入1000條 public function batchSize(): int { return 1000; } //以1000條數據基准切割數據 public function chunkSize(): int { return 1000; } }
需要注意的是 批量導入 只支持 ToModel 模式,如果你需要對數據進行更改,建議先批量導入臨時表,再修改數據導入業務相關表。
多 sheet 導入
和導出比較類似,需要兩步操作,第一步讀取整體 excel 結構,第二步完成對應表數據導入。
第一個文件 UsersImport.php
namespace App\Imports; use Maatwebsite\Excel\Concerns\WithMultipleSheets; class UsersImport implements WithMultipleSheets { public function sheets(): array { //這里需要注意的是鍵,這個鍵可以是sheet表的名稱,比如 'sheet1'=> new FirstSheetImport() return [ 0 => new FirstSheetImport(), 1 => new SecondSheetImport(), ]; } }
這里我沒有找到獲取所有 sheet 的方法,所以只能一個個指定,如果你調用的方法是一致的,可以參考以下我的寫法。如果你有更好的方式,歡迎交流。
public function sheets(): array { $sheet = []; for ($i=1; $i<=26; $i++) { $sheet[$i] = new CustomSheetImport(); } return $sheet; }
第二個文件處理數據
namespace App\Imports; use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\ToCollection; class FirstSheetImport implements ToCollection { public function collection(Collection $rows) { //todo } }
maatwebsite/Excel 3.1 使用教程 (導入篇) - Laravel實戰 - E度筆記
http://www.edbiji.com/doccenter/showdoc/209/nav/3723.html