From c2196131ce2f0c25089d3e3fc98c74bab1b740d2 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 10 Sep 2024 17:00:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E4=BA=BA=E5=91=98=E8=80=83?= =?UTF-8?q?=E5=8B=A4excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkerAttendanceController.java | 118 +++++++++++++++++- .../excel/人员考勤导入模板(详细).xlsx | Bin 0 -> 10472 bytes 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/excel/人员考勤导入模板(详细).xlsx diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java index 885598786..08b036acc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java @@ -1,5 +1,7 @@ package com.zhgd.xmgl.modules.worker.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; @@ -16,11 +18,24 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -282,8 +297,109 @@ public class WorkerAttendanceController { @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), }) @PostMapping(value = "/safetyPerformanceAnalysis") - public Result safetyPerformanceAnalysis(@ApiIgnore @RequestBody Map paramMap) { + public Result safetyPerformanceAnalysis(@ApiIgnore @RequestBody Map paramMap) { return Result.success(workerAttendanceService.safetyPerformanceAnalysis(paramMap)); } + @ApiOperation(value = "模板导入下载", notes = "模板导入下载") + @GetMapping("/downloadExcelTemplate") + public void downloadExcelTemplate(HttpServletResponse response) { + try { + OutputStream out = response.getOutputStream(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/vnd.ms-excel;charset=gb2312"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("风险清册导入模板.xlsx", "UTF-8")); + InputStream fis = new ClassPathResource("excel/人员考勤导入模板(详细).xlsx").getInputStream(); + IOUtils.copy(fis, out); + out.flush(); + out.close(); + } catch (IOException e) { + log.error("error:", e); + } + } + + @ApiOperation(value = "通过excel导入人员考勤信息", notes = "通过excel导入人员考勤信息", httpMethod = "POST") + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result importData(@RequestParam(value = "file") MultipartFile file) { + try { + if (file == null) { + return Result.error("请上传文件"); + } + Workbook wb = null; + //判断类型 + if (file.getOriginalFilename().endsWith(".xls")) { + wb = new HSSFWorkbook(file.getInputStream()); + } + if (file.getOriginalFilename().endsWith(".xlsx")) { + wb = new XSSFWorkbook(file.getInputStream()); + } + int sheets = wb.getNumberOfSheets(); + List> importExcelVoList = new ArrayList<>(); + //循环表格sheet表单数量 + for (int i = 0; i < sheets; i++) { + Sheet sheet = wb.getSheetAt(i); + if (null == sheet) { + continue; + } + //舍弃第一行表头数据 + for (int j = sheet.getFirstRowNum() + 1; j <= sheet.getLastRowNum(); j++) { + //获取当前行 + Row row = sheet.getRow(j); + if (null == row) { + continue; + } + //遍历行所有的列 + int firstCellNum = row.getFirstCellNum(); + int lastCellNum = row.getLastCellNum(); + //列数 + Map map = new HashMap<>(); + for (int k = firstCellNum; k < lastCellNum; k++) { + //获取单元格的值,不管是否合并的单元格,都可以获取 + String value = ExcelUtils.getSheelValue(sheet, j, k); + //把当前列的值赋值给对应的属性字段 + if (k == 0) { + map.put("projectCode", value); + } else if (k == 1) { + map.put("idCard", value); + } else if (k == 2) { + map.put("passTime", value); + } else if (k == 3) { + map.put("direction", getDirection(value)); + } else if (k == 4) { + map.put("devCode", value); + } + } + map.put("passType", 2); + importExcelVoList.add(map); + } + } + if (CollUtil.isNotEmpty(importExcelVoList)) { + for (Map map : importExcelVoList) { + try { + workerAttendanceService.saveExternalPassRecord(map); + } catch (Exception e) { + log.error("批量导入考勤异常:", e); + } + } + } + return Result.ok(); + } catch (Exception e) { + log.error("", e); + return Result.error("excel解析数据异常......"); + } + } + + private Integer getDirection(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + if (value.trim().equals("进")) { + return 1; + } else if (value.trim().equals("出")) { + return 2; + } + return null; + } + + } diff --git a/src/main/resources/excel/人员考勤导入模板(详细).xlsx b/src/main/resources/excel/人员考勤导入模板(详细).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ef6761a46894f40c807ed83924ad940e918e6cc6 GIT binary patch literal 10472 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 literal 0 HcmV?d00001