文章目录
- 一、前提
- 二、使用
- 2.1、新建一个导入文件
- 2.2、新建一个控制器和方法,调用导入文件
- 2.3、 新建一个页面,支持文件上传
一、前提
想要将excel内容入库,laravel有扩展可以使用,常用的扩展是maatwebsite/excel
,安装步骤参考上一篇:laravel中安装Maatwebsite/excel扩展
二、使用
2.1、新建一个导入文件
php artisan make:import 文件名称 --model=Model地址
然后在里边编写你的导入逻辑
<?phpnamespace App\Imports;use App\Exceptions\ApiException;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Concerns\ToArray;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithHeadingRow;class QuesExport implements ToArray, WithChunkReading, WithHeadingRow
{public function array(array $rows){$data = [];$now = date('Y-m-d H:i:s');foreach ($rows as $row) {$data[] = ['id' => $row['id'],'number' => 0,'parent_id' => 0,'type' => 1,'question' => $row['ques'],'standard_answer' => $row['answer'],'ai_ques_id' => $row['aiid'],'created_at' => $now];}if (!$data) {throw new ApiException('没有要导入的数据');return false;};//全部导入DB::select('TRUNCATE table questions_copy1');DB::table('questions_copy1')->insert($data);return true;}public function chunkSize(): int{return 500;}public function headingRow(): int{return 1;}/*** @param Failure[] $failures*/public function onFailure(Failure ...$failures){// Handle the failures how you'd like.throw new ApiException('fhwaeurewsdf');}
}
2.2、新建一个控制器和方法,调用导入文件
/*** 导入excel,入库** */public function uploadQues(Request $request){$file = $request->file('file');// 保存上传文件$path = public_path('uploads/admin/ques');$this->mkdirs($path); // 已存在的路径不会再创建$fileName = date('YmdHis') . '_' . uniqid() . '_' . '.' . strtolower($file->getClientOriginalExtension());$file->move($path, $fileName);// 读取文件并入库Excel::import(new QuesExport(), $path . '/' . $fileName);// 删除上传文件unlink($path . '/' . $fileName);return response()->json(['status'=>1,'msg'=>'',]);}
2.3、 新建一个页面,支持文件上传
我这里简单写了个页面,如下:
<!DOCTYPE html>
<html >
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Laravel</title><script src="/js/jquery-3.3.1.min.js?v=2021123999" type="text/javascript" charset="utf-8"></script><meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<body>
<div class="flex-center position-ref full-height"><div class="upload_box"><input type="file" name="file" accept="file" id="auth-upload" onchange="uploadFile();"/><div class="reload_file flex-v flex-vc flex-hc"><i class="icon icon_add"></i><p>文件</p></div></div>
</div><script>function uploadFile(){file = $("#auth-upload")[0].files[0];// alert(file);// alert(file.name);// return;file_name = file.name;ext = file_name.slice(file_name.lastIndexOf(".")+1).toLowerCase();imgMaxSize = 1024*1024*10;if (ext != 'xlsx' ) {swal('文件格式不正确');return ;}// if (file.size > imgMaxSize) {swal('文件大小超过10M'); return ;}formData = new FormData();// 自定义formData中的内容formData.append('file', file);formData.append('_token', '{{csrf_token()}}');$.ajax({type: 'POST',url: "/upload",data: formData,cache: false,processData: false,contentType: false,dataType:'json',success: function (data) {if (data.status){alert('成功');}else{alert('失败');}}});}</script>
</body>
</html>