/** * excel导入 */ public function excelimport() { $eid = I('get.eid','','htmlspecialchars'); //判断是否选择了要上传的表格 if (empty($_FILES['file'])) { $this->ajaxReturn(['code' => 3010,'msg' => '您未选择表格']); } //获取表格的大小,限制上传表格的大小5M $file_size = $_FILES['file']['size']; if ($file_size>5*1024*1024) { $this->ajaxReturn(['code' => 3010,'msg' => '导入失败,上传的表格不能超过5M的大小']); } //限制上传表格类型 $file_type = $_FILES['file']['type']; //application/vnd.ms-excel 为xls文件类型 if ($file_type!='application/vnd.ms-excel') { $this->ajaxReturn(['code' => 3010,'msg' => '导入失败,只能上传excel2003的xls格式!']); } if(is_uploaded_file($_FILES['file']['tmp_name'])) { Vendor('phpexcel.PHPExcel'); Vendor('phpexcel.PHPExcel.IOFactory'); Vendor('phpexcel.PHPExcel.Reader.Excel5'); //以上三步加载phpExcel的类 $objReader = \PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format //接收存在缓存中的excel表格 $filename = $_FILES['file']['tmp_name']; $objPHPExcel = $objReader->load($filename); //$filename可以是上传的表格,或者是指定的表格 $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); // 取得总行数 //循环读取excel表格,读取一条,插入一条 for($j=2;$j<=$highestRow;$j++) { $a = $objPHPExcel->getActiveSheet()->getCell("A".$j)->getValue();//获取me_id的值 M('','',DBConfig::$MYSQL_MAMI_JS_MASTER)->table('js_enterprisesales_medicinalprice')->add([ 'e_id' => $eid, 'me_id' => $a, 'medicinal_price' => 0 ]); } $this->ajaxReturn(['code' => 1,'msg' => '导入成功!']); } } /** * 批量导入数据 */ public function medicineImport() { $tmp_name = $_FILES['file']['tmp_name']; $exts = explode('.',$_FILES['file']['name']); $url = APP_PATH."Runtime/Cache/".time().rand(10000,99999).'.'.$exts[1]; if(move_uploaded_file($tmp_name,$url) ){ $result = $this->dataImport($url,$exts[1]); if($result['code'] == -1){ $this->ajaxError($result['msg']); } unlink($url); $this->ajaxSuccess('导入成功'); }else{ $this->ajaxError('上传失败'); } } private function dataImport($filename, $exts = 'xls') { set_time_limit(0); ini_set('memory_limit','1024M'); ini_set('max_execution_time',0); //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 vendor('PHPExcel.PHPExcel'); //创建PHPExcel对象,注意,不能少了 $PHPExcel = new \PHPExcel(); if ($exts == 'xls') { Vendor('phpexcel.PHPExcel.Reader.Excel5'); $PHPReader = new \PHPExcel_Reader_Excel5(); } else if ($exts == 'xlsx') { Vendor('phpexcel.PHPExcel.Reader.Excel2007'); $PHPReader = new \PHPExcel_Reader_Excel2007(); } //载入文件 $PHPExcel = $PHPReader->load($filename); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $currentSheet = $PHPExcel->getSheet(0); //获取总列数 $allColumn = $currentSheet->getHighestColumn(); //获取总行数 $allRow = $currentSheet->getHighestRow(); $Arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ']; $totalNum = array_search($allColumn,$Arr); //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始 for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { //从哪列开始,A表示第一列 for ($currentColumn = 0; $currentColumn <= $totalNum; $currentColumn++) { //数据坐标 $address = $Arr[$currentColumn] . $currentRow; //读取到的数据,保存到数组$data中 $cell = (string)$currentSheet->getCell($address)->getValue(); $data[$currentRow - 1][$Arr[$currentColumn]] = $cell; } } //验证表格中数据的完整性与格式的准确性 $message = $this->checkExcelData($data); if($message['code'] == -1){ return $message; } //写入数据库操作 //$res = $this->insertData($data); } /** * 验证表格中数据的完整性与准确性 * @param $data * @return mixed */ private function checkExcelData($data){ $message['code'] = 0; $message['msg'] = "失败"; //验证数据规则 if(!empty($data)){ foreach($data as $mk=>$mv){ //验证商品名称,长度不能超过50个长度 if(iconv_strlen($mv['A'],"UTF-8") >49){ $message['code'] = -1; $message['msg'] = $mv['C']."的商品名称不能超过50个长度"; break; } //验证拼音缩写长度,不能超过50个长度 if(iconv_strlen($mv['B'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的商品名首字母缩写不能超过50个长度"; break; } //验证药品通用名不能为空 if(empty($mv['C'])){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的通用名不能为空"; break; } //验证药品通用名长度,不能超过50个长度 if(iconv_strlen($mv['C'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的通用名不能超过50个长度"; break; } //验证药品通用名首字母缩写长度,不能超过50个长度 if(iconv_strlen($mv['D'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的通用名首字母缩写不能超过50个长度"; break; } //验证药品处方完整度 if(empty($mv['E'])){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的处方信息不完整"; break; } //验证药品类别长度 if(iconv_strlen($mv['F'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的类别不能超过50个长度"; break; } //验证药品性状长度,不能超过50个长度 if(iconv_strlen($mv['H'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的性状不能超过50个长度"; break; } //验证药品性状长度,不能超过50个长度 if(iconv_strlen($mv['N'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."的药品企业长度不能超过50个长度"; break; } //验证药品企业简称,不能超过50个长度 if(iconv_strlen($mv['O'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的企业简称不能超过50个长度"; break; } //验证药品参考价格必须是数字类型,且不能为空 if(!preg_match('/^[1-9]\d*(.\d{1,2})?$|^0(.\d{1,2})?$/', $mv['P'])){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的参考价格必须是数字格式"; break; } //验证药品的参考活动价格,长度不能超过50个长度 if(!empty($mv['Q']) && !preg_match('/^[1-9]\d*(.\d{1,2})?$|^0(.\d{1,2})?$/', $mv['Q']) ){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的参考活动价格必须是数字格式"; break; } //验证药品的批准文号,长度不能超过50个长度 if(iconv_strlen($mv['R'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的批准文号不能超过50个长度"; break; } //验证药品条形码长度,长度不能超过50个长度 if(iconv_strlen($mv['S'],"UTF-8") > 49){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的条形码不能超过50个长度"; break; } //验证药品推荐用药天数,必须是数字格式 if(!empty($mv['U']) && !preg_match('/^[1-9]\d*?$/', $mv['U'])){ $message['code'] = -1; $message['msg'] = $mv['C']."药品的用药天数必须为数字格式"; break; } } }else{ $message['code'] = -1; $message['msg'] = "表格格式或者数据有问题,请检查表格"; } return $message; }
1、在在验证字符串长度的时候,一开始使用的strlen进行计算的,后来发现所用到的都是中文字符串;所以利用icon_strlen()方法进行统计中文字符串的长度;并使用参考价格格式进行验证;
2、整个步骤的流程就是先将excel中的表格数据全部取出来,放入一个数组里面,然后将这个数据里面的数据进行格式验证;简化的话,可以在去除数组的时候,就可以验证数据的准确性;这样可以减少很大的一个循环!这个留着后面再优化!
3、将数据的信息取出来以后,然后遍历循环,一个个字段进行数据验证,这个验证是根据后台服务器字段进行规则验证的;
4、最后将数组的信息循环插入遍历数组;