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

java使用@interface和反射来动态生成excel

1、对象类上搞注解
public class ReportExecuteDetailDto {

    // 项目信息
    private String regionCode;         // 大区编号
    @ExcelColumn(order = 0, title = "大区")
    private String regionName;         // 大区名称
    
    @ExcelColumn(order = 14, title = "行申请金额", dataType = ExcelColumn.FieldType.Number)
    private BigDecimal detailApplyAmount;    // 行申请金额
}
2、创建注解类
package cn.com.ibm.portal.subject.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface ExcelColumn {
    /**
     * 标注该属性的顺序
     * @return 该属性的顺序
     */
    int order();

    /**
     * execl标题
     * @return
     */
    String title();

    /**
     * 日期数据的格式化格式
     * @return
     */
    String format() default "";

    /**
     * 单元格宽度
     * @return
     */
    int width() default 30;

    /**
     *  是否设置默认值:字符串默认为""
     *  Number:0.00
     *  Date: now
     *  Percent: 0.00%
     */
    boolean hasDefault() default false;

    /**
     * 数据类型
     * @return
     */
    FieldType dataType() default FieldType.String;

    public static enum FieldType {
        /*
            字符串
         */
        String,

        /*
            数值
         */
        Number,

        /*
            日期
         */
        Date,

        /*
            百分比
         */
        Percent;
    }
}
3、获取属性
private static List<Field> getExcelColumnAnnotation(Class clazz) {
        // 用来存放所有的属性域
        List<Field> fieldList = Lists.newArrayList();
        // 过滤带有注解的Field
        for (Field f : clazz.getDeclaredFields()) {
            if (f.getAnnotation(ExcelColumn.class) != null) {
                fieldList.add(f);
            }
        }
        // 这个比较排序的语法依赖于java 1.8
        fieldList.sort(Comparator.comparingInt(
                m -> m.getAnnotation(ExcelColumn.class).order()
        ));
        return fieldList;
    }
4、使用
private static List<PoiCellVo> genExecuteReportTitleData(ReportExecuteDto dto, int startRow, int startCol) {
        List<PoiCellVo> result = Lists.newArrayList();
        //添加固定标题
        int fixStartRow = startRow;
        int fixStartCol = startCol;

        // 根据注解获取标题
        List<Field> annotationList = getExcelColumnAnnotation(ReportExecuteDetailDto.class);

        PoiCellVo fixVo = null;
        ExcelColumn annotation = null;
        for (Field field : annotationList) {
            annotation = field.getAnnotation(ExcelColumn.class);
            if (annotation == null) {
                continue;
            }
            fixVo = new PoiCellVo(annotation.title(), fixStartRow, fixStartCol, 1, 1, headerColor, (short) annotation.width(), (short) 0);
            result.add(fixVo);
            fixStartCol++;
        }

        return result;
    }

http://www.lryc.cn/news/142283.html

相关文章:

  • 【微服务】04-Polly实现失败重试和限流熔断
  • 如何使用HTML5新增的标签来构建语义化的页面结构?
  • Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
  • Web自动化测试之图文验证码的解决方案
  • 软考高级系统架构设计师系列论文九十:论分布式数据库的设计与实现
  • Day 84:网络结构与参数
  • vue2.6及以下版本导入 TDesign UI组件库
  • VR/AR/眼镜投屏充电方案(LDR6020)
  • 区分什么是Java内存模型(JMM)和 JVM运行时数据区
  • Flask狼书笔记 | 04_表单
  • RabbitMQ+springboot用延迟插件实现延迟消息的发送
  • 多线程和并发(1)—等待/通知模型
  • 浏览器的事件循环
  • 跳跃游戏 II【贪心算法】
  • promise
  • 前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket
  • 设计模式之工厂模式(万字长文)
  • CNN 02(CNN原理)
  • Android View动画整理
  • 阿里云架构
  • 【C语言】操作符大全(保姆级介绍)
  • ruoyi-cloud部署
  • Vue3(开发h5适配)
  • 图的存储:邻接矩阵法
  • 如何优雅的使用Git?
  • 【【STM32分析IO该设置什么模式的问题】】
  • 飞天使-k8s基础组件分析-服务与ingress
  • Unity——拖尾特效
  • java开发之fastjson
  • 第一个C语言程序:HelloWorld