天天看點

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

使用laravel-excel導入資料

第一步 安裝laravel-excel

我這邊用的是laravel5.8版本 是以安裝laravel-excel版本是3.1以上的

composer require maatwebsite/excel
           

敲下指令後會直接拉取最新版

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

看到successful 就說明已經安裝成功了

接下來建立背景導入按鈕

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

指令執行完之後會在 app/Admin/Actions/Member/ 檔案夾下生成一個 ImportAction.php 檔案

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

然後在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導入資料使用laravel-excel導入資料

接着建立導入類

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

指令執行完之後會在 app/Imports/Member 檔案夾下生成 ImportMember.php 檔案

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

然後編輯代碼

<?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="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;
    }

}
           

導入excel格式

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

導入後

laravel-admin使用laravel-excel導入資料使用laravel-excel導入資料

– 完