主要是公式解析的代码,还有错误模板下载

 /**
     * 导入报名信息
     */

    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('成功');

    }


点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部
{__SCRIPT__}