From a2c3c7a3032ac93bbcfd83f055b036f7e8b6c20b Mon Sep 17 00:00:00 2001 From: songhuangfeng123 <shf18767906695@163.com> Date: 星期三, 27 七月 2022 18:13:00 +0800 Subject: [PATCH] fix --- equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/EmergencyDrillEvaluationFileInfo.java | 117 +++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLog.java | 79 ++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/ExcApprove.java | 33 + emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/controller/EmergencyWorkApproveController.java | 2 goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java | 758 +++++++++++++++++++++++++ equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java | 31 + goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelSheet.java | 66 ++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetMngExcel.java | 114 +++ emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyWorkApproveServiceImpl.java | 4 goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelCell.java | 81 ++ emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyWorkApproveServiceImpl.java | 4 tmlog.lck | 0 goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/TargetMngImportExcel.java | 100 +++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetDutySummaryExcel.java | 174 +++++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/DateUtils.java | 81 ++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLogs.java | 62 ++ goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/FieldForSortting.java | 61 ++ 17 files changed, 1,762 insertions(+), 5 deletions(-) diff --git a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/controller/EmergencyWorkApproveController.java b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/controller/EmergencyWorkApproveController.java index 00db525..96cf0cf 100644 --- a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/controller/EmergencyWorkApproveController.java +++ b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/controller/EmergencyWorkApproveController.java @@ -16,7 +16,7 @@ import java.util.List; @RestController -@RequestMapping("/WorkApprove") +@RequestMapping("/emergencyWorkApprove") public class EmergencyWorkApproveController { @Autowired diff --git a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyEmergencyWorkApproveServiceImpl.java b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyWorkApproveServiceImpl.java similarity index 89% rename from emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyEmergencyWorkApproveServiceImpl.java rename to emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyWorkApproveServiceImpl.java index 571f55b..8c768c7 100644 --- a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyEmergencyWorkApproveServiceImpl.java +++ b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/baseService/impl/EmergencyWorkApproveServiceImpl.java @@ -13,8 +13,8 @@ import java.util.List; -@Service("workApproveInfoService") -public class EmergencyEmergencyWorkApproveServiceImpl extends ServiceImpl<EmergencyWorkApproveInfoRepository, EmergencyWorkApproveInfo> implements EmergencyWorkApproveInfoService { +@Service("emergencyWorkApproveInfoService") +public class EmergencyWorkApproveServiceImpl extends ServiceImpl<EmergencyWorkApproveInfoRepository, EmergencyWorkApproveInfo> implements EmergencyWorkApproveInfoService { @Autowired private EmergencyWorkApproveInfoRepository EmergencyWorkApproveInfoRepository; diff --git a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyEmergencyWorkApproveServiceImpl.java b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyWorkApproveServiceImpl.java similarity index 97% rename from emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyEmergencyWorkApproveServiceImpl.java rename to emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyWorkApproveServiceImpl.java index fcedc40..09acac0 100644 --- a/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyEmergencyWorkApproveServiceImpl.java +++ b/emergency/emergency-service/src/main/java/com/gkhy/safePlatform/emergency/service/impl/EmergencyWorkApproveServiceImpl.java @@ -25,8 +25,8 @@ import java.util.Date; import java.util.List; -@Service("workApproveService") -public class EmergencyEmergencyWorkApproveServiceImpl implements EmergencyWorkApproveService { +@Service("emergencyWorkApproveService") +public class EmergencyWorkApproveServiceImpl implements EmergencyWorkApproveService { @Autowired private EmergencyWorkApproveInfoService workApproveInfoService; diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/EmergencyDrillEvaluationFileInfo.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/EmergencyDrillEvaluationFileInfo.java new file mode 100644 index 0000000..a9c3036 --- /dev/null +++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/EmergencyDrillEvaluationFileInfo.java @@ -0,0 +1,117 @@ +package com.gkhy.safePlatform.equipment.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.util.Date; + +@TableName("emergency_drill_evaluation_file") +public class EmergencyDrillEvaluationFileInfo { + + @TableId(type = IdType.AUTO) + private Long id; + + private Boolean delFlag; + + private Date gmtCreate; + + private Date gmtModitify; + + private Long createUid; + + private Long updateUid; + + private Long drillEvaluationId; + + private String fileUrl; + + private String fileName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Boolean getDelFlag() { + return delFlag; + } + + public void setDelFlag(Boolean delFlag) { + this.delFlag = delFlag; + } + + public Date getGmtCreate() { + return gmtCreate; + } + + public void setGmtCreate(Date gmtCreate) { + this.gmtCreate = gmtCreate; + } + + public Date getGmtModitify() { + return gmtModitify; + } + + public void setGmtModitify(Date gmtModitify) { + this.gmtModitify = gmtModitify; + } + + public Long getCreateUid() { + return createUid; + } + + public void setCreateUid(Long createUid) { + this.createUid = createUid; + } + + public Long getUpdateUid() { + return updateUid; + } + + public void setUpdateUid(Long updateUid) { + this.updateUid = updateUid; + } + + public Long getDrillEvaluationId() { + return drillEvaluationId; + } + + public void setDrillEvaluationId(Long drillEvaluationId) { + this.drillEvaluationId = drillEvaluationId; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + @Override + public String toString() { + return "EmergencyDrillEvaluationFileInfo{" + + "id=" + id + + ", delFlag=" + delFlag + + ", gmtCreate=" + gmtCreate + + ", gmtModitify=" + gmtModitify + + ", createUid=" + createUid + + ", updateUid=" + updateUid + + ", drillEvaluationId=" + drillEvaluationId + + ", fileUrl='" + fileUrl + '\'' + + ", fileName='" + fileName + '\'' + + '}'; + } +} diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java new file mode 100644 index 0000000..fdf6802 --- /dev/null +++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java @@ -0,0 +1,31 @@ +package com.gkhy.safePlatform.equipment.enums; + +public enum EquipmentResultCodes { + + + ERROR("A3000", "未知错误"); + + private String code; + private String desc; + + private EquipmentResultCodes(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDesc() { + return this.desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/ExcApprove.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/ExcApprove.java new file mode 100644 index 0000000..dd4af11 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/ExcApprove.java @@ -0,0 +1,33 @@ +package com.gkhy.safePlatform.targetDuty.model.dto.req; + +import com.gkhy.safePlatform.targetDuty.entity.BaseDomain; + +/** + * (WorkApprove)表实体类 + * + * @author xurui + * @since 2022-07-22 10:46:11 + */ +@SuppressWarnings("serial") +public class ExcApprove extends BaseDomain { + + private Long id; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + //审批意见 + private String approveMemo; + + public String getApproveMemo() { + return approveMemo; + } + + public void setApproveMemo(String approveMemo) { + this.approveMemo = approveMemo; + } + +} \ No newline at end of file diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/TargetMngImportExcel.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/TargetMngImportExcel.java new file mode 100644 index 0000000..4972d6d --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/req/TargetMngImportExcel.java @@ -0,0 +1,100 @@ +package com.gkhy.safePlatform.targetDuty.model.dto.req; + +import com.gkhy.safePlatform.targetDuty.utils.poihelper.ExcelCell; + +import java.io.Serializable; +import java.sql.Timestamp; + +public class TargetMngImportExcel implements Serializable { + + //安全目标指标 + @ExcelCell(index = 1) + private String qName; + //目标指标编号 + @ExcelCell(index = 2) + private String indexNum; + //年度 + @ExcelCell(index = 3) + private String year; + //指标值 + @ExcelCell(index = 4) + private String value; + //指标级别 1:公司级 2:部门分厂级 3:工段班组级 + @ExcelCell(index = 5) + private Integer level; + //完成期限 + @ExcelCell(index = 7) + private Timestamp completeDate; + //备注信息 + @ExcelCell(index = 8) + private String memo; + //指标类型 1:年指标 2:月指标 + @ExcelCell(index = 6) + private Integer targetType; + + + public String getqName() { + return qName; + } + + public void setqName(String qName) { + this.qName = qName; + } + + //目标指标编号 + public String getIndexNum() { + return indexNum; + } + + public void setIndexNum(String indexNum) { + this.indexNum = indexNum; + } + //年度 + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + //指标值 + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + //指标级别 1:公司级 2:部门分厂级 3:工段班组级 + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + //完成期限 + public Timestamp getCompleteDate() { + return completeDate; + } + + public void setCompleteDate(Timestamp completeDate) { + this.completeDate = completeDate; + } + //备注信息 + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + //指标类型 1:年指标 2:月指标 + public Integer getTargetType() { + return targetType; + } + + public void setTargetType(Integer targetType) { + this.targetType = targetType; + } +} \ No newline at end of file diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetDutySummaryExcel.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetDutySummaryExcel.java new file mode 100644 index 0000000..bb40b8d --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetDutySummaryExcel.java @@ -0,0 +1,174 @@ +package com.gkhy.safePlatform.targetDuty.model.dto.resp; + +import com.gkhy.safePlatform.targetDuty.utils.poihelper.ExcelCell; + +import java.io.Serializable; +import java.sql.Timestamp; + +public class TargetDutySummaryExcel implements Serializable { + //责任部门名 + @ExcelCell(index = 1) + private String departmentName; + //安全目标指标 + @ExcelCell(index = 2) + private String targetValue; + //考核指标 + @ExcelCell(index = 3) + private String examineValue; + //月份 + @ExcelCell(index = 4) + private String yiYue; + @ExcelCell(index = 5) + private String erYue; + @ExcelCell(index = 6) + private String sanYue; + @ExcelCell(index = 7) + private String siYue; + @ExcelCell(index = 8) + private String wuYue; + @ExcelCell(index = 9) + private String liuYue; + @ExcelCell(index = 10) + private String qiYue; + @ExcelCell(index = 11) + private String baYue; + @ExcelCell(index = 12) + private String jiuYue; + @ExcelCell(index = 13) + private String shiYue; + @ExcelCell(index = 14) + private String shiyiYue; + @ExcelCell(index = 15) + private String shierYue; + //考核指标 1:合格 2:不合格 + @ExcelCell(index = 16) + private Integer examineResult; + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } + + public String getTargetValue() { + return targetValue; + } + + public void setTargetValue(String targetValue) { + this.targetValue = targetValue; + } + + public String getExamineValue() { + return examineValue; + } + + public void setExamineValue(String examineValue) { + this.examineValue = examineValue; + } + + public String getYiYue() { + return yiYue; + } + + public void setYiYue(String yiYue) { + this.yiYue = yiYue; + } + + public String getErYue() { + return erYue; + } + + public void setErYue(String erYue) { + this.erYue = erYue; + } + + public String getSanYue() { + return sanYue; + } + + public void setSanYue(String sanYue) { + this.sanYue = sanYue; + } + + public String getSiYue() { + return siYue; + } + + public void setSiYue(String siYue) { + this.siYue = siYue; + } + + public String getWuYue() { + return wuYue; + } + + public void setWuYue(String wuYue) { + this.wuYue = wuYue; + } + + public String getLiuYue() { + return liuYue; + } + + public void setLiuYue(String liuYue) { + this.liuYue = liuYue; + } + + public String getQiYue() { + return qiYue; + } + + public void setQiYue(String qiYue) { + this.qiYue = qiYue; + } + + public String getBaYue() { + return baYue; + } + + public void setBaYue(String baYue) { + this.baYue = baYue; + } + + public String getJiuYue() { + return jiuYue; + } + + public void setJiuYue(String jiuYue) { + this.jiuYue = jiuYue; + } + + public String getShiYue() { + return shiYue; + } + + public void setShiYue(String shiYue) { + this.shiYue = shiYue; + } + + public String getShiyiYue() { + return shiyiYue; + } + + public void setShiyiYue(String shiyiYue) { + this.shiyiYue = shiyiYue; + } + + public String getShierYue() { + return shierYue; + } + + public void setShierYue(String shierYue) { + this.shierYue = shierYue; + } + + public Integer getExamineResult() { + return examineResult; + } + + public void setExamineResult(Integer examineResult) { + this.examineResult = examineResult; + } +} \ No newline at end of file diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetMngExcel.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetMngExcel.java new file mode 100644 index 0000000..e14bbc0 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/model/dto/resp/TargetMngExcel.java @@ -0,0 +1,114 @@ +package com.gkhy.safePlatform.targetDuty.model.dto.resp; + +import com.gkhy.safePlatform.targetDuty.entity.TargetDivideDetail; +import com.gkhy.safePlatform.targetDuty.utils.poihelper.ExcelCell; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; + +public class TargetMngExcel implements Serializable { + + //安全目标指标 + @ExcelCell(index = 1) + private String qName; + //目标指标编号 + @ExcelCell(index = 2) + private String indexNum; + //年度 + @ExcelCell(index = 3) + private String year; + //指标值 + @ExcelCell(index = 4) + private String value; + //指标级别 1:公司级 2:部门分厂级 3:工段班组级 + @ExcelCell(index = 5) + private Integer level; + //指标类型 1:年指标 2:月指标 + @ExcelCell(index = 6) + private Integer targetType; + //完成期限 + @ExcelCell(index = 7) + private Timestamp completeDate; + //分解状态 1:已分解 2:未分解 + @ExcelCell(index = 8) + private Integer divideStatus; + //备注信息 + @ExcelCell(index = 9) + private String memo; + + public Integer getDivideStatus() { + return divideStatus; + } + + public void setDivideStatus(Integer divideStatus) { + this.divideStatus = divideStatus; + } + + + public String getqName() { + return qName; + } + + public void setqName(String qName) { + this.qName = qName; + } + + //目标指标编号 + public String getIndexNum() { + return indexNum; + } + + public void setIndexNum(String indexNum) { + this.indexNum = indexNum; + } + //年度 + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + //指标值 + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + //指标级别 1:公司级 2:部门分厂级 3:工段班组级 + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + //完成期限 + public Timestamp getCompleteDate() { + return completeDate; + } + + public void setCompleteDate(Timestamp completeDate) { + this.completeDate = completeDate; + } + //备注信息 + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + //指标类型 1:年指标 2:月指标 + public Integer getTargetType() { + return targetType; + } + + public void setTargetType(Integer targetType) { + this.targetType = targetType; + } +} \ No newline at end of file diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/DateUtils.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/DateUtils.java new file mode 100644 index 0000000..b279591 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/DateUtils.java @@ -0,0 +1,81 @@ +package com.gkhy.safePlatform.targetDuty.utils; + + +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.Assert; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DateUtils { + + public static final String PATTERN_STANDARD = "yyyy-MM-dd HH:mm:ss"; + + public static final String PATTERN_DATE = "yyyy-MM-dd"; + + public static final String PATTERN_DATE_MIN="yyyy-MM-dd HH:mm"; + // 小时分钟格式 (分笔成交时间) + public static final String PATTERN_HOUR_MIN = "HH:mm"; + + public static final String PATTERN_DATE_HOUR="yyyy-MM-dd HH"; + + public static final String PATTERN_DATE_DATE_CHS="yyyy年MM月dd日"; + + public static final String PATTERN1_DATE = "yyyy/MM/dd"; + + public static final String PATTERN_CONNECT_DATE="yyyyMMddHHmmss"; + public static final String PATTERN_CONNECT_DATE_YYYYMMDD="yyyyMMdd"; + public static final String PATTERN_CONNECT_DATE_YYMMDD="yyMMdd"; + public static final String PATTERN_ALLTIME_NOSIGN = "yyyyMMddHHmmssSSS"; + + public static final String PATTERN_MONTH = "yyyy-MM"; + + public static final String PATTERN_MONTH1 = "yyyyMM"; + + public static final String PATTERN2_STANDARD = "yyyy-MM-dd HH:mm:ss.SSS"; + + public static final String PATTERN_UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + + public static String date2String(Date date, String pattern) { + if (date == null) { + throw new IllegalArgumentException("timestamp null illegal"); + } + if (pattern == null || pattern.equals("")) { + pattern = PATTERN_STANDARD; + ; + } + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + return sdf.format(date); + } + + + public static Timestamp string2Timestamp(String strDateTime, String pattern) { + if (strDateTime == null || strDateTime.equals("")) { + throw new IllegalArgumentException("Date Time Null Illegal"); + } + if (pattern == null || pattern.equals("")) { + pattern = PATTERN_STANDARD; + } + + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + Date date = null; + try { + date = sdf.parse(strDateTime); + } catch (ParseException e) { + throw new RuntimeException(e); + } + return new Timestamp(date.getTime()); + } + + +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelCell.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelCell.java new file mode 100644 index 0000000..845449a --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelCell.java @@ -0,0 +1,81 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * The <code>ExcelCell</code><br> + * 数值型的栏位只能使用Double + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ExcelCell { + /** + * 顺序 default 100 + * + * @return index + */ + int index(); + + /** + * 当值为null时要显示的值 default StringUtils.EMPTY + * + * @return defaultValue + */ + String defaultValue() default ""; + + /** + * 用于验证 + * + * @return valid + */ + Valid valid() default @Valid(); + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + @interface Valid { + /** + * 必须与in中String相符,目前仅支持String类型 + * + * @return e.g. {"key","value"} + */ + String[] in() default {}; + + /** + * 是否允许为空,用于验证数据 default true + * + * @return allowNull + */ + boolean allowNull() default true; + + /** + * Apply a "greater than" constraint to the named property + * + * @return gt + */ + double gt() default Double.NaN; + + /** + * Apply a "less than" constraint to the named property + * @return lt + */ + double lt() default Double.NaN; + + /** + * Apply a "greater than or equal" constraint to the named property + * + * @return ge + */ + double ge() default Double.NaN; + + /** + * Apply a "less than or equal" constraint to the named property + * + * @return le + */ + double le() default Double.NaN; + } +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLog.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLog.java new file mode 100644 index 0000000..d21b65e --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLog.java @@ -0,0 +1,79 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +/** + * The <code>ExcelLog</code> + * + */ +public class ExcelLog { + private Integer rowNum; + private Object object; + private String log; + + /** + * @return the rowNum + */ + public Integer getRowNum() { + return rowNum; + } + + /** + * @param rowNum + * the rowNum to set + */ + public void setRowNum(Integer rowNum) { + this.rowNum = rowNum; + } + + /** + * @return the object + */ + public Object getObject() { + return object; + } + + /** + * @param object + * the object to set + */ + public void setObject(Object object) { + this.object = object; + } + + /** + * @return the log + */ + public String getLog() { + return log; + } + + /** + * @param object + * @param log + */ + public ExcelLog(Object object, String log) { + super(); + this.object = object; + this.log = log; + } + + /** + * @param rowNum + * @param object + * @param log + */ + public ExcelLog(Object object, String log, Integer rowNum) { + super(); + this.rowNum = rowNum; + this.object = object; + this.log = log; + } + + /** + * @param log + * the log to set + */ + public void setLog(String log) { + this.log = log; + } + +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLogs.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLogs.java new file mode 100644 index 0000000..0e0f7ac --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelLogs.java @@ -0,0 +1,62 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import java.util.ArrayList; +import java.util.List; + +/** + * The <code>ExcelLogs</code> + * + */ +public class ExcelLogs { + private Boolean hasError; + private List<ExcelLog> logList; + + /** + * + */ + public ExcelLogs() { + super(); + hasError = false; + } + + /** + * @return the hasError + */ + public Boolean getHasError() { + return hasError; + } + + /** + * @param hasError + * the hasError to set + */ + public void setHasError(Boolean hasError) { + this.hasError = hasError; + } + + /** + * @return the logList + */ + public List<ExcelLog> getLogList() { + return logList; + } + + public List<ExcelLog> getErrorLogList() { + List<ExcelLog> errList = new ArrayList<>(); + for (ExcelLog log : this.logList) { + if (log != null && ExcelUtil.isNotBlank(log.getLog())) { + errList.add(log); + } + } + return errList; + } + + /** + * @param logList + * the logList to set + */ + public void setLogList(List<ExcelLog> logList) { + this.logList = logList; + } + +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelSheet.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelSheet.java new file mode 100644 index 0000000..2f5e5bf --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelSheet.java @@ -0,0 +1,66 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import java.util.Collection; +import java.util.Map; + +/** + * 用于汇出多个sheet的Vo The <code>ExcelSheet</code> + * + */ +public class ExcelSheet<T> { + private String sheetName; + private Map<String,String> headers; + private Collection<T> dataset; + + /** + * @return the sheetName + */ + public String getSheetName() { + return sheetName; + } + + /** + * Excel页签名称 + * + * @param sheetName + * the sheetName to set + */ + public void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + /** + * Excel表头 + * + * @return the headers + */ + public Map<String,String> getHeaders() { + return headers; + } + + /** + * @param headers + * the headers to set + */ + public void setHeaders(Map<String,String> headers) { + this.headers = headers; + } + + /** + * Excel数据集合 + * + * @return the dataset + */ + public Collection<T> getDataset() { + return dataset; + } + + /** + * @param dataset + * the dataset to set + */ + public void setDataset(Collection<T> dataset) { + this.dataset = dataset; + } + +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java new file mode 100644 index 0000000..a8f9759 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/ExcelUtil.java @@ -0,0 +1,758 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import com.gkhy.safePlatform.targetDuty.utils.DateUtils; +import org.apache.commons.beanutils.BeanComparator; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ComparatorUtils; +import org.apache.commons.collections.comparators.ComparableComparator; +import org.apache.commons.collections.comparators.ComparatorChain; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.sql.Timestamp; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * The <code>ExcelUtil</code> 与 {@link ExcelCell}搭配使用 + * + */ +public class ExcelUtil { + + private static Logger LG = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * 用来验证excel与Vo中的类型是否一致 <br> + * Map<栏位类型,只能是哪些Cell类型> + */ + private static Map<Class<?>, CellType[]> validateMap = new HashMap<>(); + + static { + validateMap.put(String[].class, new CellType[]{CellType.STRING}); + validateMap.put(Double[].class, new CellType[]{CellType.NUMERIC}); + validateMap.put(String.class, new CellType[]{CellType.STRING}); + validateMap.put(Double.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Timestamp.class, new CellType[]{CellType.NUMERIC, CellType.STRING}); + validateMap.put(Date.class, new CellType[]{CellType.NUMERIC, CellType.STRING}); + validateMap.put(Integer.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Float.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Long.class, new CellType[]{CellType.NUMERIC}); + validateMap.put(Boolean.class, new CellType[]{CellType.BOOLEAN}); + } + + /** + * 获取cell类型的文字描述 + * + * @param cellType <pre> + * CellType.BLANK + * CellType.BOOLEAN + * CellType.ERROR + * CellType.FORMULA + * CellType.NUMERIC + * CellType.STRING + * </pre> + * @return + */ + private static String getCellTypeByInt(CellType cellType) { + if(cellType == CellType.BLANK) + return "Null type"; + else if(cellType == CellType.BOOLEAN) + return "Boolean type"; + else if(cellType == CellType.ERROR) + return "Error type"; + else if(cellType == CellType.FORMULA) + return "Formula type"; + else if(cellType == CellType.NUMERIC) + return "Numeric type"; + else if(cellType == CellType.STRING) + return "String type"; + else + return "Unknown type"; + } + + /** + * 获取单元格值 + * + * @param cell + * @return + */ + private static Object getCellValue(Cell cell) { + if (cell == null + || (cell.getCellTypeEnum() == CellType.STRING && isBlank(cell + .getStringCellValue()))) { + return null; + } + DataFormatter dataFormatter = new DataFormatter(); + String s = dataFormatter.formatCellValue(cell); + return s; + +// CellType cellType = cell.getCellTypeEnum(); +// if(cellType == CellType.BLANK) +// return null; +// else if(cellType == CellType.BOOLEAN) +// return cell.getBooleanCellValue(); +// else if(cellType == CellType.ERROR) +// return cell.getErrorCellValue(); +// else if(cellType == CellType.FORMULA) { +// try { +// if (HSSFDateUtil.isCellDateFormatted(cell)) { +// return cell.getDateCellValue(); +// } else { +// return cell.getNumericCellValue(); +// } +// } catch (IllegalStateException e) { +// return cell.getRichStringCellValue(); +// } +// } +// else if(cellType == CellType.NUMERIC){ +// if (DateUtil.isCellDateFormatted(cell)) { +// return cell.getDateCellValue(); +// } else { +// return cell.getNumericCellValue(); +// } +// } +// else if(cellType == CellType.STRING) +// return cell.getStringCellValue(); +// else +// return null; + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于单个sheet + * + * @param <T> + * @param headers 表格属性列名数组 + * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 + * javabean属性的数据类型有基本数据类型及String,Date,String[],Double[] + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + */ + public static <T> void exportExcel(Map<String,String> headers, Collection<T> dataset, OutputStream out) { + exportExcel(headers, dataset, out, null); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于单个sheet + * + * @param <T> + * @param headers 表格属性列名数组 + * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 + * javabean属性的数据类型有基本数据类型及String,Date,String[],Double[] + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" + */ + public static <T> void exportExcel(Map<String,String> headers, Collection<T> dataset, OutputStream out, + String pattern) { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(); + + write2Sheet(workbook,sheet, headers, dataset, pattern); + try { + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + + public static void exportExcel(String[][] datalist, OutputStream out,boolean autoColumnWidth) { + try { + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + // 生成一个表格 + HSSFSheet sheet = workbook.createSheet(); + + for (int i = 0; i < datalist.length; i++) { + String[] r = datalist[i]; + HSSFRow row = sheet.createRow(i); + for (int j = 0; j < r.length; j++) { + HSSFCell cell = row.createCell(j); + //cell max length 32767 + if (r[j] != null && r[j].length() > 32767) { + r[j] = "--此字段过长(超过32767),已被截断--" + r[j]; + r[j] = r[j].substring(0, 32766); + } + cell.setCellValue(r[j]); + } + } + //自动列宽 + if(autoColumnWidth) { + if (datalist.length > 0) { + int colcount = datalist[0].length; + for (int i = 0; i < colcount; i++) { + sheet.autoSizeColumn(i); + } + } + } + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + public static void exportExcel(String[][] datalist, OutputStream out) { + exportExcel(datalist,out,true); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于多个sheet + * + * @param <T> + * @param sheets {@link ExcelSheet}的集合 + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + */ + public static <T> void exportExcel(List<ExcelSheet<T>> sheets, OutputStream out) { + exportExcel(sheets, out, null); + } + + /** + * 利用JAVA的反射机制,将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上<br> + * 用于多个sheet + * + * @param <T> + * @param sheets {@link ExcelSheet}的集合 + * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 + * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd" + */ + public static <T> void exportExcel(List<ExcelSheet<T>> sheets, OutputStream out, String pattern) { + if (CollectionUtils.isEmpty(sheets)) { + return; + } + // 声明一个工作薄 + HSSFWorkbook workbook = new HSSFWorkbook(); + for (ExcelSheet<T> sheet : sheets) { + // 生成一个表格 + HSSFSheet hssfSheet = workbook.createSheet(sheet.getSheetName()); + write2Sheet(workbook,hssfSheet, sheet.getHeaders(), sheet.getDataset(), pattern); + } + try { + workbook.write(out); + } catch (IOException e) { + LG.error(e.toString(), e); + } + } + + /** + * 每个sheet的写入 + * + * @param sheet 页签 + * @param headers 表头 + * @param dataset 数据集合 + * @param pattern 日期格式 + */ + private static <T> void write2Sheet(HSSFWorkbook workbook,HSSFSheet sheet, Map<String,String> headers, Collection<T> dataset, + String pattern) { + //时间格式默认"yyyy-MM-dd" + if (isBlank(pattern)){ + pattern = "yyyy-MM-dd"; + } + // 产生表格标题行 + HSSFRow row = sheet.createRow(0); + // 标题行转中文 + Set<String> keys = headers.keySet(); + Iterator<String> it1 = keys.iterator(); + String key = ""; //存放临时键变量 + int c= 0; //标题列数 + while (it1.hasNext()){ + key = it1.next(); + if (headers.containsKey(key)) { + HSSFCell cell = row.createCell(c); + cell.setCellStyle(getTopColumnStyle(workbook)); + HSSFRichTextString text = new HSSFRichTextString(headers.get(key)); + cell.setCellValue(text); + c++; + } + } + + // 遍历集合数据,产生数据行 + Iterator<T> it = dataset.iterator(); + int index = 0; + while (it.hasNext()) { + index++; + row = sheet.createRow(index); + T t = it.next(); + try { + if (t instanceof Map) { + @SuppressWarnings("unchecked") + Map<String, Object> map = (Map<String, Object>) t; + int cellNum = 0; + //遍历列名 + Iterator<String> it2 = keys.iterator(); + while (it2.hasNext()){ + key = it2.next(); + if (!headers.containsKey(key)) { + LG.error("Map 中 不存在 key [" + key + "]"); + continue; + } + Object value = map.get(key); + HSSFCell cell = row.createCell(cellNum); + cell.setCellStyle(getColumnStyle(workbook)); + + cellNum = setCellValue(cell,value,pattern,cellNum,null,row); + + cellNum++; + } + } else { + List<FieldForSortting> fields = sortFieldByAnno(t.getClass()); + int cellNum = 0; + for (int i = 0; i < fields.size(); i++) { + HSSFCell cell = row.createCell(cellNum); + cell.setCellStyle(getColumnStyle(workbook)); + Field field = fields.get(i).getField(); + field.setAccessible(true); + Object value = field.get(t); + + cellNum = setCellValue(cell,value,pattern,cellNum,field,row); + + cellNum++; + } + } + } catch (Exception e) { + LG.error(e.toString(), e); + } + } + // 设定自动宽度 + for (int i = 0; i < headers.size(); i++) { + sheet.autoSizeColumn(i); + int cw = (int) (sheet.getColumnWidth(i) * 0.8); + // increase width to accommodate drop-down arrow in the header + sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 20 / 10); + } + } + + private static int setCellValue(HSSFCell cell,Object value,String pattern,int cellNum,Field field,HSSFRow row){ + String textValue = null; + if (value instanceof Integer) { + int intValue = (Integer) value; + cell.setCellValue(intValue); + } else if (value instanceof Float) { + float fValue = (Float) value; + cell.setCellValue(fValue); + } else if (value instanceof Double) { + double dValue = (Double) value; + cell.setCellValue(dValue); + } else if (value instanceof Long) { + long longValue = (Long) value; + cell.setCellValue(longValue); + } else if (value instanceof Boolean) { + boolean bValue = (Boolean) value; + cell.setCellValue(bValue); + } else if (value instanceof Date) { + Date date = (Date) value; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + textValue = sdf.format(date); + } else if (value instanceof String[]) { + String[] strArr = (String[]) value; + for (int j = 0; j < strArr.length; j++) { + String str = strArr[j]; + cell.setCellValue(str); + if (j != strArr.length - 1) { + cellNum++; + cell = row.createCell(cellNum); + } + } + } else if (value instanceof Double[]) { + Double[] douArr = (Double[]) value; + for (int j = 0; j < douArr.length; j++) { + Double val = douArr[j]; + // 值不为空则set Value + if (val != null) { + cell.setCellValue(val); + } + + if (j != douArr.length - 1) { + cellNum++; + cell = row.createCell(cellNum); + } + } + } else { + // 其它数据类型都当作字符串简单处理 + String empty = ""; + if(field != null) { + ExcelCell anno = field.getAnnotation(ExcelCell.class); + if (anno != null) { + empty = anno.defaultValue(); + } + } + textValue = value == null ? empty : value.toString(); + } + if (textValue != null) { + HSSFRichTextString richString = new HSSFRichTextString(textValue); + cell.setCellValue(richString); + } + return cellNum; + } + + + /* + * 设置单元格样式 + */ + private static HSSFCellStyle getColumnStyle(HSSFWorkbook workbook) { + + //设置样式; + HSSFCellStyle style = workbook.createCellStyle(); + //设置自动换行; + style.setWrapText(false); + //设置水平对齐的样式为居中对齐; + style.setAlignment(HorizontalAlignment.CENTER); + //设置垂直对齐的样式为居中对齐; + style.setVerticalAlignment(VerticalAlignment.CENTER); + + return style; + } + + /* + * 设置单元格样式 + */ + private static HSSFCellStyle getTopColumnStyle(HSSFWorkbook workbook) { + + //设置样式; + HSSFCellStyle style = workbook.createCellStyle(); + //设置自动换行; + style.setWrapText(true); + //设置水平对齐的样式为居中对齐; + style.setAlignment(HorizontalAlignment.CENTER); + //设置垂直对齐的样式为居中对齐; + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());// 设置背景色 + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + // 设置字体 + HSSFFont font = workbook.createFont(); + //字体加粗 + font.setBold(true); + font.setFontHeightInPoints((short) 14);//设置字体大小 + font.setColor(IndexedColors.WHITE.index); + style.setFont(font); + return style; + } + + /** + * 把Excel的数据封装成voList + * + * @param clazz vo的Class + * @param inputStream excel输入流 + * @param pattern 如果有时间数据,设定输入格式。默认为"yyy-MM-dd" + * @param logs 错误log集合 + * @param arrayCount 如果vo中有数组类型,那就按照index顺序,把数组应该有几个值写上. + * @return voList + * @throws RuntimeException + */ + public static <T> Collection<T> importExcel(Class<T> clazz, InputStream inputStream, + String pattern, ExcelLogs logs, Integer... arrayCount) { + Workbook workBook; + try { + workBook = WorkbookFactory.create(inputStream); + } catch (Exception e) { + LG.error("load excel file error",e); + return null; + } + List<T> list = new ArrayList<>(); + Sheet sheet = workBook.getSheetAt(0); + Iterator<Row> rowIterator = sheet.rowIterator(); + try { + List<ExcelLog> logList = new ArrayList<>(); + // Map<title,index> + Map<String, Integer> titleMap = new HashMap<>(); + + while (rowIterator.hasNext()) { + Row row = rowIterator.next(); + if (row.getRowNum() == 0) { + if (clazz == Map.class) { + // 解析map用的key,就是excel标题行 + Iterator<Cell> cellIterator = row.cellIterator(); + Integer index = 0; + while (cellIterator.hasNext()) { + String value = cellIterator.next().getStringCellValue(); + titleMap.put(value, index); + index++; + } + } + continue; + } + // 整行都空,就跳过 + boolean allRowIsNull = true; + Iterator<Cell> cellIterator = row.cellIterator(); + while (cellIterator.hasNext()) { + Object cellValue = getCellValue(cellIterator.next()); + if (cellValue != null) { + allRowIsNull = false; + break; + } + } + if (allRowIsNull) { + LG.warn("Excel row " + row.getRowNum() + " all row value is null!"); + continue; + } + StringBuilder log = new StringBuilder(); + if (clazz == Map.class) { + Map<String, Object> map = new HashMap<>(); + for (String k : titleMap.keySet()) { + Integer index = titleMap.get(k); + Cell cell = row.getCell(index); + // 判空 + if (cell == null) { + map.put(k, null); + } else { + cell.setCellType(CellType.STRING); + String value = cell.getStringCellValue(); + map.put(k, value); + } + } + list.add((T) map); + + } else { + T t = clazz.newInstance(); + int arrayIndex = 0;// 标识当前第几个数组了 + int cellIndex = 0;// 标识当前读到这一行的第几个cell了 + List<FieldForSortting> fields = sortFieldByAnno(clazz); + for (FieldForSortting ffs : fields) { + Field field = ffs.getField(); + field.setAccessible(true); + if (field.getType().isArray()) { + Integer count = arrayCount[arrayIndex]; + Object[] value; + if (field.getType().equals(String[].class)) { + value = new String[count]; + } else { + // 目前只支持String[]和Double[] + value = new Double[count]; + } + for (int i = 0; i < count; i++) { + Cell cell = row.getCell(cellIndex); + String errMsg = validateCell(cell, field, cellIndex); + if (isBlank(errMsg)) { + value[i] = getCellValue(cell); + } else { + log.append(errMsg); + log.append(";"); + logs.setHasError(true); + } + cellIndex++; + } + field.set(t, value); + arrayIndex++; + } else { + Cell cell = row.getCell(cellIndex); + String errMsg = validateCell(cell, field, cellIndex); + if (isBlank(errMsg)) { + Object value = null; + // 处理特殊情况,Excel中的String,转换成Bean的Date + if (field.getType().equals(Timestamp.class)) { + Object strDate = getCellValue(cell); + value = DateUtils.string2Timestamp(strDate.toString(),pattern); + }else if (field.getType().equals(Integer.class)) { + Object data = getCellValue(cell); + if(data != null){ + value = Integer.parseInt(String.valueOf(data)); + } + } else { + value = getCellValue(cell); + // 处理特殊情况,excel的value为String,且bean中为其他,且defaultValue不为空,那就=defaultValue + ExcelCell annoCell = field.getAnnotation(ExcelCell.class); + if (value instanceof String && !field.getType().equals(String.class) + && isNotBlank(annoCell.defaultValue())) { + value = annoCell.defaultValue(); + } + } + field.set(t, value); + } + if (isNotBlank(errMsg)) { + log.append(errMsg); + log.append(";"); + logs.setHasError(true); + } + cellIndex++; + } + } + list.add(t); + logList.add(new ExcelLog(t, log.toString(), row.getRowNum() + 1)); + } + } + logs.setLogList(logList); + } catch (InstantiationException e) { + throw new RuntimeException(MessageFormat.format("can not instance class:{0}", + clazz.getSimpleName()), e); + } catch (IllegalAccessException e) { + throw new RuntimeException(MessageFormat.format("can not instance class:{0}", + clazz.getSimpleName()), e); + } + return list; + } + + /** + * 驗證Cell類型是否正確 + * + * @param cell cell單元格 + * @param field 欄位 + * @param cellNum 第幾個欄位,用於errMsg + * @return + */ + private static String validateCell(Cell cell, Field field, int cellNum) { + String columnName = CellReference.convertNumToColString(cellNum); + String result = null; + CellType[] cellTypeArr = validateMap.get(field.getType()); + if (cellTypeArr == null) { + result = MessageFormat.format("Unsupported type [{0}]", field.getType().getSimpleName()); + return result; + } + ExcelCell annoCell = field.getAnnotation(ExcelCell.class); + if (cell == null + || (cell.getCellTypeEnum() == CellType.STRING && isBlank(cell + .getStringCellValue()))) { + if (annoCell != null && annoCell.valid().allowNull() == false) { + result = MessageFormat.format("the cell [{0}] can not null", columnName); + } + ; + } +// else if (cell.getCellTypeEnum() == CellType.BLANK && annoCell.valid().allowNull()) { +// return result; +// } +// else { +// List<CellType> cellTypes = Arrays.asList(cellTypeArr); +// +// // 如果類型不在指定範圍內,並且沒有默認值 +// if (!(cellTypes.contains(cell.getCellTypeEnum())) +// || isNotBlank(annoCell.defaultValue()) +// && cell.getCellTypeEnum() == CellType.STRING) { +// StringBuilder strType = new StringBuilder(); +// for (int i = 0; i < cellTypes.size(); i++) { +// CellType cellType = cellTypes.get(i); +// strType.append(getCellTypeByInt(cellType)); +// if (i != cellTypes.size() - 1) { +// strType.append(","); +// } +// } +// result = +// MessageFormat.format("the cell [{0}] type must [{1}]", columnName, strType.toString()); +// } else { +// // 类型符合验证,但值不在要求范围内的 +// // String in +// if (annoCell.valid().in().length != 0 && cell.getCellTypeEnum() == CellType.STRING) { +// String[] in = annoCell.valid().in(); +// String cellValue = cell.getStringCellValue(); +// boolean isIn = false; +// for (String str : in) { +// if (str.equals(cellValue)) { +// isIn = true; +// } +// } +// if (!isIn) { +// result = MessageFormat.format("the cell [{0}] value must in {1}", columnName, in); +// } +// } +// // 数字型 +// if (cell.getCellTypeEnum() == CellType.NUMERIC) { +// double cellValue = cell.getNumericCellValue(); +// // 小于 +// if (!Double.isNaN(annoCell.valid().lt())) { +// if (!(cellValue < annoCell.valid().lt())) { +// result = +// MessageFormat.format("the cell [{0}] value must less than [{1}]", columnName, +// annoCell.valid().lt()); +// } +// } +// // 大于 +// if (!Double.isNaN(annoCell.valid().gt())) { +// if (!(cellValue > annoCell.valid().gt())) { +// result = +// MessageFormat.format("the cell [{0}] value must greater than [{1}]", columnName, +// annoCell.valid().gt()); +// } +// } +// // 小于等于 +// if (!Double.isNaN(annoCell.valid().le())) { +// if (!(cellValue <= annoCell.valid().le())) { +// result = +// MessageFormat.format("the cell [{0}] value must less than or equal [{1}]", +// columnName, annoCell.valid().le()); +// } +// } +// // 大于等于 +// if (!Double.isNaN(annoCell.valid().ge())) { +// if (!(cellValue >= annoCell.valid().ge())) { +// result = +// MessageFormat.format("the cell [{0}] value must greater than or equal [{1}]", +// columnName, annoCell.valid().ge()); +// } +// } +// } +// } +// } + return result; + } + + /** + * 根据annotation的seq排序后的栏位 + * + * @param clazz + * @return + */ + private static List<FieldForSortting> sortFieldByAnno(Class<?> clazz) { + Field[] fieldsArr = clazz.getDeclaredFields(); + List<FieldForSortting> fields = new ArrayList<>(); + List<FieldForSortting> annoNullFields = new ArrayList<>(); + for (Field field : fieldsArr) { + ExcelCell ec = field.getAnnotation(ExcelCell.class); + if (ec == null) { + // 没有ExcelCell Annotation 视为不汇入 + continue; + } + int id = ec.index(); + fields.add(new FieldForSortting(field, id)); + } + fields.addAll(annoNullFields); + sortByProperties(fields, true, false, "index"); + return fields; + } + + private static void sortByProperties(List<? extends Object> list, boolean isNullHigh, + boolean isReversed, String... props) { + if (CollectionUtils.isNotEmpty(list)) { + Comparator<?> typeComp = ComparableComparator.getInstance(); + if (isNullHigh == true) { + typeComp = ComparatorUtils.nullHighComparator(typeComp); + } else { + typeComp = ComparatorUtils.nullLowComparator(typeComp); + } + if (isReversed) { + typeComp = ComparatorUtils.reversedComparator(typeComp); + } + + List<Object> sortCols = new ArrayList<Object>(); + + if (props != null) { + for (String prop : props) { + sortCols.add(new BeanComparator(prop, typeComp)); + } + } + if (sortCols.size() > 0) { + Comparator<Object> sortChain = new ComparatorChain(sortCols); + Collections.sort(list, sortChain); + } + } + } + + private static boolean isBlank(String str){ + if(str == null){ + return true; + } + return str.length() == 0; + } + + protected static boolean isNotBlank(String str){ + return !isBlank(str); + } + +} diff --git a/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/FieldForSortting.java b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/FieldForSortting.java new file mode 100644 index 0000000..6ca14b0 --- /dev/null +++ b/goal-manage/goal-manage-service/src/main/java/com/gkhy/safePlatform/targetDuty/utils/poihelper/FieldForSortting.java @@ -0,0 +1,61 @@ +package com.gkhy.safePlatform.targetDuty.utils.poihelper; + +import java.lang.reflect.Field; + +/** + * The <code>FieldForSortting</code> + * + */ +public class FieldForSortting { + private Field field; + private int index; + + /** + * @param field + */ + public FieldForSortting(Field field) { + super(); + this.field = field; + } + + /** + * @param field + * @param index + */ + public FieldForSortting(Field field, int index) { + super(); + this.field = field; + this.index = index; + } + + /** + * @return the field + */ + public Field getField() { + return field; + } + + /** + * @param field + * the field to set + */ + public void setField(Field field) { + this.field = field; + } + + /** + * @return the index + */ + public int getIndex() { + return index; + } + + /** + * @param index + * the index to set + */ + public void setIndex(int index) { + this.index = index; + } + +} diff --git a/tmlog.lck b/tmlog.lck new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tmlog.lck -- Gitblit v1.9.2