读取Excel表,使用Java反射映射到实体中

概述

使用POI读取Excel中的数据,使用Java反射将数据映射到实体中,有一个不好的地方是就是表头的第一行需要定义为属性名,还没有想到如何解决,先这样把

来看,思路

在这里插入图片描述

首先将表头存在一个List中,在读数据的时候,获取相应的列的数据,用反射注入到实体中,在加到List中返回即可

Excel解析类

目前仅针对,String类型的类,进行了操作,其他类型尚没有写,优化也尚未进行

//对一张表,进行实体映射
    private static <T> List<T> readExcel(Class<T> classzz,Workbook workbook) throws Exception {


        Sheet sheet = workbook.getSheetAt(0);

        //获取最后一行
        int lastRowNum = sheet.getLastRowNum()+1;
        //获取最后一列
        int lastCellNum = sheet.getRow(0).getLastCellNum();
        //获取实体类字段
        Field[] fields = classzz.getDeclaredFields();

        Row row = null;

        List<String> headList = new ArrayList<>();

        //一行存为一个Obj,放在List中
        List<T> beans = new ArrayList<T>();

        //获取表头放在list中
         for (int j=0;j<lastCellNum;j++){
             row = sheet.getRow(0);
             Cell cell = row.getCell(j);
             //均格式化为字符串
             DataFormatter formatter = new DataFormatter();
             String value = formatter.formatCellValue(cell);
             headList.add(value);
          }


         for (int i=1;i<lastRowNum;i++){

             //通过class创建实体对象
             T instance = classzz.newInstance();
             for (int j=0;j<lastCellNum;j++){

                 row = sheet.getRow(i);
                 Cell cell = row.getCell(j);
                 DataFormatter formatter = new DataFormatter();
                 String value = formatter.formatCellValue(cell);

                 String headName = headList.get(j);

                 for (Field field : fields){

                     if (headName.equalsIgnoreCase(field.getName())){

                         String methodName = MethodUtils.setMethodName(field.getName());
                         Method method = classzz.getMethod(methodName,field.getType());
                         //注入值
                         method.invoke(instance,value);
                     }

                 }

             }

             beans.add(instance);

         }

         return beans;

    }

//内部静态类
    static class MethodUtils {
        private static final String SET_PREFIX = "set";
        private static final String GET_PREFIX = "get";
        private static String capitalize(String name) {
            if (name == null || name.length() == 0) {
                return name;
            }
            //set+首字母大写 比如setSid
            return name.substring(0, 1).toUpperCase() + name.substring(1);
        }
        public static String setMethodName(String propertyName) {
            return SET_PREFIX + capitalize(propertyName);
        }
        public static String getMethodName(String propertyName) {
            return GET_PREFIX + capitalize(propertyName);
        }
    }

在这里插入图片描述

在这里插入图片描述

pom

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值