背景:
网上大部分都不能直接使用,为此总结一个方便入手且可用的工具,用自定义注解实现
依赖包:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version>
</dependency>
实现过程:
1.自定义ExcelRemark注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelRemark {/*** 文本内容*/String value( ) default "";/*** 批注行高, 一般不用设置* 这个参数可以设置不同字段 批注显示框的高度*/int remarkRowHigh() default 0;/*** 批注列宽, 根据导出情况调整* 这个参数可以设置不同字段 批注显示框的宽度*/int remarkColumnWide() default 0;
}
2.DTO
public class regionDo {@ExcelProperty("省份")@ExcelRemark(value = "必填")private String province;@ExcelIgnoreprivate String provinceCode;@ExcelProperty("地市")@ExcelRemark(value = "必填")private String city;
}
3.批注处理类
public class CommentCellWriteHandler implements CellWriteHandler {private final Map<Integer, ExcelComment> notationMap;public CommentCellWriteHandler(Map<Integer, ExcelComment> notationMap) {this.notationMap = notationMap;}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {//表头批注if (isHead){Sheet sheet = writeSheetHolder.getSheet();//画布Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();if (!CollectionUtils.isEmpty(notationMap) && notationMap.containsKey(cell.getColumnIndex())){ExcelComment excelComment = notationMap.get(cell.getColumnIndex());if (Objects.nonNull(excelComment)){Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), 0, (short) excelComment.getRemarkColumnWide(), 1));comment.setString(new XSSFRichTextString(excelComment.getRemarkValue()));cell.setCellComment(comment);}}}}/*** 获取批注Map**/public static Map<Integer, ExcelComment> getNotationMap(Class<?> clazz) {Map<Integer, ExcelComment> notationMap = new HashMap<>();Field[] fields = clazz.getDeclaredFields();//不使用下面方法,就必须指定@ExcelProperty的indexint index = -1;for (Field field : fields) {++index;if (!field.isAnnotationPresent(ExcelRemark.class)) {//不需要批注 并且 是无需导出字段则 索引回归if (field.isAnnotationPresent(ExcelIgnore.class)) {--index;}continue;}//批注存放实体ExcelComment excelComment = new ExcelComment();//获取字段批注注解ExcelRemark ExcelRemark = field.getAnnotation(ExcelRemark.class);excelComment.setRemarkValue(ExcelRemark.value());excelComment.setRemarkColumnWide(ExcelRemark.remarkColumnWide());notationMap.put(index, excelComment);}return notationMap;}}
5.注册器
EasyExcel.write(response.getOutputStream(), RegionDo.class).registerWriteHandler(new CommentCellWriteHandler(CommentCellWriteHandler.getNotationMap(RegionDo.class))).sheet("sheet1")..doWrite(regionDoList)
引用:
https://blog.csdn.net/qq_43049310/article/details/130697234
https://blog.csdn.net/m0_61013974/article/details/134947917