PHP导入excel数据
简介
但我们使用PHP框架进行项目开发的时候,难免会遇到一些数据导入的需求,比如后台导入用户,导入订单数据等等,通常解决方案都是compose引入excel插件,先将文件上传到服务器,将文件中的数据读取到内存中,再插入数据表中。
excel插件导入实现
1、我们以laravel5.5框架为例
a、首先在更目录下安装excel插件:
composer require “maatwebsite/excel:~2.1.0”
b、在config/app.php中注册服务提供者到provides数组:
Maatwebsite\Excel\ExcelServiceProvider::class
c、在config/app.php中注册到aliases数组:
‘Excel’ => Maatwebsite\Excel\Facades\Excel::class,
d、生成Laravel excel的配置文件:
php artisan vendor:publish --provider=“Maatwebsite\Excel\ExcelServiceProvider”
e、控制器代码实现
public function import(Request $req){
try {
//获取上传的excel文件
$filePath = $req->get('report');
Excel::load($filePath, function($reader) {
$data = $reader->all();
//批量存储
//返回导入结果
throw new Exception("成功导入了".$count."条数据");
});
}catch(Exception $e){
return $this->doFailure($e);
}
}
存在的问题
当excel表格的数据量过大时,会很消耗内存,有可能导致内存溢,因而当导入数据量比较大的数据时可用以下方案:
mysql load data infile
a、首先同样要把需要导入的文件上传至服务器,而且文件格式最好是csv,TXT,.sql的格式
b、通过shell脚本发方式执行登录数据库以及导入操作
#!/bin/bash
#!/bin/bash
mysql -uroot -p123456 <<EOF
use test;
load data local infile '/www/import.csv' into table device fields terminated by',' lines terminated by'\n' ignore 1 lines (@col1) set deviceName=@col1;
EOF
#忽略首列,设置字段对应列
c、这时只需在controller中待文件上传完成通过php的system函数执行以上脚本即可
system("cd /脚本位置 && sh ./import.sh",$result);
d、这时可查看数据是否导入成功
总结
可以说mysql load data infile 是秒级响应,而当你用excel插件去导入的时候,发现会等待一段时间,所以看具体需求,如果需要导入的数据量足够大的话可以考虑使用第二种方式进行,当数据量不大时可以使用excel,要注意的是xlxs的格式需要转化成csv的格式。