Laravel-Admin 上传excel文件并写入Mysql数据库

//添加双路由,根据请求不同,访问的操作也不同,get为上传页面,post为提交文件
routes.php

$router->get('你的路由名/upload', '你的控制器@upload');
$router->post('你的路由名/upload', '你的控制器@upload');
//上传方法
xxController.php

/**
* 上传文件
*/
public function upload(Request $request)
{
//获得请求的方法
$method = $request->method();

//post请求则解析文件
if ($method == 'POST'){

//按时间命名文件
$name = time().'.xls';

//文件保存到storage/app/public
$path = $request->file('upfile')->storeAs('public',$name);

//获取文件url
$url = storage_path().'/app/'.$path;

//读取文件
$file = \PHPExcel_IOFactory::load($url);

//文件转数组
$re = $file->getSheet(0)->toArray(null,false,false,true);

//初始化下标0到数组(excel没有下标为0的数组,从1开始),避免后面读取报错
$re[0] = '';

//写入字段
$header = [balabala];

//获取文件数组条目数
$recounts = count($re);

//开始循环写入数据库,为什么$i=2?,因为第一行为标头
for ($i=2;$i<$recounts;$i++){

//重置数组
$e = NUll;
$insert[] = [];
$arr[] = [];
$f = 0;

//循环写入数组
foreach($re[$i] as $r){

//最大数组数为字段数
if ($f < count($header)){

//你的代码。。。balabala

//组装数据
$arr[$f] = [
$header[$f] => $r,
];
$f++;
}

}

//初始化集合
$insert = collect($arr);

//转为一维集合
$e = $insert->collapse();

//转换为数组
$ee = $e->toArray();

//写入数据库
DB::table('你的表')->insert([$ee]);
}

//提示,当然,可以自己用try来处理数据库异常,这里懒得处理了。。。
$success = new MessageBag([
'title' => '恭喜',
'message' => '导入成功',
]);

return back()->with(compact('success'));

}

//如果是get请求,则返回上传页面
if ($method == 'GET')
{
return Admin::content(function (Content $content) {

$content->header('balabala');
$content->description('导入数据');
$content->body(view('GlobalUpload'));
});
}
}
//调用上传按钮
xxController.php

//在控制器的grid方法里面加入按钮
$grid->tools(function ($tools) {
$tools->append(new GlobalUploadButton());
});
//上传按钮的定义
Extensions\GlobalUploadButton.php

<?php

namespace App\Admin\Extensions\Tools;

use Encore\Admin\Grid\Tools\AbstractTool;
use Illuminate\Support\Facades\URL;

/**
* 全局上传数据按钮
*/

class GlobalUploadButton extends AbstractTool
{

public function __construct()
{
$this->url = URL::current().'/upload';
}


public function render()
{
$options = [
$this->url => '导入数据',
];

return view('tools.GlobalUploadButton', compact('options'));
}
}

resources\views\tools\GlobalUploadButton.blade.php
//上传按钮的html

<div class="btn-group" data-toggle="buttons">
@foreach($options as $option => $label)
<a class="btn btn-danger btn-sm" href="{{ $option }}" value='{{ $option }}'>{{$label}}</a>
@endforeach
</div>

resources\views\GlobalUpload.blade.php
//上传页面

<div class="col-md-12">
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">导入数据</h3>
<div class="box-tools">
<div class="btn-group pull-right" style="margin-right: 5px">
<a href="{{url()->current(-1)}}" class="btn btn-sm btn-default"><i class="fa fa-list"></i> 列表</a>
</div>
</div>
</div>
<!-- /.box-header -->
<!-- form start -->
<form action="{{URL::current()}}" method="post" accept-charset="UTF-8" class="form-horizontal" enctype="multipart/form-data" pjax-container="">

<div class="box-body">
<div class="fields-group">
<div class="form-group ">
<label for="tt" class="col-sm-2 control-label">上传文件</label>
<div class="col-sm-8">
<input type="file" class="upfile" name="upfile">
</div>
</div>
</div>
</div>
<!-- /.box-body -->
<div class="box-footer">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="col-md-2">
</div>
<div class="col-md-8">
<div class="btn-group pull-right">
<button type="submit" class="btn btn-primary">提交</button>
</div>
<div class="btn-group pull-left">
<button type="reset" class="btn btn-warning">撤销</button>
</div>
</div>
</div>
<input type="hidden" name="_previous_" value="{{URL::current()}}" class="_previous_">
<!-- /.box-footer -->
</form>
</div>
<div class="alert alert-info" role="alert">提示。。。balabala</div>
</div>

发表评论

电子邮件地址不会被公开。 必填项已用*标注