Thinkphp5结合layer导入excel
关于php导入excel的范文很多,但我需要用layer弹出框中导入文件,然后再进行导入数据。(本想把画江山《THINKPHP5 使用PHPEXCEL将EXCEL导入数据库 实例》(原文链接:https://blog.csdn.net/qq_29185757/article/details/79044924)这个例子下载下来好好研究一下,不知道什么原因github却上不去,不能下载。只好自己研究了)
功能需求:点击导入按钮后,弹出layerui弹出层,选择导入文件,点击确定按钮后开始导入数据。
基本思路及步骤:1、引入phpexcel
2、前端页面
3、js函数,弹出layer弹出层
4、控制器执行导入
一、引入phpexcel
网上资料很多,下载地址、引入方法完全按照网上资料操作即可。我引入的结果如下:
然后在项目需要的地方引入相关文件。
二、前端页面设计
导入导出按钮代码:
<span class="l"> <a href="javascript:;" onclick="app_daoru(this)" daoru_url="{:url('student/daoru')}" class="btn btn-primary radius"><i class="Hui-iconfont"></i> 导入EXCEL</a> <a href="javascript:;" onclick="app_daochu(this)" daochu_url="{:url('student/daochu')}" class="btn btn-primary radius"><i class="Hui-iconfont"></i> 导出EXCEL</a></span>
效果如下图:
在前端页面加入导入文件的表单,代码如下:
<div id="importBox" v-show="!showListBtn" style="display:none">
<form id="importForm" method="post" enctype="multipart/form-data" style="padding-left:20px;text-align:center;"><br/>
<input id="importFile" name="file" type="file" style="width:330px"/><p>仅允许导入"xls"或"xlsx"格式文件!<br/>
</form>
</div>
三、js函数,弹出layerui弹出层
根据需求,从网上找的代码进行修改。
function app_daoru(obj){
//获取模板当中的url地址
url = $(obj).attr('daoru_url');
var $importFile = $('<div id="wrapper"><div class="content"></div></div>'),
$content = $importFile.children(".content")
$importFile.appendTo('body')
var formData = new FormData();
formData.append("file",$("#importFile")[0].files[0]);
layer.open({
type: 1,
area: ['500px', '300px'],
shadeClose: false,
shade:0.6,
skin: 'layui-layer-molv',
title:"导入数据",
content: $("#importBox"),
//content:jQuery("#importBox"),
btn: ['下载模板','确定', '关闭'],
btn1: function(index){
window.location.href ="{:url('admin/student/student')}" + ".xls";
layer.close(index);
},
btn2: function(index,layero){
var formData = new FormData();
formData.append("file",$("#importFile")[0].files[0]);
$.ajax({
url: url,
dataType: 'json',
type: 'POST',
data: formData,
cache: false,
processData: false, // 不处理数据
contentType: false,
success: function(r){
console.log(r);
if(r.code == 0){
alert("导入成功!");
vm.reload();
}else{
alert(r.msg);
}
}
});
//layer.close(index);
},
btn3: function(index){
layer.close(index);
}
});
}
在这里,layer.open弹出layer层,这里对type属性设置为1。 在layer弹出层中分为5个类型,这种类型的返回值是Number类型,默认是0;
layer中5种类型传入的值有:0(信息框,默认是0),1(页面层),2(iframe层),3(加载层),4(tips层)
三、控制器代码
控制器主要写导入功能操作,代码只是简单的实现,没有验证文件扩展名、文件大小,没有验证数据是否已经存在!
public function daoru(){
vendor("PHPExecl.PHPExcel");//方法一
vendor("PHPExcel.PHPExcel.PHPExcel_IOFactory");
vendor("PHPExcel.PHPExcel.Reader.Excel5");
$objPHPExcel = new \PHPExcel();
//获取表单上传文件
$data = input('post.');
$file = $this->request->file('file');//request()->file('file');
$info = $file->validate(['size'=>156780,'ext'=>'xlsx,xls,csv'])->move(ROOT_PATH . 'public' . DS . 'excel');
if($info){
//获取文件名
$exclePath = $info->getSaveName();
//上传文件的地址
$file_name = ROOT_PATH . 'public' . DS . 'excel' . DS . $exclePath;
$objReader = \PHPExcel_IOFactory::createReader('Excel5');
//加载文件内容,编码utf-8
$obj_PHPExcel = $objReader->load($file_name, $encode = 'utf-8');
echo "<pre>";
$excel_array = $obj_PHPExcel->getsheet(0)->toArray(); //转换为数组格式
array_shift($excel_array); //删除第一个数组(标题);
$data = [];
//print_r($excel_array);
foreach ($excel_array as $k => $v) {
//$data[$k]['id'] = $v['0'];
$data[$k]['stuname'] = $v['1'];
$data[$k]['sex'] = $v['2'];
$data[$k]['Folk'] = $v['3'];
$data[$k]['IDNo'] = $v['4'];
$success = model('Student')->insert($data[$k]);//Db::name('student')->insertAll($data);
}
echo '数据添加成功';
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
参考资料:
1、 MrShyZhang,formData上传文件 ,https://blog.csdn.net/thunderevil35/article/details/80953236
2、画江山,THINKPHP5 使用PHPEXCEL将EXCEL导入数据库 实例,https://blog.csdn.net/qq_29185757/article/details/79044924
3、朱小杰,使用ajax提交form表单,包括ajax文件上传,https://www.cnblogs.com/zhuxiaojie/p/4783939.html
4、杰哥是大佬,formdata上传文件出现的种种错误,https://blog.csdn.net/weixin_42165130/article/details/88847064
5、浮生,FormData使用方法详解,https://www.cnblogs.com/clj2017/p/9321652.html
6、ShaoYanlun,phpexcel导入excel文件(一),https://blog.csdn.net/Shaoyanlun/article/details/80514911
7、ShaoYanlun,phpexcel导入excel文件(二),https://blog.csdn.net/Shaoyanlun/article/details/80508743
8、梵涯,input[type=“file”]上传文件原理详解,https://blog.csdn.net/weixin_42193004/article/details/96275626