Maatwebsite\Excel匯入用法

峰高谷深發表於2020-11-26

1、WithChunkReading 分塊匯入

匯入行數過多時,可以使用WithChunkReading將資料拆成小塊進行匯入,減小記憶體佔用

namespace App\Imports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class IncomeOrderImport implements ToCollection, WithChunkReading
{

    /**
     * @return int
     */

    public function chunkSize(): int
    {
        return 300;
    }

    public function collection(Collection $rows)
    {

    }
}

2、WithStartRow 跳過表頭

匯入時excel一般都會有表頭,如果在collection方法中直接過濾表頭,第一塊資料含表頭,第一塊之後的不含表頭的正常資料會缺失

namespace App\Imports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithStartRow;

class IncomeOrderImport implements ToCollection, WithChunkReading, WithStartRow
{
    /**
     * @return int
     */
    public function startRow(): int
    {
        return 3;
    }

    /**
     * @return int
     */
    public function chunkSize(): int
    {
        return 300;
    }

    public function collection(Collection $rows)
    {

    }
}

3、使用分塊或跳過表頭行後,collection中資料校驗時給出對應行的錯誤提示

protected $start = 4;//第幾行開始匯入
protected $size = 100;//分塊大小
protected $chunk = 0;//第幾塊

public function __construct()
{
    //一些關聯資料可以直接在這查詢,不然在collection中會查詢多次
}

/**
 * @return int
 */
public function startRow(): int
{
    return $this->start;
}

/**
 * @return int
 */
public function chunkSize(): int
{
    return $this->size;
}

public function collection(Collection $rows)
{
    $this->chunk = $this->chunk + 1;
    foreach ($rows as $key => $row) {
        $line = $key + $this->size * ($this->chunk - 1) + $this->start;
        if (empty($row[1])) {
            throw new \Exception('第' . $line . "行,訂單時間不可為空");
        }
    }
}

4、WithCalculatedFormulas 獲取計算公式後的值

如果有用到計算公式,預設讀取到的值為計算公式,使用WithCalculatedFormulas可以自動獲取計算後的值

namespace App\Imports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithCalculatedFormulas;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithStartRow;

class IncomeOrderImport implements ToCollection, WithChunkReading, WithStartRow, WithCalculatedFormulas
{
    /**
     * @return int
     */
    public function startRow(): int
    {
        return 3;
    }

    /**
     * @return int
     */
    public function chunkSize(): int
    {
        return 300;
    }

    public function collection(Collection $rows)
    {

    }
}

5、WithMultipleSheets 多sheet讀取

多sheet,不同sheet處理資料不一樣是,可以使用WithMultipleSheets

namespace App\Imports;

use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class IncomeOrderImport implements WithMultipleSheets
{

    /**
     * @return array
     */
    public function sheets(): array
    {
        return [
            'sheet1' => new OrderImport,
        ];
    }

}

6、WithConditionalSheets 讀取指定sheet

有時候匯入模板可能會依賴於多個sheet之間做一些資料校驗,這樣可以匯入之前填寫時實時進行資料校驗,減少人工錯誤概率,

但這是匯入時只需要某個sheet的資料,其他輔助sheet的資料是不需要的,這是需要過濾sheet

namespace App\Imports;

use Maatwebsite\Excel\Concerns\WithConditionalSheets;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class IncomeOrderImport implements WithMultipleSheets
{
    use WithConditionalSheets;
    public function conditionalSheets(): array
    {
        return [
            'Sheet1' => new OrderImport,
        ];
    }

}

呼叫時 onlySheets方法

Excel::import((new IncomeOrderImport())->onlySheets('Sheet1'), $file);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章