自学内容网 自学内容网

easyExcel实现表头批注

背景:

网上大部分都不能直接使用,为此总结一个方便入手且可用的工具,用自定义注解实现
依赖包:

<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;

    @ExcelIgnore
    private 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;
    }


    @Override
    public 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的index
        int 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


原文地址:https://blog.csdn.net/qq_39606051/article/details/144351564

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!