0
点赞
收藏
分享

微信扫一扫

php excel

you的日常 2022-03-11 阅读 29

导入

   private static array $excelHead = [
        ['field' => 'contract_no', 'value' => '合同编号'],
        ['field' => 'name', 'value' => '姓名'],
        ['field' => 'sex', 'value' => '性别'],
        ['field' => 'card_id', 'value' => '身份证'],
        ['field' => 'phone', 'value' => '联系电话'],
        ['field' => 'area', 'value' => '家庭住址'],
        ['field' => 'bank', 'value' => '开户行'],
        ['field' => 'bank_no', 'value' => '银行账号'],
        ['field' => 'link_man', 'value' => '紧急联系人'],
        ['field' => 'link_phone', 'value' => '紧急联系人电话'],
        ['field' => 'start_time', 'value' => '进场时间'],
        ['field' => 'end_time', 'value' => '离场时间'],
        ['field' => 'work_code', 'value' => '工种'],
    ];

    public function import(): \think\response\Json
    {
        try {
            $file = request()->file('file');
            $class_id = input('class_id');
            $project_id = session('projectId');
            if (!$class_id) {
                throw new \Exception('班组id有误!');
            }
            if (!$project_id) {
                throw new \Exception('项目id有误!');
            }
            validate(['file' => ['fileSize:10240000', 'fileExt:xls,xlsx']])->check(['file' => $file]);
            $savename = \think\facade\Filesystem::putFile('excel', $file);
            $spreadsheet = IOFactory::load(Filesystem::path($savename));
            $worksheet = $spreadsheet->getSheet(0);
            $highestRow = $worksheet->getHighestRow(); //行数
            if ($highestRow <= 2) {
                throw new \Exception('没获取到数据,请检查后上传');
            }
            $map = ['type' => '工种', 'status' => 1, 'deleted' => 0];
            $work = (new SystemBase())->where($map)->column('code', 'name');
            $array = [];
            $errLog = [];
            $cardList = [];
            $contract_no_list = [];
            $insert_key = CodeExtend::uniqidNumber(19);
            for ($row = 2; $row <= $highestRow; ++$row) {
                $emptyCount = 0;
                $arr = array();
                foreach (self::$excelHead as $k => $v) {
                    $value = str_replace(' ', '', $worksheet->getCellByColumnAndRow($k + 1, $row)->getFormattedValue());
                    switch ($v['field']) {
                        case 'end_time':
                            if ($value === '') {
                                $emptyCount++;
                                $value = null;
                            } else {
                                $value = date('Y-m-d', strtotime($value));
                            }
                            break;
                        case 'start_time':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            } else {
                                $value = date('Y-m-d', strtotime($value));
                            }
                            break;
                        case 'contract_no':
                            if ($value === '') {
                                $emptyCount++;
                                $value = null;
                            } else {
                                if (in_array($value, $contract_no_list)) {
                                    $errLog[$row][] = '第' . $row . '行 合同号重复!';
                                } else {
                                    $contract_no_list[] = $value;
                                }
                            }
                            break;
                        case 'bank':
                        case 'bank_no':
                        case 'area':
                        case 'name':
                        case 'link_man':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            }
                            break;
                        case 'sex':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            } else {
                                if (!in_array($value, ['男', '女'])) {
                                    $errLog[$row][] = '第' . $row . '行 性别错误';
                                } else {
                                    $value = ['男' => 1, '女' => 2][$value];
                                }
                            }
                            break;
                        case 'link_phone':
                        case 'phone':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            } else {
                                if (!checkMobile($value)) {
                                    $errLog[$row][] = '第' . $row . '行 手机号码格式不正确';
                                }
                            }
                            break;
                        case 'work_code':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            } else {
                                $value = explode('&', trim($value, '&'));
                                $tmp = '';
                                foreach ($value as $w) {
                                    if (isset($work[$w])) {
                                        $tmp .= $work[$w] . ',';
                                    } else {
                                        $errLog[$row][] = '第' . $row . '行 工种数据有误';
                                    }
                                }
                                if ($tmp) {
                                    $value = ',' . $tmp;
                                } else {
                                    $errLog[$row][] = '第' . $row . '行 工种数据有误';
                                }
                            }
                            break;
                        case 'card_id':
                            if ($value === '') {
                                $errLog[$row][] = '第' . $row . '行 缺少' . $v['value'];
                                $emptyCount++;
                            } else {
                                if (!isCreditNo($value)) {
                                    $errLog[$row][] = '第' . $row . '行 身份证不正确';
                                } else {
                                    if (in_array($value, $cardList)) {
                                        $errLog[$row][] = '第' . $row . '行 身份证号码重复!';
                                    } else {
                                        $cardList[] = $value;
                                    }
                                }
                            }
                            break;
                    }
                    $arr[$v['field']] = $value;
                    $arr['class_id'] = $class_id;
                    $arr['project_id'] = $project_id;
                    $arr['insert_key'] = $insert_key;
                    $arr['type'] = 1;
                }
                if ($emptyCount === 13) {
                    unset($errLog[$row]);
                    continue;
                }
                $array[] = $arr;
            }
            if (!$array) {
                throw new \Exception('没获取到数据,请检查后上传');
            }
            cliDump($array);
            cliDump($errLog);
            if ($errLog) {
                ksort($errLog);
                $newErrLog = array();
                foreach ($errLog as $v) {
                    $newErrLog = array_merge($newErrLog, $v);
                }
                cliDump($newErrLog);
                return json(['code' => 0, 'info' => '数据有误,请根据提示修改', 'data' => $newErrLog]);
            } else {
                //检查一下合同号是否有相同的
                if ($contract_no_list) {
                    $contractCount = (new ProjectEmployee())->where('deleted', 0)->whereIn('contract_no', $contract_no_list)->count();
                    if ($contractCount) {
                        throw new \Exception('合同号与现有数据有重复!');
                    }
                }
                Db::startTrans();
                (new ProjectEmployee())->insertAll($array, 200);
                $contractList = (new ProjectEmployee())->field('contract_no,id,project_id')->where(['deleted' => 0, 'insert_key' => $insert_key])->select()->toArray();
                if ($contract_no_list) {
                    $contractInsert = [];
                    foreach ($contractList as $v) {
                        $contractInsert[] = ['employee_id' => $v['id'], 'project_id' => $v['project_id'], 'type' => 1, 'no' => $v['contract_no']];
                    }
                    (new ProjectContract())->insertAll($contractInsert, 200);
                }
                Db::commit();
            }
            return json(['code' => 1, 'info' => '导入成功!', 'data' => []]);
        } catch (\Exception $e) {
            cliDump($e->getMessage());
            cliDump($e->getLine());
            return json(['code' => 0, 'info' => $e->getMessage(), 'data' => []]);
        }
    }

