Laravel使用maatwebsite/excel实现Excel/CSV文件导入导出及常见问题解决方案
Laravel Excel旨在成为Laravel风格的PHPSReadSheet:一种简单但优雅的PHPSReadSheet包装,旨在简化导出和导入。
PHPSReadSheet(打开新窗口)是一个用纯PHP编写的库,它提供了一组类,允许您读取和写入不同的电子表格文件格式,如Excel和LibreOffice Calc。
2、安装&配置
使用Composer
安装依赖首先在Laravel项目根目录下使用Composer安装依赖:
composer require maatwebsite/excel
安装后的设置在config/app.php
中注册服务提供者到providers
数组:
Maatwebsite\Excel\ExcelServiceProvider::class,
同样在config/app.php
中注册门面到aliases
数组:
Excel => Maatwebsite\Excel\Facades\Excel::class,
如果想要对Laravel Excel
进行更多的自定义配置,执行如下Artisan
命令:
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
执行成功后会在config目录下生成一个配置文件excel.php
。
3、Excel导入
php artisan make:import UsersImport --model=User新建导入文件,导入导出业务代码尽量不要和原来业务耦合。我们拿官网 user 模块举例
会在 app 目录下创建 Exports 目录
.
├── app
│ ├── Imports
│ │ ├── UsersImport.php
│
└── composer.json
a、直接从Excel导入Modal数据库
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, public_path("/excels/users.xlsx"));
}
}
需要说明的是,上面所用的模式是 toModel,不需要手动去调用 save 方法。
b、手动控制数据和存储
如果需要手动控制存储过程,请使用下列方法。
<?php
namespace App\Imports;
use App\User;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
class UsersImport implements ToCollection
{
/**
* 使用 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% 业务需求。如果有更多需求请继续阅读,下面将介绍分块导入、多表导入。
c、分块导入
如果 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 模式,如果你需要对数据进行更改,建议先批量导入临时表,再修改数据导入业务相关表。
d、多 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
}
}
其他比如数据验证之类的方法我觉得还是不要使用它提供的方式,大部分业务环境不需要这些额外繁琐的东西。
e、导出数据到控制器
参考 Importables 章节
项目与文档地址
GitHub地址是:https://github.com/Maatwebsite/Laravel-Excel
文档地址:Laravel Excel
五、常见问题解决办法
如何将结果返回控制器,如何上传Excel导入,可以参考 导入基础知识 其实您翻译一下文档基本问题都能解决。
提交评论
用户评论
更多相关好文
-
laravel中distinct()的使用方法与去重 2017-09-11
-
Laravel将view缓存为静态html,laravel页面静态缓存 2021-10-09
-
[ laravel爬虫实战--基础篇 ] guzzle描述与安装 2017-11-01
-
[ 配置教程 ] 在ubuntu16.04中部署LNMP环境(php7+maridb且开启maridb远程以及nginx多域名访问 )并配置laravel环境 2017-07-18
-
花生壳绑定ubuntu服务器? 2024-08-23
热门文章
-
花生壳绑定ubuntu服务器? 2024-08-23
-
Laravel模型更新全表如何实现? 2024-03-11
-
php图片转为二进制数据的方法 2023-10-23
-
Jquery如何监听动态创建元素的点击事件? 2023-09-08
-
所以SheetJS实现table导出数据为Excel 2023-09-05
所以SheetJS实现table导出数据为Excel