冀北数据周报
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package com.njcn.device.pq.pojo.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author wr
|
||||
* @description
|
||||
* @date 2026/2/2 15:16
|
||||
*/
|
||||
@Data
|
||||
public class LineInfoMonitorIdVO {
|
||||
|
||||
@ApiModelProperty(name = "lineId",value = "监测点id")
|
||||
private String lineId;
|
||||
|
||||
@ApiModelProperty(name = "gdName",value = "供电公司名称")
|
||||
private String gdName;
|
||||
|
||||
@ApiModelProperty(name = "lineName",value = "监测点名称")
|
||||
private String lineName;
|
||||
|
||||
@ApiModelProperty(name = "loadType",value = "干扰源类型")
|
||||
private String loadType;
|
||||
|
||||
@ApiModelProperty(name = "objName",value = "对象名称")
|
||||
private String objName;
|
||||
|
||||
@ApiModelProperty(name = "subName",value = "变电站名称")
|
||||
private String subName;
|
||||
|
||||
@ApiModelProperty(name = "powerSubstationName", value = "电网侧变电站")
|
||||
private String powerSubstationName;
|
||||
|
||||
@ApiModelProperty(name = "deviceId",value = "装置Id")
|
||||
private String deviceId;
|
||||
|
||||
@ApiModelProperty(name = "deviceName",value = "装置名称")
|
||||
private String deviceName;
|
||||
|
||||
@ApiModelProperty(name = "ip",value = "装置ip")
|
||||
private String ip;
|
||||
|
||||
@ApiModelProperty(name = "manufacturer",value = "供应商名称")
|
||||
private String manufacturer;
|
||||
|
||||
@ApiModelProperty(name = "monitorId",value = "国网ID")
|
||||
private String monitorId;
|
||||
|
||||
@ApiModelProperty(name = "powerFlag",value = "电网标志(0-电网侧;1-非电网侧)")
|
||||
private Integer powerFlag;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.njcn.device.pq.pojo.vo.dataClean;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @version 1.0.0
|
||||
* @author: chenchao
|
||||
* @date: 2022/07/18 11:04
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@EqualsAndHashCode
|
||||
public class CityDataExcel implements Serializable {
|
||||
|
||||
|
||||
@ExcelProperty(value = "单位")
|
||||
private String deptName;
|
||||
|
||||
@ExcelProperty(value = "监测终端数量")
|
||||
private BigDecimal deviceNum;
|
||||
|
||||
@ExcelProperty(value = "监测点个数")
|
||||
private BigDecimal lineNum;
|
||||
|
||||
@ExcelProperty(value = "在线率(%)")
|
||||
private BigDecimal onlineRate;
|
||||
|
||||
@ExcelProperty(value = "完整率(%)")
|
||||
private BigDecimal integrity;
|
||||
|
||||
@ExcelProperty(value = "问题监测点")
|
||||
private BigDecimal abnormalNum;
|
||||
|
||||
@ExcelProperty(value = "问题监测点")
|
||||
private List<String> abnormalList;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.njcn.device.pq.pojo.vo.dataClean;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* @version 1.0.0
|
||||
* @author: chenchao
|
||||
* @date: 2022/07/18 11:04
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@EqualsAndHashCode
|
||||
public class LineDataExcel implements Serializable {
|
||||
|
||||
@ExcelProperty(value = "序号")
|
||||
private BigDecimal lineNum;
|
||||
|
||||
@ExcelProperty(value = "监测点名称")
|
||||
private String lineName;
|
||||
|
||||
@ExcelProperty(value = "所属部门")
|
||||
private String deptName;
|
||||
|
||||
@ExcelProperty(value = "接入电网侧变电站名")
|
||||
private String powerSubstationName;
|
||||
|
||||
@ExcelProperty(value = "监测点对象名称")
|
||||
private String objName;
|
||||
|
||||
@ExcelProperty(value = "装置编号")
|
||||
private String deviceName;
|
||||
|
||||
@ExcelProperty(value = "IP地址")
|
||||
private String ip;
|
||||
|
||||
@ExcelProperty(value = "终端厂家")
|
||||
private String manufacturer;
|
||||
|
||||
@ExcelProperty(value = "在线率")
|
||||
private BigDecimal onlineRate;
|
||||
|
||||
@ExcelProperty(value = "数据完整性")
|
||||
private BigDecimal integrity;
|
||||
|
||||
@ExcelProperty(value = "国网ID")
|
||||
private BigDecimal monitorId;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package com.njcn.device.pq.utils;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjUtil;
|
||||
import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
|
||||
import com.njcn.device.pq.pojo.vo.dataClean.CityDataExcel;
|
||||
import com.njcn.device.pq.pojo.vo.dataClean.LineDataExcel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author wr
|
||||
* @description
|
||||
* @date 2026/2/2 10:13
|
||||
*/
|
||||
public class DataLineExcelUtil {
|
||||
|
||||
/**
|
||||
* 创建监测点信息表头
|
||||
* @param FlyMonitorId
|
||||
* @return
|
||||
*/
|
||||
public static List<List<String>> lineHeader(Boolean FlyMonitorId) {
|
||||
List<List<String>> header = new ArrayList<>();
|
||||
header.add(Collections.singletonList("序号"));
|
||||
header.add(Collections.singletonList("监测点名称"));
|
||||
header.add(Collections.singletonList("所属部门"));
|
||||
header.add(Collections.singletonList("接入电网侧变电站名"));
|
||||
header.add(Collections.singletonList("监测点对象名称"));
|
||||
header.add(Collections.singletonList("装置编号"));
|
||||
header.add(Collections.singletonList("IP地址"));
|
||||
header.add(Collections.singletonList("终端厂家"));
|
||||
header.add(Collections.singletonList("在线率"));
|
||||
header.add(Collections.singletonList("数据完整性"));
|
||||
if(FlyMonitorId){
|
||||
header.add(Collections.singletonList("国网ID"));
|
||||
}
|
||||
return header;
|
||||
}
|
||||
|
||||
/**
|
||||
* 监测点信息表头数据写入
|
||||
* @param data
|
||||
* @return
|
||||
*/
|
||||
public static List<List<Object>> lineBody(List<LineDataExcel> data) {
|
||||
List<List<Object>> result = new ArrayList<>();
|
||||
if(CollUtil.isNotEmpty(data)){
|
||||
for (LineDataExcel datum : data) {
|
||||
ArrayList<Object> row = Lists.newArrayList(datum.getLineNum(),
|
||||
datum.getLineName(),
|
||||
datum.getDeptName(),
|
||||
datum.getPowerSubstationName(),
|
||||
datum.getObjName(),
|
||||
datum.getDeviceName(),
|
||||
datum.getIp(),
|
||||
datum.getManufacturer(),
|
||||
datum.getOnlineRate(),
|
||||
datum.getIntegrity());
|
||||
if(ObjUtil.isNotNull(datum.getMonitorId())){
|
||||
row.add(datum.getMonitorId());
|
||||
}
|
||||
result.add(row);
|
||||
}
|
||||
}
|
||||
// 插入一个空行
|
||||
result.add(Collections.emptyList());
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建地市信息表头
|
||||
* @return
|
||||
*/
|
||||
public static List<List<String>> cityHeader() {
|
||||
List<List<String>> header = new ArrayList<>();
|
||||
header.add(Collections.singletonList("单位"));
|
||||
header.add(Collections.singletonList("监测终端数量"));
|
||||
header.add(Collections.singletonList("监测点个数"));
|
||||
header.add(Collections.singletonList("在线率(%)"));
|
||||
header.add(Collections.singletonList("完整率(%)"));
|
||||
header.add(Collections.singletonList("问题监测点"));
|
||||
return header;
|
||||
}
|
||||
|
||||
public static List<List<Object>> cityBody(List<CityDataExcel> data) {
|
||||
List<List<Object>> result = new ArrayList<>();
|
||||
if(CollUtil.isNotEmpty(data)){
|
||||
for (CityDataExcel datum : data) {
|
||||
ArrayList<Object> row = Lists.newArrayList(datum.getDeptName(),
|
||||
datum.getDeviceNum(),
|
||||
datum.getLineNum(),
|
||||
datum.getOnlineRate(),
|
||||
datum.getIntegrity(),
|
||||
datum.getAbnormalNum());
|
||||
result.add(row);
|
||||
}
|
||||
}
|
||||
// 插入一个空行
|
||||
result.add(Collections.emptyList());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -4,12 +4,17 @@ import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.write.handler.SheetWriteHandler;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
|
||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
||||
import com.alibaba.excel.write.metadata.style.WriteFont;
|
||||
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
||||
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
|
||||
import com.njcn.device.pq.pojo.vo.dataClean.DataVerifyExcel;
|
||||
import org.apache.poi.ss.usermodel.BorderStyle;
|
||||
import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.VerticalAlignment;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.*;
|
||||
|
||||
@@ -57,23 +62,13 @@ public class FixedDynamicExcelExport {
|
||||
}
|
||||
}
|
||||
|
||||
public static void exportExcelByDataSize(List<DataVerifyExcel> dataList, OutputStream outputStream) {
|
||||
// 步骤1:统计每个字段的有效数据量
|
||||
public static Map<String, List> exportExcelByDataSize(List<DataVerifyExcel> dataList) {
|
||||
Map<String, List> map = new HashMap<>(2);
|
||||
Map<String, Integer> fieldCount = countValidData(dataList);
|
||||
// 步骤2:按数据量降序排序字段名
|
||||
List<String> sortedFields = sortFields(fieldCount);
|
||||
// 步骤3:构建正确的动态表头
|
||||
List<List<String>> head = buildCorrectHead(sortedFields);
|
||||
// 步骤4:构建对应顺序的行数据
|
||||
List<List<Object>> data = buildRowData(dataList, sortedFields);
|
||||
|
||||
// 步骤5:导出Excel(含列宽设置)
|
||||
EasyExcel.write(outputStream)
|
||||
.head(head)
|
||||
.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20))
|
||||
.registerWriteHandler(new FreezeHeaderHandler()) // 用修复后的表头
|
||||
.sheet("数据统计")
|
||||
.doWrite(data);
|
||||
map.put("head", buildCorrectHead(sortedFields));
|
||||
map.put("data", buildRowData(dataList, sortedFields));
|
||||
return map;
|
||||
}
|
||||
|
||||
public static class FreezeHeaderHandler implements SheetWriteHandler {
|
||||
@@ -91,6 +86,40 @@ public class FixedDynamicExcelExport {
|
||||
}
|
||||
}
|
||||
|
||||
public static HorizontalCellStyleStrategy writeCenterStyle() {
|
||||
// 内容的策略
|
||||
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
||||
//设置 自动换行
|
||||
contentWriteCellStyle.setWrapped(true);
|
||||
//设置 垂直居中
|
||||
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
//设置 水平居中
|
||||
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
||||
//设置边框样式
|
||||
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
|
||||
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
|
||||
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
|
||||
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
|
||||
|
||||
WriteFont bodyWriteFont = new WriteFont();
|
||||
bodyWriteFont.setFontHeightInPoints((short) 11);
|
||||
bodyWriteFont.setBold(false);
|
||||
bodyWriteFont.setFontName("宋体");
|
||||
contentWriteCellStyle.setWriteFont(bodyWriteFont);
|
||||
|
||||
// 头部
|
||||
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
||||
// 设置字体居中
|
||||
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
||||
WriteFont headWriteFont = new WriteFont();
|
||||
// 设置字体大小为20
|
||||
headWriteFont.setFontHeightInPoints((short) 11);
|
||||
headWriteFont.setBold(false);
|
||||
headWriteFont.setFontName("宋体");
|
||||
headWriteCellStyle.setWriteFont(headWriteFont);
|
||||
|
||||
return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
||||
}
|
||||
// ★ 修复点1:构建正确的表头(每个列名独立成List)
|
||||
private static List<List<String>> buildCorrectHead(List<String> allFields) {
|
||||
List<List<String>> head = new ArrayList<>();
|
||||
|
||||
Reference in New Issue
Block a user