导出

    public function download()
    {
        try {
            $count = count(self::$excelHead);  //计算表头数量
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet()->setTitle('导入模板');
            for ($i = 65; $i < $count + 65; $i++) {     //数字转字母从65开始,循环设置表头:
                $sheet->setCellValue(strtoupper(chr($i)) . '1', self::$excelHead[$i - 65]['value']);
                $sheet->getColumnDimension(strtoupper(chr($i)))->setWidth(20);
                $sheet->getStyle(strtoupper(chr($i)))->getAlignment()
                    ->setVertical('center')//设置垂直居中
                    ->setHorizontal('center');//设置水平居中
                if (($i > 65 && $i < 76) || $i == 77) {
                    $sheet->getStyleByColumnAndRow($i - 64, 1)->getFont()->getColor()->setARGB('FFFF0000');
                }
            }
            for ($row = 2; $row < 2000; $row++) {
                $this->setValidation($sheet, 'C' . $row, '"男,女"');
            }
            $work = SystemBase::mk()->items('工种');
            $sheet->setCellValue('O1', '工种选项(多项用“&”拼接)');
            $sheet->getColumnDimension('O')->setWidth(30);
            $sheet->getStyleByColumnAndRow(15, 1)->getFont()->getColor()->setARGB('FFFF0000');
            $i = 2;
            foreach ($work as $v) {
                $sheet->setCellValue('O' . $i++, $v['name']);
            }
            $writer = new Xlsx($spreadsheet);
            $fileName = '劳务人员导入模板' . date('YmdHis') . '.xlsx';
            $savename = Filesystem::path('excel/' . $fileName);
            $writer->save($savename);
            //删除清空:
            $spreadsheet->disconnectWorksheets();
            return download($savename, $fileName);
            // $this->success('avc!', '');
        } catch (\Exception $e) {
            dump($e->getMessage());
            dump($e->getLine());
//            cliDump($e->getMessage());
//            cliDump($e->getLine());
        }
    }
举报

相关推荐

0 条评论