From f308722ace4dbf39f0d5e175d920b877370c02f2 Mon Sep 17 00:00:00 2001 From: songguoqiang <765017469@qq.com> Date: Tue, 14 May 2024 11:17:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A9=E5=90=88=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/CustomCellWriteHandler.java | 88 +++++++++++++++++++ .../framework/excel/core/util/ExcelUtils.java | 28 +++++- .../eam/controller/item/vo/ItemImportVO.java | 3 + .../vo/ItemAccountsImportExcelVO.java | 4 + .../location/vo/LocationExcelVO.java | 3 + .../location/vo/LocationImportVO.java | 1 + .../locationarea/vo/LocationAreaImportVO.java | 2 + 7 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomCellWriteHandler.java diff --git a/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomCellWriteHandler.java b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomCellWriteHandler.java new file mode 100644 index 0000000..41da0c6 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/handler/CustomCellWriteHandler.java @@ -0,0 +1,88 @@ +package com.win.framework.excel.core.handler; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +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.metadata.style.WriteFont; +import com.win.framework.excel.core.annotations.Colour; +import com.win.framework.excel.core.annotations.ExcelValid; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFRichTextString; + +import java.lang.reflect.Field; +import java.util.List; + +@Slf4j +public class CustomCellWriteHandler implements CellWriteHandler { + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + if(isHead){ + WriteCellData writeCellData = cellDataList.get(0); + WriteCellStyle headWriteCellStyle = writeCellData.getOrCreateStyle(); + // 头的策略 样式调整 + Field field = head.getField(); + if (field.isAnnotationPresent(Colour.class)) { + // 如果是头部 主表数据 + headWriteCellStyle.setFillForegroundColor(field.getAnnotation(Colour.class).value().getIndex()); + }else { + //头背景 浅绿 子表数据 + headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex()); + } + WriteFont headWriteFont = new WriteFont(); + // 头字号 + headWriteFont.setFontHeightInPoints((short) 14); + // 字体样式 + headWriteFont.setFontName("宋体"); + headWriteCellStyle.setWriteFont(headWriteFont); + // 自动换行 + headWriteCellStyle.setWrapped(true); + // 设置细边框 + headWriteCellStyle.setBorderBottom(BorderStyle.THIN); + headWriteCellStyle.setBorderLeft(BorderStyle.THIN); + headWriteCellStyle.setBorderRight(BorderStyle.THIN); + headWriteCellStyle.setBorderTop(BorderStyle.THIN); + + // 设置必填项备注消息 + if(field.isAnnotationPresent(ExcelValid.class)){ + Sheet sheet = writeSheetHolder.getSheet(); + // 备注 + Drawing drawingPatriarch = sheet.createDrawingPatriarch(); + Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) cell.getColumnIndex()+1, 1)); + comment.setString(new XSSFRichTextString(field.getAnnotation(ExcelValid.class).message())); + // 将批注添加到单元格对象中 + sheet.getRow(cell.getRowIndex()).getCell(cell.getColumnIndex()).setCellComment(comment); + } + // 设置边框颜色 25灰度 + headWriteCellStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headWriteCellStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex()); + // 水平对齐方式 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 垂直对齐方式 + headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + }else { + for(int i=1;i 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ +// public static void write(HttpServletResponse response, String filename, String sheetName, Class head, List data, Map mapDropDown) throws IOException { +// // 输出 Excel +// EasyExcel.write(response.getOutputStream(), head) +// .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 +// .registerWriteHandler(new CustomSheetWriteHandler(mapDropDown)) +// .registerWriteHandler(getStyleStrategy()) // 设置excel样式 +// .sheet(sheetName).doWrite(data); +// // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 +// response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); +// } + /** * 将列表以 Excel 响应给前端 * @@ -73,7 +98,8 @@ public class ExcelUtils { EasyExcel.write(response.getOutputStream(), head) .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 .registerWriteHandler(new CustomSheetWriteHandler(mapDropDown)) - .registerWriteHandler(getStyleStrategy()) // 设置excel样式 + // .registerWriteHandler(getStyleStrategy()) // 设置excel样式 + .registerWriteHandler(new CustomCellWriteHandler()) .sheet(sheetName).doWrite(data); // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemImportVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemImportVO.java index 45efd01..929caf2 100644 --- a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemImportVO.java +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemImportVO.java @@ -1,6 +1,7 @@ package com.win.module.eam.controller.item.vo; import com.alibaba.excel.annotation.ExcelProperty; +import com.win.framework.excel.core.annotations.ExcelValid; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -21,6 +22,7 @@ import java.math.BigDecimal; public class ItemImportVO { @ExcelProperty("零件编码") + @ExcelValid(message = "零件编码必填") private String number; @ExcelProperty("零件名称") @@ -48,6 +50,7 @@ public class ItemImportVO { private Integer procurementCycle; @ExcelProperty("ABC分类") + @ExcelValid(message = "ABC分类必填") private String classification; @ExcelProperty("使用地点") diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsImportExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsImportExcelVO.java index 4415f6d..50428c9 100644 --- a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsImportExcelVO.java +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsImportExcelVO.java @@ -25,16 +25,20 @@ import java.time.LocalDateTime; public class ItemAccountsImportExcelVO { @ExcelProperty("备件编号") + @ExcelValid(message = "备件编号必填") private String itemNumber; @ExcelProperty("库位编号") + @ExcelValid(message = "库位编号必填") private String locationNumber; @ExcelProperty("库存数量") + @ExcelValid(message = "库存数量必填") private BigDecimal qty; @ExcelProperty(value = "库存类型", converter = DictConvert.class) @DictFormat("item_account_location_type") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + @ExcelValid(message = "库存类型必填") private String type; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java index 7b8316c..b774a44 100644 --- a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java @@ -3,6 +3,7 @@ package com.win.module.eam.controller.location.vo; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.annotations.ExcelValid; import com.win.framework.excel.core.convert.DictConvert; import com.win.module.eam.enums.DictTypeConstants; import lombok.Data; @@ -17,6 +18,7 @@ public class LocationExcelVO { @ExcelProperty("库位编号") @ColumnWidth(value = 20) + @ExcelValid(message = "库位编号必填") private String number; @ExcelProperty("库位名称") @@ -25,6 +27,7 @@ public class LocationExcelVO { @ExcelProperty("库区编号") @ColumnWidth(value = 20) + @ExcelValid(message = "库区编号必填") private String areaNumber; @ExcelProperty("描述") diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationImportVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationImportVO.java index fd1c474..8d10aa1 100644 --- a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationImportVO.java +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationImportVO.java @@ -33,6 +33,7 @@ public class LocationImportVO { @ExcelProperty("库区编号") @ColumnWidth(value = 20) + @ExcelValid(message = "必填") private String areaNumber; @ExcelProperty("描述") diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaImportVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaImportVO.java index c77048c..be2d987 100644 --- a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaImportVO.java +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaImportVO.java @@ -2,6 +2,7 @@ package com.win.module.eam.controller.locationarea.vo; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.ExcelValid; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -21,6 +22,7 @@ public class LocationAreaImportVO { @ExcelProperty("库区编号") @ColumnWidth(value = 20) + @ExcelValid(message = "库区编号必填") private String number; @ExcelProperty("库区名称")