使用laravel-excel导入数据
第一步 安装laravel-excel
我这边用的是laravel5.8版本 所以安装laravel-excel版本是3.1以上的
composer require maatwebsite/excel
敲下命令后会直接拉取最新版
看到successful 就说明已经安装成功了
接下来创建后台导入按钮
php artisan admin:action Member/ImportAction --name="导入"
命令执行完之后会在 app/Admin/Actions/Member/ 文件夹下生成一个 ImportAction.php 文件
然后在member控制器下添加代码如下
protected function grid()
{
$grid = new Grid(new MemberModel());
$grid->column('id', __('Id'));
$grid->column('username', '用户名');
$grid
->column('sex', '性别')
->using([
1 => '男',
2 => '女'
]);
$grid->column('phone', '手机号码');
$grid->column('created_at', __('Created at'));
// 添加到列表上
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new ImportAction());
});
return $grid;
}
接着创建导入类
php artisan make:import Member/ImportMember --model=App\Models\MemberModel
命令执行完之后会在 app/Imports/Member 文件夹下生成 ImportMember.php 文件
然后编辑代码
<?php
namespace App\Imports\Member;
use App\Models\MemberModel;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
class ImportMember implements ToModel,WithStartRow
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
// 0代表的是第一列 以此类推
// $row 是每一行的数据
return new MemberModel([
'username' => $row[0],
'sex' => $row[1],
'phone' => $row[2]
]);
}
/**
* 从第几行开始处理数据 就是不处理标题
* @return int
*/
public function startRow(): int
{
return 2;
}
}
接着编辑 ImportAction.php 文件
<?php
namespace App\Admin\Actions\Member;
use App\Imports\Member\ImportMember;
use Encore\Admin\Actions\Action;
use Encore\Admin\Admin;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class ImportAction extends Action
{
protected $selector = '.import-action';
public function handle(Request $request)
{
try{
// $request ...
$file = $request-> file('file');
Excel::import(new ImportMember(),$file);
return $this->response()->success('数据导入成功')->refresh();
}catch (\Exception $e){
return $this->response()->error($e -> getMessage());
}
}
/**
* 按钮名称
* @return string
*/
public function html()
{
return <<<HTML
<a class="btn btn-sm btn-default import-action">导入</a>
HTML;
}
/**
* 表单
*/
public function form()
{
$this
->file('file', '请选择文件')
->options(['showPreview' => false,
'allowedFileExtensions'=>['xlsx','xls'],
'showUpload'=>true
]);
}
/**
* 上传等待
* @return string
*/
public function handleActionPromise()
{
$resolve = <<<SCRIPT
var actionResolverss = function (data) {
$('.modal-footer').show()
$('.tips').remove()
var response = data[0];
var target = data[1];
if (typeof response !== 'object') {
return $.admin.swal({type: 'error', title: 'Oops!'});
}
var then = function (then) {
if (then.action == 'refresh') {
$.admin.reload();
}
if (then.action == 'download') {
window.open(then.value, '_blank');
}
if (then.action == 'redirect') {
$.admin.redirect(then.value);
}
};
if (typeof response.html === 'string') {
target.html(response.html);
}
if (typeof response.swal === 'object') {
$.admin.swal(response.swal);
}
if (typeof response.toastr === 'object') {
$.admin.toastr[response.toastr.type](response.toastr.content, '', response.toastr.options);
}
if (response.then) {
then(response.then);
}
};
var actionCatcherss = function (request) {
$('.modal-footer').show()
$('.tips').remove()
if (request && typeof request.responseJSON === 'object') {
$.admin.toastr.error(request.responseJSON.message, '', {positionClass:"toast-bottom-center", timeOut: 10000}).css("width","500px")
}
};
SCRIPT;
Admin::script($resolve);
return <<<SCRIPT
$('.modal-footer').hide()
let html = `<div class='tips' style='color: red;font-size: 18px;'>导入时间取决于数据量,请耐心等待结果不要关闭窗口!<img src="https://img-blog.csdnimg.cn/2022010707365834764.gif"><\/div>`
$('.modal-header').append(html)
process.then(actionResolverss).catch(actionCatcherss);
SCRIPT;
}
}
导入excel格式
导入后
– 完