主要是公式解析的代码,还有错误模板下载
/** * 导入报名信息 */ public function import() { // echo '11';die; ini_set('memory_limit', '4096M'); ini_set('max_execution_time', '180'); $sig_tetr_id = input('post.tetr_id/d'); //研修id $tetrinfo = Training::get($sig_tetr_id); if (!$tetrinfo) { $this->error('研修信息错误'); } $file = $this->request->request('file'); $domain = $this->request->domain(); $file = str_replace($domain, '', $file); if (!$file) { $this->error(__('文件未找到', 'file')); } $filePath = ROOT_PATH . DS . 'public' . DS . $file; if (!is_file($filePath)) { $this->error(__('未知的数据格式!')); } //实例化reader $ext = pathinfo($filePath, PATHINFO_EXTENSION); if (!in_array($ext, ['csv', 'xls', 'xlsx'])) { $this->error(__('请上传正确格式的文件')); } $reader = new Xlsx(); //加载文件 $insert = []; try { $reader->setReadDataOnly(true); if (!$PHPExcel = $reader->load($filePath)) { $this->error(__('未知的数据格式!')); } $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表 $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号 $allRow = $currentSheet->getHighestRow(); //取得一共有多少行 $maxColumnNumber = Coordinate::columnIndexFromString($allColumn); $fields = []; for ($currentRow = 1; $currentRow <= 1; $currentRow++) { for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue(); $fields[] = $val; } } for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) { $values = []; for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) { $cell = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow); $val = $cell->getCalculatedValue(); // 获取公式的计算结果 if($cell->getDataType()==\PHPExcel_Cell_DataType::TYPE_NUMERIC){ $cellstyleformat=$cell->getStyle($cell->getCoordinate())->getNumberFormat(); $formatcode=$cellstyleformat->getFormatCode(); if (preg_match('/^(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy]/i', $formatcode)) { $val=date("Y-m-d",\PHPExcel_Shared_Date::ExcelToPHP($val)); }else{ $val= \PHPExcel_Style_NumberFormat::toFormattedString($val,$formatcode); } } $values[] = is_null($val) ? '' : trim($val); //清除数据中的空格; } var_export($values); $rowStr = rtrim(ltrim(implode("", $values))); $values = array_slice($values, 0, 13); //确认前八位 //'sig_price','sig_payment_way', if (!empty($rowStr)) { $fields = [ 'num', 'stu_name', 'stu_cardid', 'stu_sex', 'stu_province', 'stu_city', 'stu_area', 'stu_mobile', 'stu_emp_name' ]; $temp = array_combine($fields, $values); $insert[] = $temp; } } } catch (Exception $exception) { $this->error($exception->getMessage()); } // die; if (!$insert) { $this->error(__('未更新任何行')); } \think\Db::startTrans(); try { //检验学员信息, $insert = trim_twoarray($insert); $list = Training::checkSignParams($insert); $error = []; $success = []; foreach ($list as $key => $value) { if ($value['code'] == false) { $value['stu_cardid'] = trim($value['stu_cardid']) . "\t"; $error[] = $value; } else { $value['stu_username'] = strtoupper(trimall($value['stu_cardid'])); $v['stu_cardid'] = strtoupper(trimall($value['stu_cardid'])); $value['stu_name'] = trimall($value['stu_name']); $success[] = $value; } } $studentModel = new \app\admin\model\Student(); $signModel = new Sign(); $Examconfig = new Examconfig(); $examInfo = $Examconfig->order('exac_id', 'desc')->find(); $stuIdArr = []; $signData = []; $errnewData = []; if ($success) { //处理学员数据 foreach ($success as $k => $v) { $findStudent = $studentModel ->where(['stu_cardid' => encrypt($v['stu_cardid'])]) ->whereOr(['stu_mobile' => encrypt($v['stu_mobile'])]) ->find(); if (!$findStudent) { $res = \app\admin\model\Student::create( $v, array( 'stu_name', 'stu_cardid', 'stu_sex', 'stu_city', 'stu_mobile', 'stu_email', 'stu_address', 'stu_password', 'stu_source', 'stu_emp_id', 'stu_pos_id', 'stu_dutid', 'stu_provinceid', 'stu_province', 'stu_cityid', 'stu_areaid', 'stu_area', 'stu_username' ) ) ->validate('Student.add'); $stuId = $res->stu_id; if ($res == false) { $this->error($studentModel->getError()); } } else { $stuId = $findStudent->stu_id; } $stuIdArr[] = $stuId; $is_sign = $signModel->where(['sig_student_id' => $stuId, 'sig_tetr_id' => $sig_tetr_id])->find(); if ($is_sign) { $v['msg'] = '学员:' . $v['stu_cardid'] . '的 ' . $tetrinfo['tetr_name'] . '研修已报名过;'; $v['stu_cardid'] = trim($v['stu_cardid']) . "\t"; $v['stu_mobile'] = trim($v['stu_mobile']) . "\t"; $errnewData[] = $v; continue; } $signData[$k]['sig_payment_type'] = 1; //统一 $signData[$k]['sig_payment_way'] = 'backend'; $signData[$k]['sig_examinations'] = $examInfo->exac_examinations ?? '2'; $signData[$k]['sig_cityid'] = $v['stu_cityid']; $signData[$k]['sig_areaid'] = $v['stu_areaid']; $signData[$k]['sig_course_id'] = $tetrinfo['tetr_cou_id']; $signData[$k]['stu_emp_name'] = $v['stu_emp_name']; $signData[$k]['sig_student_id'] = $stuId; $signData[$k]['sig_date'] = $v['sig_date']; $signData[$k]['sig_tetr_id'] = $sig_tetr_id; } $studentModel->where(['stu_id' => ['IN', $stuIdArr]])->update(['stu_issign' => '1']); if ($signData) { $result = $signModel->allowField(true)->saveAll($signData); if ($result == false) { $this->error('错误' . $signModel->getError()); } } \think\Db::commit(); } $allErrorData = array_merge($error, $errnewData); if ($allErrorData) { foreach ($allErrorData as $ky => &$v) { $v['num'] = $ky + 1; } //制作excel进行导出; $excelkey = [ '1' => '序号', '2' => '学员姓名', '3' => '学员身份证号码', '4' => '学员性别(男,女,保密)', '5' => '省', '6' => '市', '7' => '区', '8' => '联系电话', '9' => '单位', '10' => '错误信息' ]; $excelval = [ '1' => 'num', '2' => 'stu_name', '3' => 'stu_cardid', '4' => 'stu_sex', '5' => 'stu_province', '6' => 'stu_city', '7' => 'stu_area', '8' => 'stu_mobile', '9' => 'stu_emp_name', '10' => 'msg' ]; $return = $this->outPutExcel($allErrorData, $excelkey, $excelval, '报名错误数据', false, '20', ''); if ($return['code'] != '1') { $this->error('功能异常,请联系管理员'); } $this->success('导入成功:' . count($signData) . '条数据,失败:' . count($allErrorData) . '条数据', $return, '2'); } $this->success('导入成功:' . count($signData) . '条数据,失败:0条数据'); } catch (\think\Exception $exception) { \think\Db::rollback(); $msg = $exception->getMessage(); if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) { $msg = "导入失败,包含【{$matches[1]}】的记录已存在"; }; $this->error($msg . '__' . $exception->getLine()); } catch (\think\Exception $e) { \think\Db::rollback(); $this->error($e->getTrace() . $e->getMessage() . $e->getLine()); } $this->success('成功'); }
发表评论 取消回复