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 協議》,轉載必須註明作者和本文連結