使用laravel-excel導入資料
第一步 安裝laravel-excel
我這邊用的是laravel5.8版本 是以安裝laravel-excel版本是3.1以上的
composer require maatwebsite/excel
敲下指令後會直接拉取最新版
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TRXR2b5cVWwI1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0kDO0QzM1IjM3EzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
看到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="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格式
導入後
– 完