laravel-admin使用laravel-excel导入数据

使用laravel-excel导入数据

第一步 安装laravel-excel

我这边用的是laravel5.8版本 所以安装laravel-excel版本是3.1以上的

composer require maatwebsite/excel

敲下命令后会直接拉取最新版

laravel-admin使用laravel-excel导入数据_第1张图片

看到successful 就说明已经安装成功了

接下来创建后台导入按钮

php artisan admin:action Member/ImportAction --name="导入"

命令执行完之后会在 app/Admin/Actions/Member/ 文件夹下生成一个 ImportAction.php 文件

laravel-admin使用laravel-excel导入数据_第2张图片

然后在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;
    }

laravel-admin使用laravel-excel导入数据_第3张图片

接着创建导入类

php artisan make:import Member/ImportMember --model=App\Models\MemberModel

命令执行完之后会在 app/Imports/Member 文件夹下生成 ImportMember.php 文件

laravel-admin使用laravel-excel导入数据_第4张图片

然后编辑代码



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 文件



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
        导入
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>` $('.modal-header').append(html) process.then(actionResolverss).catch(actionCatcherss); SCRIPT; } }

导入excel格式

laravel-admin使用laravel-excel导入数据_第5张图片

导入后

laravel-admin使用laravel-excel导入数据_第6张图片

– 完

你可能感兴趣的:(laravel-admin,laravel,laravel-excel)