laravel maatwebsite/excel 使用教程 (導入篇)


官方文檔

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM