excel解析成java实体

  • 问题

由于业务的迭代和各种数据订正等等场景。excel解析的场景越来越多,但是现成的工具类其实还是不够自动化,我们需要一个只关注解析对象的工具,其他的东西尽量做到封装。

可以把excel表格看成RDB的表一样,一行就代表一条记录,对应代码一个entity。根据不同的需求我们只需要编写列与entity字段的映射关系即可,其他的兼容性与实现细节不关心。
在这里插入图片描述

  • 实现方式
/**
 * 将表格的数据转换成目标对象
 * @param inputStream 文件流
 * @param fileName 判断是否是xlsx或则xls的依据
 * @param cellElementMapper 回调函数, 映射元素属性与行的值
 * @param <TARGET> 需要转换成的行 model
 * @return
 */
public static <TARGET> List<TARGET> parseToList(InputStream inputStream, String fileName, Function<ArrayList<String>, TARGET> cellElementMapper) {
    Workbook workbook = null;
    try {
        workbook = isXlsxFile(fileName) ? new XSSFWorkbook(inputStream) : new HSSFWorkbook(inputStream);
 
        Sheet sheetAt = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheetAt.rowIterator();
        List<TARGET> targetList = Lists.newArrayList();
        while (rowIterator.hasNext()) {
            Row next = rowIterator.next();
            ArrayList<String> rowStringList = Lists.newArrayList();
            Iterator<Cell> cellIterator = next.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                cell.setCellType(Cell.CELL_TYPE_STRING);
                String val = cell.getStringCellValue().trim();
                if (StringUtils.isNotEmpty(val)) {
                    rowStringList.add(cell.getStringCellValue().trim());
                }
            }
            if (! rowStringList.isEmpty()) {
                targetList.add(cellElementMapper.apply(rowStringList));
            }
        }
        return targetList;
    } catch (IOException e) {
        log.error("parse execel error", e);
    } finally {
        if (Objects.nonNull(workbook)) {
            try {
                workbook.close();
            } catch (IOException e) {
                log.error("work close error ", e);
            }
        }
    }
    return null;
}
 
/**
 * 判断是否是xlxs
 * @param originFileName
 * @return
 */
private static boolean isXlsxFile(String originFileName) {
    if (originFileName.contains("xlsx")) {
        return true;
    }
    return false;
}

测试excel表格
在这里插入图片描述
使用方式
在这里插入图片描述

  • 总结
    整个实现的思路就是尽量想着去封装不关心的逻辑,封装的方式很多,只要尽可能的遵循几大原则就好,这里用函数编程回调的方式把一个大的逻辑里的小的逻辑开放出来,这很像设计模式里的模板方法,也很像策略模式,但是却更加灵活不用实现或则继承更轻量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值