栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 整合阿里EasyExcel实现表格批量导入

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 整合阿里EasyExcel实现表格批量导入

记录一次项目中批量导入excel 数据的整合,好记性不如烂笔头。

如对你有帮助,请一键三连 Thank you

1.导入依赖:

 
            com.alibaba
            easyexcel
            3.0.5

2.实体类对象 (要导入的表对应实体类)

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ShopOrder extends Model {
    //订单编号
    @TableId(type = IdType.ASSIGN_ID)
    @ExcelProperty(value = "编号",index = 0)
    private String orderId;
    //应付金额
    @ExcelProperty(value = "金额",index = 1)
    private BigDecimal shouldPay;
    //实付金额
    @ExcelProperty(value = "金额",index = 2)
    private BigDecimal practicalPay;
    //消费者编号


}

3.Service服务层 的接口

 Boolean updateOrderInfo(ShopOrder shopOrder);
//我这里的实现是根据从excel 找到的信息去修改更新

4.接口的实现类

 @Transactional
    @Override
    public Boolean updateOrderInfo(ShopOrder shopOrder){
        return this.updateById(shopOrder);
    }

5.还需要新增一个监听类

@Slf4j
public class EasyExcelLister extends AnalysisEventListener {

    //放置元素的list
    List list=new ArrayList<>();
    //定义的最大值
    private static final int BATCH_COUNT = 1000;

    @Resource
   private ShopOrderService shopOrderService;

    //空参构造
    public EasyExcelLister(){
    }
    //有参构造
    public EasyExcelLister(ShopOrderService shopOrderService){
        super();
        this.shopOrderService=shopOrderService;
    }
    // 第二个执行:一行一行去读取excel内容
    @Override
    public void invoke(ShopOrder shopOrder, AnalysisContext analysisContext) {
        list.add(shopOrder);
        if (list.size()>=BATCH_COUNT){
            list.clear();
        }else {
            saveData(list);
        }
    }

    // 第一个执行:读取excel表头信息
    @Override
    public void invokeHeadMap(Map headMap, AnalysisContext context) {
        System.out.println("表头信息:"+headMap);
    }

    //保存数据
    private void saveData(List list) {
        for (int i=0 ;i<=list.size()-1 ; i++){
              //获取订单id
              String orderId =  list.get(i).getOrderId();
              // 根据id 查询对象
              ShopOrder shop=  shopOrderService.getById(orderId);
              
                
                
              //传入对象修改订单
              shopOrderService.updateOrderInfo(shop);
          }
        
    }

    // 第三个执行:读取完成后执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("所有数据已导入完成");
    }

6.控制层的代码:

public Result saveBatch(@Param("file") MultipartFile file) throws Exception {
        ExcelReader excelReader = null;
        InputStream in = null;
        try {
            in = file.getInputStream();
            excelReader = EasyExcel.read(in,ShopOrder.class, new EasyExcelLister(shopOrderService)).build();
            ReadSheet readSheet = EasyExcel.readSheet(0).build();
            excelReader.read(readSheet);
            excelReader.excelExecutor();
        } catch (IOException ex) {
            log.info("文件导入失败");
        } finally {
            close(in);
            if (excelReader != null) {
                excelReader.finish();
            }
        }
        return Result.ok("");
    }
    private void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();
            } catch (IOException e) {
               log.info("输入流关闭异常", e);
            }
        }

最最重要的启动类代码



//上面就是启动类的main 方法

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //以下的文件夹路径必须是存在的  不然会报错
        factory.setLocation("D:/data/uploadtmp");
        return factory.createMultipartConfig();
    }

就不写测试情况了,到这里所有代码就结束了,业务流程代码我已省略,请根据需求编写。

下次直接拿下!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号