Laravel-admin Excel 3.1 导入

excel 3.1 数据导入到数据库

下载地址
docs.laravel-excel.com/3.1/getting...

效果图展示

Laravel-admin excel 3.1   导入和导出

Laravel-admin excel 3.1   导入和导出

Laravel-admin excel 3.1   导入和导出

1、创建按钮

$grid->tools(function (Grid\Tools $tools) {
      // excle 导入
      $tools->append(new ExcelAdd());
});

2、创建按钮文件

<?php

namespace App\Admin\Actions;

use Throwable;
use Encore\Admin\Admin;
use App\Imports\DataExcel;
use Encore\Admin\Actions\Action;
use Encore\Admin\Actions\Response;
use Maatwebsite\Excel\Facades\Excel;
use Maatwebsite\Excel\Validators\ValidationException;

class ExcelAdd extends Action
{
    protected $selector = '.import-template';

    public function handle()
    {
        try {
            Excel::import(new DataExcel(time()), request()->file('file'));
        } catch (ValidationException $validationException) {
            return Response::withException($validationException);
        } catch (Throwable $throwable) {
            $this->response()->status = false;
            return $this->response()->swal()->error($throwable->getMessage());
        }

        return $this->response()->success('上传成功')->refresh();
    }

    // 按钮样式
    public function html()
    {
        return <<<HTML
        <a class="btn btn-sm btn-default import-template">上传简历</a>
HTML;
    }
    // 上传表单
    public function form()
    {
        $this->file('file', '上传简历')->rules('required', ['required' => '文件不能为空']);
    }

    /**
     * @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="data:image/gif;base64,R0lGODlhEAAQAPQAAP///1VVVfr6+np6eqysrFhYWG5ubuPj48TExGNjY6Ojo5iYmOzs7Lq6utjY2ISEhI6OjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAkKAAAALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkECQoAAAAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkECQoAAAAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAkKAAAALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAkKAAAALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA=="><\/div>`
         $('.modal-header').append(html)
process.then(actionResolverss).catch(actionCatcherss);
SCRIPT;
    }
}

3、获取excel中第一个 文件sheet 中的信息

<?php

namespace App\Imports;

use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class DataExcel implements WithMultipleSheets
{
    private $round;

    public function __construct(int $round)
    {
        $this->round = $round;
    }

    public function sheets(): array
    {
        return [
            new FirstSheetImport($this->round),
        ];
    }
}

4、获取信息进行导入数据库

<?php

namespace App\Imports;

use App\Models\Data;
use App\Models\Data as DataModel;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Model;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithBatchInserts;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Imports\HeadingRowFormatter;

HeadingRowFormatter::
    default('none');

class FirstSheetImport implements ToCollection, WithBatchInserts, WithChunkReading, WithHeadingRow, ToModel
{
    private $round;

    public function __construct(int $round)
    {
        $this->round = $round;
    }


    /**
     * @param array $row
     *
     * @return Model|Model[]|null
     */
    public function model(array $row)
    {
        // 断数据是否
        $user = Data::where('mobile', '=', $row['手机'])->first();
        if ($user) {
            // 存在返回 null
            return null;
        }
        // 数据库对应的字段
        return new DataModel([
            'name' => $row['姓名'],
            'gender' => $row['性别'],
        ]);
    }

    public function collection(Collection $rows)
    {
        //
    }

    //批量导入1000条
    public function batchSize(): int
    {
        return 1000;
    }

    //以1000条数据基准切割数据
    public function chunkSize(): int
    {
        return 1000;
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 23

上传了一个5m的excel 直接卡死了,怎么优化呢

4年前 评论

@风吹过有夏天的味道 请问你最后是怎么优化的

4年前 评论

file
我的总是提示无法找到驱动,跟着目录过去,发现根本就没有这个目录。
excel 2.* 版本的可能有,但是我是laravel6.0版本的,根本无法安装 2,只能安装 maatwebsite/excel 3.0以上版本才能安装上。
在网上尝试了各种版本的导入功能,最后都是到了这一步,无法进行。
我不知道,你们为什么可以安装上。不知道你们都碰到这个情况了没有。

file

file

file
不知道你们是否尝试了!!!???

4年前 评论
Wen1109 (楼主) 4年前

@风吹过有夏天的味道 请问,你的laravel版本是 多少的? 能够正常使用吗???
有没有联系方式,我想红包解决。
149799880 qq

4年前 评论
风吹过有夏天的味道 4年前

完美导入成功,感谢!!!

4年前 评论

你好,请问 这个‘创建按钮文件’ 是建在哪里的啊

4年前 评论

导入文件时一直提示将字段添加到可填充属性以便进行批量分配,请问这种情况怎么处理呢? Add [order_id] to fillable property to allow mass assignment on [App\Order]

file

3年前 评论
风吹过有夏天的味道 3年前
秀才 (作者) 3年前

file 为什么按照此步骤会告诉我书号一直为未定义。我是以书号做为唯一识别标识。

3年前 评论
Cosmos 3年前
oldopr (作者) 2年前

file想问一下为什么照着步骤弄得 但是 点击上传 没弹窗 直接请求我的方法了

3年前 评论
Wen1109 (楼主) 3年前

请问时间格式怎么弄呢 在excel里是日期格式 但是到了数据库就成了数字 格式也不对

3年前 评论

这样啊,受教了

3年前 评论
Wen1109 (楼主) 3年前

这个导入按钮代码在哪添加呢?

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!