laravelmaatwebsiteexcel使⽤教程(导⼊篇)
官⽅⽂档
GIT 地址
作为⼀个和 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++) {laravel框架下载
$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
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。