• springboot+poi 解析excel 按坐标取值


    在工作中,我们经常会遇到一些奇葩的excel格式,例如竖标题的excel

    这个时候我们如果用easyExcel处理有点麻烦,所以我就自己写了一个用poi处理的工具类

    首选我们定义一个自定义注解

    import org.apache.commons.lang3.StringUtils;
    
    import java.lang.annotation.*;
    
    
    /**
     * 指定读取的行和列
     * @date 2022-11-07
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface RecordTemplate {
    
         /**
          * 行号
          */
         int rowNo();
    
         /**
          * 列号
          */
         int columnNo();
    
         /**
          * 字段名称
          */
         String name() default StringUtils.EMPTY;
    }

    用法:用在字段属性上

     

     具体的处理

    /**
     * 解析excel备案数据到对象
     * 这里也可以反射直接给对象赋值 field.setAccessible(true);
     */
    public static Object parseExcelToModel(Sheet sheet,Class dataClass) {
        Field[] declaredFields = dataClass.getDeclaredFields();
        //获取excel的流,前端传入
        HashMap resultMap = new HashMap<>(declaredFields.length);
        for (Field field: declaredFields) {
            if (field.isAnnotationPresent(RecordTemplate.class)) {
                RecordTemplate annotation = field.getAnnotation(RecordTemplate.class);
                //单元格的值
                String value = readCell(sheet, annotation.rowNo(), annotation.columnNo());
                //通过反射把 单元格的值 给对象属性
                resultMap.put(field.getName(),value);
            }
        }
        return resultMap;
    }
    /**
     * 根据坐标读取excel的值
     * @param sheet excel
     * @param rowNo 行数
     * @param columnNo 列数
     * @return 单元格内的值 (String)
     */
    private static String readCell(Sheet sheet,int rowNo, int columnNo){
        int lastRowNum = sheet.getLastRowNum();
        if (rowNo > lastRowNum){
            return null;
        }
        //获取行
        Row row = sheet.getRow(rowNo);
        //获取该行的第2列的单元格
        Cell cell = row.getCell(columnNo);
        //设置单元格类型
        DataFormatter dataFormatter = new DataFormatter();
        return dataFormatter.formatCellValue(cell);
    }
  • 相关阅读:
    详解C#中的命名空间
    Okaleido tiger NFT即将登录Binance NFT平台,NFT权益时代即将开启
    Go 语言学习总结(9)—— Go 与 Java 全面对比总结
    GO 工程下载依赖操作流程(go mod)
    通信总线协议五 :CAN
    栈与队列的简单实现(stack and queue)
    从零开始! jupyter notebook的安装教程
    XJSON 是如何实现四则运算的?
    HTTPS一定安全吗
    MQTT.js
  • 原文地址:https://blog.csdn.net/qq_38377774/article/details/127745132