EasyExcel实现复杂导入 适用于导入1对N类型数据如组合商品,订单和订单明细等等

  1. 引入EasyExcel依赖
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.5</version>
        </dependency>
  1. 准备一个要导入的Excel文件
    示例:
    在这里插入图片描述
    这是一个常见的组合商品的导入,对于一个组合商品有可能是多个商品组合而成,我们要在数据库里为它建立一对多的关联关系.
  2. 建立一个读取Excel的实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GiftBoxTempEntity {
//index代表了该属性是读取Excel文件的第几列,3和5就是处于多关系一方商品的属性
    @ExcelProperty(index = 0)
    private Long id;

    @ExcelProperty(index = 2)
    private BigDecimal giftPrice;
    
    @ExcelProperty(index = 3)
    private Long goodsId;

    @ExcelProperty(index = 5)
    private BigDecimal price;
}
  1. EasyExcel读取所有的行数据
//multipartFile实际开发
        InputStream inputStream = multipartFile.getInputStream();
        List<GiftBoxTempEntity> giftBoxTempEntityList = EasyExcel.read(inputStream).headRowNumber(2).head(GiftBoxTempEntity.class).sheet().doReadSync();
  1. 对读取到的数据进行处理
    为了便于理解我们可以先看一下读取的数据是什么样的
    在这里插入图片描述
    可以看出,EasyExcel按照多的一方去读取,但对应的一的一方的数据只会被读取一次,要想让数据重新形成一对多的关系,我们只需要将后面一的一方为空的数据填充到它上一条一一方不为空的数据就可以了.
    这边有个示例代码:
private static Map<Long, Map<Long, BigDecimal>> importGiftBoxTempEntity(List<GiftBoxTempEntity> giftBoxTempEntityList) {
        Map<Long, Map<Long, BigDecimal>> mapNew = new HashMap<>();
        Map<Long, BigDecimal> map = new HashMap(4);
        GiftBoxTempEntity giftBoxTempEntityNew = new GiftBoxTempEntity();
        for (GiftBoxTempEntity giftBoxTempEntity : giftBoxTempEntityList) {
        //一的一方数据不为空,正常走流程,建立一条数据
            if (null != giftBoxTempEntity.getId()) {
            //集合不为空,读取最近的一的一方数据,把它放进去
                if (!map.isEmpty()) {
                    Long id = giftBoxTempEntityNew.getId();
                    Map<Long, BigDecimal> longBigDecimalMap = mapNew.get(id);
                    for (Map.Entry<Long, BigDecimal> longBigDecimalEntry : map.entrySet()) {
                        longBigDecimalMap.put(longBigDecimalEntry.getKey(),longBigDecimalEntry.getValue());
                    }
                }
                Map<Long, BigDecimal> longBigDecimalMap = new HashMap<>();
                if (mapNew.containsKey(giftBoxTempEntity.getId())) {
                    longBigDecimalMap = mapNew.get(giftBoxTempEntity.getId());
                }
                //重置所有数据,把这次一的一方设置上去,方便下次给没有一的一方数据的的数据赋值
                map = new HashMap<>();
                giftBoxTempEntityNew = giftBoxTempEntity;
                Long goodsId = giftBoxTempEntity.getGoodsId();
                BigDecimal price = giftBoxTempEntity.getPrice();
                longBigDecimalMap.put(goodsId, price);
                longBigDecimalMap.put(-1L,giftBoxTempEntity.getGiftPrice());
                mapNew.put(giftBoxTempEntity.getId(),longBigDecimalMap);
            } else {
            //一的数据为空,这条数据是属于上一条一的一方数据的其中之一,把他放到集合里
                map.put(giftBoxTempEntity.getGoodsId(), giftBoxTempEntity.getPrice());
            }
        }
        return mapNew;
    }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值