JAVA读取Excel映射为Bean

        本篇文章采用的方法是用反射去注值的方式实现的,前提条件是excel表中有一行标题行用以存储实体类的变量名,因为是用标题栏去存储的变量,所以此方法中标题变量的顺序对功能也没有影响,然后读取数据采用的是xssf中的类,首先看一下excel表

 标题行为实体类变量,注意这里应该是要区分大小写的,第二行开始是数据,再看看实体类:

public class UserInfo {

    private String id;
    private String name;
    private String account;
    private String pwd;
    private String age;
    private String sex;

}

因为用的是反射机制,所以也不需要set和get方法,这里重写一下toString()方法,方便用于测试

以下是实现映射的方法:

/**
     * @Author JinX
     * @Description excel数据映射为bean
     * @Date 12:13 2022/11/10
     * @Param [file, cls]   excel文件, 实体类
     * @return java.util.List<T>
     **/
    public static <T> List<T> excel2Bean(File file, Class<T> cls) {
        List<T> beans = new ArrayList<>();
        FileInputStream is;
        XSSFWorkbook wb;
        try {
            is = new FileInputStream(file);
            wb = new XSSFWorkbook(is);
            // 默认加载第一页
            XSSFSheet sheet = wb.getSheetAt(0);
            // 存入标题
            Map<Integer, String> titles = new HashMap<>();
            XSSFRow titleRow = sheet.getRow(0);
            short titleNums = titleRow.getLastCellNum();
            for (Integer i = 0; i <= titleNums; i++) {
                String title = getCellStringValue(titleRow, i);
                titles.put(i, title);
            }
            // 开始存数据
            XSSFRow row;
            Integer rows = sheet.getLastRowNum();
            // 跳过标题
            for (int i = 1; i <= rows; i++) {
                row = sheet.getRow(i);
                T bean = cls.newInstance();
                for (int j = 0; j < titleNums; j++) {
                    String value = getCellStringValue(row, j);
                    // 获取标题 即变量名
                    String tile = titles.get(j);
                    Field field = bean.getClass().getDeclaredField(tile);
                    // private变量
                    field.setAccessible(true);
                    field.set(bean, value);
                }
                // 如果有lineNumer, 存入excel行号, 这个可有可无
                try {
                    Field field = bean.getClass().getDeclaredField("lineNumber");
                    field.setAccessible(true);
                    field.set(bean, String.valueOf(i));
                } catch (Exception e) {

                }
                beans.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return beans;
    }

    /**
     * @Author JinX
     * @Description 包装获取cell数据的方法
     * @Date 12:14 2022/11/10
     * @Param [row, index]
     * @return java.lang.String
     **/
    public static String getCellStringValue(XSSFRow row, int index) {
        if (row == null) {
            return "";
        }
        XSSFCell cell = row.getCell(index);
        if (null == cell) {
            return "";
        }
        cell.setCellType(CellType.STRING);
        return cell.getStringCellValue();
    }

然后测试一下数据

        String filePath = "C:\\Users\\Administrator\\Desktop\\UserInfo.xlsx";
        File file = new File(filePath);
        List<UserInfo> userInfos = ExcelUtil.excel2Bean(file, UserInfo.class);
        for (UserInfo userInfo : userInfos) {
            System.out.println(userInfo);
        }

 数据的话也没有问题,如果有什么不足或是需要改进的地方,欢迎大家评论

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值