/** * 处理Execl表格导入 * @param $token * @return array */ public function importExcel(){ header("Access-Control-Allow-Origin: *"); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With'); header('Access-Control-Allow-Credentials: true'); header("content-type:text/html; charset=utf-8"); //获取文件上传信息 $execl_file = request()->file('file'); //前端代码自己写,发起请求到 该类的importExcel方法
$file_path = $this->moveToUpload($execl_file); if(!empty($file_path)){ $data =$this->handleExcelFile($file_path); return $data; }else{ return ''; } //遍历data数据 写入数据库 添加方法自己写,我这是调用自己之前写的
for ($j=0; $j<count($data,0); $j++){ foreach ($data[$j] as $key=>$value){ foreach ($data[$j][$key] as $k=>$v){ $save_data = [ 'subject_code' =>$data[$j][$key]['A'], 'subject_name' =>$data[$j][$key]['B'], ]; } $logicSubject =Loader::model('Subjectcode','logic'); $logicSubject->addSubject($save_data); } }
}
/** * 处理获取到的文件移动到uploads下,返回路径 * @param $request_file 获取到的文件 * @return array|string 返回移动后的路径 */ public function moveToUpload($request_file){ if(!empty($request_file)){ //处理文件逻辑,移动到uploads目录下 $move_files = $request_file->move(ROOT_PATH.'public'.DS.'uploads'.DS); if($move_files){ $file_path = ROOT_PATH.'public'.DS.'uploads'.DS.$move_files->getSaveName(); }else{ return retmsg(-1,$request_file->getError(),'移动文件失败'); } } return $file_path; } /** * 处理表格中的数据返回所有数据组成的数组 * @param $file_path 文件路径 * @return array 文件中的数据,三维数组,如果只有一个sheet,遍历的时候选择 array[0] */ public function handleExcelFile($file_path){ vendor('PHPExcel.Classes.PHPExcel'); //获取文件后缀,根据后缀来实例化不同的对象 $file_suffix = pathinfo($file_path)['extension']; switch ($file_suffix){ case 'xlsx': $obj_reader = \PHPExcel_IOFactory::createReader('Excel2007'); $php_excel = $obj_reader->load($file_path,$encode = 'utf-8'); break; case 'xls': $obj_reader = \PHPExcel_IOFactory::createReader('Excel5'); $php_excel = $obj_reader->load($file_path,$encode = 'utf-8'); break; default: return retmsg(-1,'','文件类型不符合要求'); } //获取sheet的个数,遍历每个sheet的数据 $sheet_count = $php_excel->getSheetCount(); $all_data=[]; //用于保存表中的数据 for($i=0; $i<$sheet_count; $i++){ $currentSheet = $php_excel->getSheet($i); //获取表中的第一个工作表 // $now_sheet = $php_excel->setActiveSheetIndex($i);//获得当前sheet $highestRow = $currentSheet->getHighestRow(); // 获取最大行 $highestCol = $currentSheet->getHighestColumn(); //获取最大列 $index = 0; //有些表某行可能为空,不应该导入,如果不为空才存在 数组中 //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,从第二行开始,去掉表头字段 for($currentRow = 2; $currentRow<=$highestRow; $currentRow++){ //从哪列开始,A表示第一列 for($currentCol ='A'; $currentCol<=$highestCol ;$currentCol++ ){ //选中当前坐标 $address = $currentCol.$currentRow; //读取数据 $cell = $currentSheet->getCell($address)->getValue(); //把富文本转换成string格式 if($cell instanceof \PHPExcel_RichText){ $cell = $cell->__toString(); } if(empty($cell) || !is_numeric($cell)){ break; } //将单个表格中的数据保存在数组中 $all_data[$i][$index][$currentCol] = $cell; $index++; } } } return $all_data; }