TP6框架--EasyAdmin学习笔记:Excel表单导入数据库
这是我写的学习EasyAdmin的第四章,这一章我给大家分享下Excel表单导入数据库的全流程需要怎么处理并提供案例
首先给大家看下这个功能的原理,下面是PHP连接打印机的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | public function uplExcel(Request $request) { if (!empty($_FILES[ 'excel' ][ 'name' ])) { $fileName = $_FILES[ 'excel' ][ 'name' ]; //得到文件全名 $dotArray = explode( '.' , $fileName); //把文件名安.区分,拆分成数组 $type = end($dotArray); if ($type != "xls" && $type != "xlsx" ) { $ret[ 'res' ] = "0" ; $ret[ 'msg' ] = "不是Excel文件,请重新上传!" ; return json_encode($ret); } //取数组最后一个元素,得到文件类型 $uploaddir = "../uploads2/" . date( "Y-m-d" ) . '/' ; //设置文件保存目录 注意包含 if (!file_exists($uploaddir)) { mkdir($uploaddir, 0777, true ); } $path = $uploaddir . md5(uniqid(rand())) . '.' . $type; //产生随机文件名 //$path = "images/".$fileName; //客户端上传的文件名; //下面必须是tmp_name 因为是从临时文件夹中移动 move_uploaded_file($_FILES[ 'excel' ][ 'tmp_name' ], $path); //从服务器临时文件拷贝到相应的文件夹下 $file_path = $path; if (!file_exists($path)) { $ret[ 'res' ] = "0" ; $ret[ 'msg' ] = "上传文件丢失!" . $_FILES[ 'excel' ][ 'error' ]; return json_encode($ret); } //文件的扩展名 $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); if ($ext == 'xlsx' ) { $objReader = \PHPExcel_IOFactory::createReader( 'Excel2007' ); $objPHPExcel = $objReader->load($file_path, 'utf-8' ); } elseif ($ext == 'xls' ) { $objReader = \PHPExcel_IOFactory::createReader( 'Excel5' ); $objPHPExcel = $objReader->load($file_path, 'utf-8' ); } $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); // 取得总行数 $highestColumn = $sheet->getHighestColumn(); // 取得总列数 $ar = array(); $i = 0; $importRows = 0; for ($j = 2; $j <= $highestRow; $j++) { $importRows++; $realName = ( string )$objPHPExcel->getActiveSheet()->getCell( "A$j" )->getValue(); //需要导入的realName $phone = ( string )$objPHPExcel->getActiveSheet()->getCell( "B$j" )->getValue(); //需要导入的phone $company = ( string )$objPHPExcel->getActiveSheet()->getCell( "C$j" )->getValue(); //需要导入的company $job = ( string )$objPHPExcel->getActiveSheet()->getCell( "D$j" )->getValue(); //需要导入的job $email = ( string )$objPHPExcel->getActiveSheet()->getCell( "E$j" )->getValue(); //需要导入的email $ret[ 'mdata' ] = $ this ->addMemb($phone, $realName, $company, $job, $email); //这里就是我的数据库添加操作定义的一个方法啦,对应替换为自己的 if ($ret[ 'mdata' ] && !is_Bool($ret[ 'mdata' ])) { $ar[$i] = $ret[ 'mdata' ]; $i++; } } if ($i > 0) { $ret[ 'res' ] = "0" ; $ret[ 'errNum' ] = $i; $ret[ 'allNum' ] = $importRows; $ret[ 'sucNum' ] = $importRows - $i; $ret[ 'mdata' ] = $ar; $ret[ 'msg' ] = "导入完毕!" ; return json_encode($ret); } $ret[ 'res' ] = "1" ; $ret[ 'allNum' ] = $importRows; $ret[ 'errNum' ] = 0; $ret[ 'sucNum' ] = $importRows; $ret[ 'mdata' ] = "导入成功!" ; return json_encode($ret); } else { $ret[ 'res' ] = "0" ; $ret[ 'msg' ] = "上传文件失败!" ; return json_encode($ret); } } |
大家可以看到,正常的Excel导入流程分为上传+解析+数据处理+录入四部,整体的流程是调用对应的接口和插件,而使用TP框架,会直接帮我们绕过上传流程,我们使用PHPEXCEL插件直接到解析,具体代码如下:
下载PHPExcel放到vendor下,并在后台接口中导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | public function save(){ if (request() -> isPost()) { vendor( "PHPExcel.PHPExcel" ); $objPHPExcel = new \PHPExcel(); //var_dump($objPHPExcel);die; //获取表单上传文件 $file = request()->file( 'excel' ); //print_r($file);die; $info = $file->validate([ 'ext' => 'xlsx' ])->move(ROOT_PATH . 'public/file' ); //上传验证后缀名,以及上传之后移动的地址 if ($info) { $exclePath = $info->getSaveName(); //获取文件名 $file_name = ROOT_PATH . 'public/file/' . DS . $exclePath; //上传文件的地址 $objReader =\PHPExcel_IOFactory::createReader( "Excel2007" ); $obj_PHPExcel =$objReader->load($file_name, $encode = 'utf-8' ); //加载文件内容,编码utf-8 $excel_array=$obj_PHPExcel->getSheet(0)->toArray(); //转换为数组格式 //print_r($excel_array);die; array_shift($excel_array); //删除第一个数组(标题); $city = []; $i=0; foreach ($excel_array as $k=>$v) { $click_time = strtotime($v[2]); //点击时间转为时间戳 $active_time = strtotime($v[2]); //激活时间转为时间戳 $city[$k][ 'adid' ] = $v[0]; $city[$k][ 'idfa' ] = $v[1]; $city[$k][ 'udid' ] = $v[4]; $city[$k][ 'model' ] = $v[5]; $city[$k][ 'os' ] = $v[6]; $city[$k][ 'ip' ] = $v[7]; $city[$k][ 'add_time' ] = $click_time; $city[$k][ 'act_time' ] = $active_time; $i++; } // print_r($city);die; Db::name( "check_udid" )->insertAll($city); } else { echo $file->getError(); } } } |
EasyAdmin虽然基于TP6,在使用的过程中我发现,它不需要自己写以上方法,框架自带一些写好的上传方法,直接使用即可,具体方法如下:
在使用的php中导入:
1 | use jianyan\excel\Excel; |
调用即可:
1 2 3 | $file = request()->file( 'file' ); ini_set( 'memory_limit' , '1024M' ); $data = Excel::import($file); |
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签