新增装置统计
parent
4a586fc9de
commit
05c1f4e40b
@ -0,0 +1,25 @@
|
||||
package com.shxy.xymanager_common.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
public class TerminalsAndPositionDto implements Serializable {
|
||||
private Integer id;
|
||||
|
||||
private Integer towerId;
|
||||
|
||||
private String cmdId;
|
||||
|
||||
private Double latitude;
|
||||
|
||||
private Double longitude;
|
||||
|
||||
private Integer radius;
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package com.shxy.xymanager_common.excelbean;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.alibaba.excel.annotation.write.style.ColumnWidth;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigInteger;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 设备信息列表
|
||||
*/
|
||||
@Data
|
||||
@ApiModel(value = "设备列表excel", description = "设备列表excel")
|
||||
public class TerminalListExcelModel implements Serializable {
|
||||
|
||||
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("线路名称")
|
||||
@ApiModelProperty(value = "线路名称", example = "123456")
|
||||
private String lineName;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("杆塔名称")
|
||||
@ApiModelProperty(value = "杆塔名称", example = "123456")
|
||||
private String towerName;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("设备编号")
|
||||
@ApiModelProperty(value = "设备编号", example = "123456")
|
||||
private String cmdId;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("纬度")
|
||||
@ApiModelProperty(value = "纬度", example = "21321")
|
||||
private Double latitude;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("经度")
|
||||
@ApiModelProperty(value = "经度", example = "213")
|
||||
private Double longitude;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("半径")
|
||||
@ApiModelProperty(value = "经度", example = "123456")
|
||||
private Integer radius;
|
||||
|
||||
}
|
@ -0,0 +1,220 @@
|
||||
package com.shxy.xymanager_common.util;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
|
||||
import com.alibaba.excel.write.handler.RowWriteHandler;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
||||
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class EasyExcelUtil implements RowWriteHandler {
|
||||
|
||||
private int mergeRowIndex;//从哪一行开始合并
|
||||
private int[] mergeColumnIndex;//excel合并的列
|
||||
private int[] signNum;//合并的唯一标识
|
||||
private int total;//总行数
|
||||
private int lastRow;
|
||||
private int firstCol;
|
||||
private int lastCol;
|
||||
private int firstRow;
|
||||
private int mergeCount = 1;
|
||||
|
||||
private EasyExcelUtil(){}
|
||||
|
||||
private EasyExcelUtil(int mergeRowIndex, int[] mergeColumnIndex, int[] signNum, int total) {
|
||||
this.mergeRowIndex = mergeRowIndex;
|
||||
this.mergeColumnIndex = mergeColumnIndex;
|
||||
this.signNum = signNum;
|
||||
this.total = total;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出excel
|
||||
* @param response
|
||||
* @param fileName 文件名称
|
||||
* @param exportList 导出数据
|
||||
* @param clazz 导出实体bean class对象
|
||||
* @param <T>
|
||||
* @throws IOException
|
||||
*/
|
||||
public static <T> void createExcel(HttpServletResponse response, String fileName, List<T> exportList,
|
||||
Class<T> clazz)
|
||||
throws IOException {
|
||||
createExcel(response,fileName,exportList,clazz,null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出excel
|
||||
* @param response
|
||||
* @param fileName 文件名称
|
||||
* @param exportList 导出数据
|
||||
* @param clazz 导出实体bean class对象
|
||||
* @param cellMerge 单元格合并规则
|
||||
* @param <T>
|
||||
* @throws IOException
|
||||
*/
|
||||
public static <T> void createExcel(HttpServletResponse response, String fileName, List<T> exportList,
|
||||
Class<T> clazz, CellMerge cellMerge)
|
||||
throws IOException {
|
||||
// 设置下载信息
|
||||
response.setContentType("application/vnd.ms-excel");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
|
||||
|
||||
//定义ExcelWriterSheetBuilder
|
||||
ExcelWriterSheetBuilder excelWriterSheetBuilder = EasyExcel
|
||||
.write(response.getOutputStream(), clazz)
|
||||
.sheet(fileName);
|
||||
|
||||
//合并单元格
|
||||
if (cellMerge != null) {
|
||||
// 从那一行开始合并
|
||||
int mergeRowIndex = 1;
|
||||
EasyExcelUtil
|
||||
excelMergeRowByRowStrategy = new EasyExcelUtil(mergeRowIndex, cellMerge.getMergeColumIndex(),
|
||||
cellMerge.getMergeRuleColumIndex(), exportList.size());
|
||||
excelWriterSheetBuilder.registerWriteHandler(excelMergeRowByRowStrategy);
|
||||
}
|
||||
|
||||
//设置头样式
|
||||
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
||||
//设置内容格式
|
||||
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
||||
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
|
||||
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
||||
//设计内容居中
|
||||
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
||||
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
||||
//设置内容自动换行
|
||||
contentWriteCellStyle.setWrapped(true);
|
||||
excelWriterSheetBuilder.registerWriteHandler(horizontalCellStyleStrategy);
|
||||
|
||||
//调用doWrite方法
|
||||
excelWriterSheetBuilder.doWrite(exportList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean aBoolean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
|
||||
Integer relativeRowIndex, Boolean isHead) {
|
||||
//当前行
|
||||
int curRowIndex = row.getRowNum();
|
||||
//每一行的最大列数
|
||||
short lastCellNum = row.getLastCellNum();
|
||||
|
||||
if (curRowIndex == 1) {
|
||||
//赋初值 第一行
|
||||
firstRow = curRowIndex;
|
||||
}
|
||||
//开始合并位置
|
||||
if (curRowIndex > mergeRowIndex && !row.getCell(0).getStringCellValue().equals("")) {
|
||||
for (int i = 0; i < lastCellNum; i++) {
|
||||
if (i == mergeColumnIndex[i]) {
|
||||
//当前行号 当前行对象 合并的标识位
|
||||
mergeWithPrevAnyRow(writeSheetHolder.getSheet(), curRowIndex, row, signNum);
|
||||
break;//已经进入到合并单元格操作里面了,执行一次就行
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void mergeWithPrevAnyRow(Sheet sheet, int curRowIndex, Row row, int[] signNum) {
|
||||
Row preRow = row.getSheet().getRow(curRowIndex - 1);
|
||||
List<String> rowDataList = new ArrayList<>();
|
||||
List<String> preDataList = new ArrayList<>();
|
||||
|
||||
for (int i : signNum) {
|
||||
Object currentData =
|
||||
row.getCell(i).getCellTypeEnum() == CellType.STRING ? row.getCell(i).getStringCellValue() :
|
||||
row.getCell(i).getNumericCellValue();
|
||||
Object preData =
|
||||
preRow.getCell(i).getCellTypeEnum() == CellType.STRING ? preRow.getCell(i).getStringCellValue() :
|
||||
preRow.getCell(i).getNumericCellValue();
|
||||
rowDataList.add(String.valueOf(currentData));
|
||||
preDataList.add(String.valueOf(preData));
|
||||
}
|
||||
|
||||
String rowDataStr = String.join(",", rowDataList);
|
||||
String preDataStr = String.join(",", preDataList);
|
||||
|
||||
//判断是否合并单元格
|
||||
boolean curEqualsPre = rowDataStr.equals(preDataStr);
|
||||
//判断前一个和后一个相同 并且 标识位相同
|
||||
if (curEqualsPre) {
|
||||
lastRow = curRowIndex;
|
||||
mergeCount++;
|
||||
}
|
||||
//excel过程中合并
|
||||
if (!curEqualsPre && mergeCount > 1) {
|
||||
mergeSheet(firstRow, lastRow, mergeColumnIndex, sheet);
|
||||
mergeCount = 1;
|
||||
}
|
||||
|
||||
//excel结尾处合并
|
||||
if (mergeCount > 1 && total == curRowIndex) {
|
||||
mergeSheet(firstRow, lastRow, mergeColumnIndex, sheet);
|
||||
mergeCount = 1;
|
||||
}
|
||||
|
||||
if (!curEqualsPre) {
|
||||
firstRow = curRowIndex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void mergeSheet(int firstRow, int lastRow, int[] mergeColumnIndex, Sheet sheet) {
|
||||
for (int colNum : mergeColumnIndex) {
|
||||
firstCol = colNum;
|
||||
lastCol = colNum;
|
||||
CellRangeAddress cellRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
|
||||
sheet.addMergedRegion(cellRangeAddress);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 单元格合并类
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class CellMerge {
|
||||
private int[] mergeColumIndex;
|
||||
private int[] mergeRuleColumIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置单元格合并规则
|
||||
* @param mergeColumIndex
|
||||
* @param mergeRuleColumIndex
|
||||
* @return
|
||||
*/
|
||||
public static CellMerge setCellMerge(int[] mergeColumIndex,int[] mergeRuleColumIndex){
|
||||
EasyExcelUtil excelUtil = new EasyExcelUtil();
|
||||
CellMerge cellMerge = excelUtil.new CellMerge();
|
||||
cellMerge.setMergeColumIndex(mergeColumIndex);
|
||||
cellMerge.setMergeRuleColumIndex(mergeRuleColumIndex);
|
||||
return cellMerge;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue