1.依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency> <!--excel工具 --> <dependency> <groupId>cn.idev.excel</groupId> <artifactId>fastexcel</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency>
2.实体类 以 @ExcelProperty({“每日质量报警统计信息”,”站别”})为例
“每日质量报警统计信息”代表标题;”站别”代表表头
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.write.style.ColumnWidth; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @Data @ColumnWidth(26) // 默认列宽 @EqualsAndHashCode @AllArgsConstructor @NoArgsConstructor public class QualityAlarmExcelDTO { @ExcelProperty({"每日质量报警统计信息","站别"}) private String deviceName ; @ExcelProperty({"每日质量报警统计信息","抽样总数"}) private String all ; @ExcelProperty({"每日质量报警统计信息","超时未测量"}) private String timeOut ; @ExcelProperty({"每日质量报警统计信息","占比"}) private String timeOutRatio ; @ExcelProperty({"每日质量报警统计信息","数据超差"}) private String dataOut; @ExcelProperty({"每日质量报警统计信息","占比"}) private String dataOutRatio; @ExcelProperty({"每日质量报警统计信息","总异常比例"}) private String allRatio; }
3.方法 此处使用的是若以框架,定时任务为每日凌晨发送(0 0 0 * * ?)
alarmInfoService获取前一天的数据信息
deviceWorkStationService查询设备
两者之间通过id关联
qualitySummaryExcelDay()方法中 qualitySummaryExcelDay()方法为固定格式
其中 String fileName = “C:/export/工作站检测质量报警_”+ DateUtil.formatDate(DateUtil.yesterday()) + “.xlsx”;是文件路径以及文件名设置
FastExcel.write(fileName, QualityAlarmExcelDTO.class) .registerWriteHandler(horizontalCellStyleStrategy) .sheet(“质量报警”).doWrite(qualityInfo);
文件名,引用实体类,表格样式,工作表(见下图),具体的数据
getQualityInfo()方法中 用hash存入两种报警信息的id,以及报警次数
检索前一天的报警信息根据具体的sql来调整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 package com.caya.quartz.task; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.idev.excel.FastExcel; import cn.idev.excel.write.metadata.style.WriteCellStyle; import cn.idev.excel.write.style.HorizontalCellStyleStrategy; import com.caya.manager.domain.DeviceWorkStation; import com.caya.manager.domain.VO.AlarmInfoVO; import com.caya.manager.domain.dto.QualityAlarmExcelDTO; import com.caya.manager.service.IAlarmInfoService; import com.caya.manager.service.IDeviceWorkStationService; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; import java.util.*; @Component("qualityAlarmExcelTask") public class QualityAlarmExcelTask { @Autowired private IAlarmInfoService alarmInfoService; @Autowired private IDeviceWorkStationService deviceWorkStationService; private static final int ALARM_TYPE_TIMEOUT = 147; private static final int ALARM_TYPE_DATA_OUT = 148; public void qualitySummaryExcelDay(){ List<QualityAlarmExcelDTO> qualityInfo = getQualityInfo(); String fileName = "C:/export/工作站检测质量报警_"+ DateUtil.formatDate(DateUtil.yesterday()) + ".xlsx"; File file = new File(fileName); if (!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } WriteCellStyle headWriteCellStyle = new WriteCellStyle(); //设置头居中 headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置内容 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); //设置 水平居中 contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //内容策略 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); FastExcel.write(fileName, QualityAlarmExcelDTO.class) .registerWriteHandler(horizontalCellStyleStrategy) .sheet("质量报警").doWrite(qualityInfo); } public List<QualityAlarmExcelDTO> getQualityInfo(){ //查询所有类型的工作站 List<DeviceWorkStation> deviceWorkStations = deviceWorkStationService.selectDeviceWorkStationList(new DeviceWorkStation()); //超时未测量统计 HashMap<Long,Float> timeOutNum=new HashMap<>(); for (DeviceWorkStation deviceWorkStation:deviceWorkStations ) { timeOutNum.put(deviceWorkStation.getId(), (float) 0); } //数据超差统计 HashMap<Long,Float> dataOutNum=new HashMap<>(); for (DeviceWorkStation deviceWorkStation:deviceWorkStations ) { dataOutNum.put(deviceWorkStation.getId(), (float) 0); } //检索前一天的报警信息 DateTime yesterday = DateUtil.yesterday(); String beginOfDay = DateUtil.beginOfDay(yesterday).toString("yyyy-MM-dd HH:mm:ss"); String endOfDay = DateUtil.endOfDay(yesterday).toString("yyyy-MM-dd HH:mm:ss"); AlarmInfoVO alarmInfoVO = new AlarmInfoVO(); Map<String,Object> params=new HashMap<>(); params.put("beginTime",beginOfDay); params.put("endTime",endOfDay); alarmInfoVO.setParams(params); List<AlarmInfoVO> alarmInfoVOS = alarmInfoService.selectAlarmInfoList(alarmInfoVO); //查询报警类型 // Object redisData = redisCache.getCacheObject("sys_dict:alarm_type_info"); // List<SysDictData> cacheList = JSON.parseArray(redisData.toString(), SysDictData.class); // for (SysDictData sysDictData:cacheList) { // //查询编号 // sysDictData.getDictCode(); //此处编号147:超时未测量; 148:数据超差 // } String deviceName=""; String all=""; String timeOut=""; String timeOutRatio=""; String dataOut=""; String dataOutRatio=""; String allRatio=""; //超时未测量总数 float timeOutAll=0; //数据采集异常报警数 float dataOutAll=0; List<QualityAlarmExcelDTO> qualityAlarmExcel=new ArrayList<>(); //遍历报警 for (AlarmInfoVO alarm:alarmInfoVOS) { //查询报警类型为147的报警 if (alarm.getTypeSysDictDataId()==ALARM_TYPE_TIMEOUT){ //匹配报警的id for (Long deviceId :timeOutNum.keySet()) { //id相同,报警类型相同,对应的报警数量+1 if (Objects.equals(deviceId, alarm.getDeviceWorkStationId())){ float timeOutAlarm = timeOutNum.get(deviceId); timeOutNum.put(deviceId,timeOutAlarm+1); } } //超时未测量+1 timeOutAll++; } //查询报警类型为148的报警 if (alarm.getTypeSysDictDataId()==ALARM_TYPE_DATA_OUT){ //匹配报警的id for (Long deviceId :dataOutNum.keySet()) { //id相同,报警类型相同,对应的报警数量+1 if (Objects.equals(deviceId, alarm.getDeviceWorkStationId())){ float dataOutAlarm = dataOutNum.get(deviceId); dataOutNum.put(deviceId,dataOutAlarm+1); } } //超时未测量+1 dataOutAll++; } } for (DeviceWorkStation deviceWorkStation: deviceWorkStations) { deviceName=deviceWorkStation.getName(); Float aFloat = timeOutNum.get(deviceWorkStation.getId()); Float bFloat = dataOutNum.get(deviceWorkStation.getId()); all= String.valueOf(aFloat.intValue() + bFloat.intValue()); timeOut= String.valueOf(aFloat.intValue()); timeOutRatio = timeOutAll == 0 ? "0%" : (aFloat / timeOutAll * 100) + "%"; dataOut=String.valueOf(bFloat.intValue()); dataOutRatio = dataOutAll == 0 ? "0%" : (bFloat / dataOutAll * 100) + "%"; allRatio = (timeOutAll + dataOutAll) == 0 ? "0%" : ((aFloat + bFloat) / (timeOutAll + dataOutAll) * 100) + "%"; QualityAlarmExcelDTO qualityAlarmExcelDTO=new QualityAlarmExcelDTO(deviceName,all,timeOut,timeOutRatio,dataOut,dataOutRatio,allRatio); qualityAlarmExcel.add(qualityAlarmExcelDTO); } return qualityAlarmExcel; } }
4.效果图