当前位置: 首页 > article >正文

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


http://www.kler.cn/a/430568.html

相关文章:

  • 精选9个自动化任务的Python脚本精选
  • YOLOv9-0.1部分代码阅读笔记-lion.py
  • PetaLinux 内核输出信息的获取方式
  • RPA系列-uipath 学习笔记3
  • AttributeError: module ‘numpy‘ has no attribute ‘bool‘.
  • EsChatPro 接入国内 DeepSeek 大模型
  • Plugin [id: ‘flutter‘] was not found in any of the following sources解决方法
  • FPGA 16 ,Verilog中的位宽:深入理解与应用
  • CVE-2021-25646:Apache Druid远程命令执行漏洞复现
  • Oracle RAC开启和关闭日志归档Log Archive
  • Docker实践和应用详解
  • DApp开发中的测试与调试方法详解
  • 「Mac畅玩鸿蒙与硬件43」UI互动应用篇20 - 闪烁按钮效果
  • MySQL 数据库底层原理解析
  • 【Vulkan入门】08-CreateRenderPass
  • 第四学期-智能数据分析-期末复习题
  • mysql高级篇 |尚硅谷 | 第1章_Linux下MySQL的安装与使用
  • nacos服务注册流程
  • docker-基础
  • 连锁美业门店管理系统【数据分析】功能能为门店经营带来什么帮助?
  • Excel 合并工具 将文件复制到目标工作表中与操作日志记录
  • C# 异常处理全解析:让程序告别崩溃噩梦
  • 在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下:
  • 家校通小程序实战教程06口令验证
  • ArrayBuffer,TypedArray,Int8Array 和Blob的关系
  • python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)