首页 > 其他分享 >springboot整合easyExcel实现不固定列导入

springboot整合easyExcel实现不固定列导入

时间:2022-10-15 11:03:31浏览次数:60  
标签:deptId springboot easyExcel list param 导入 context import 解析

1、pom.xml文件引入easyExcel

<!--阿里开源easyExcel依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

2、导入监听类

package com.tool.pc.utils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.tool.pc.service.UsersService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Data
@Slf4j
public class ExcelImoprtListener extends AnalysisEventListener<Map<Integer, String>> {
//定义每多少条数据进行数据库保存
private static final int BATCH_COUNT = 128;
//自己实现service层,我这里用的用户表来演示
private UsersService usersService;
//用list集合保存解析到的结果
private List<Map<Integer, String>> list;
//部门id,需要传入的参数可以自己定义
private Integer deptId;

//重构,把传来的值赋给对应的属性
public ExcelImoprtListener(UsersService usersService, Integer deptId) {
this.usersService = usersService;
this.deptId = deptId;
list = new ArrayList<>();
}

/**
* 重写invokeHeadMap方法,获去表头,如果有需要获取第一行表头就重写这个方法,不需要则不需要重写
*
* @param headMap Excel每行解析的数据为Map<Integer, String>类型,Integer是Excel的列索引,String为Excel的单元格值
* @param context context能获取一些东西,比如context.readRowHolder().getRowIndex()为Excel的行索引,表头的行索引为0,0之后的都解析成数据
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
log.info("解析到一条头数据:{}, currentRowHolder: {}", headMap.toString(), context.readRowHolder().getRowIndex());
list.add(headMap);
}

/**
* 重写invoke方法获得除Excel第一行表头之后的数据,
* 如果Excel第二行也是表头,那么也会解析到这里,如果不需要就通过判断context.readRowHolder().getRowIndex()跳过
*
* @param data 除了第一行表头外,数据都会解析到这个方法
* @param context 和上面解释一样
*/
@Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
log.info("解析到一条数据:{}, currentRowIndex: {}----", data.toString(), context.readRowHolder().getRowIndex());
list.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
list.clear();
}
}

/**
* 解析到最后会进入这个方法,需要重写这个doAfterAllAnalysed方法,然后里面调用自己定义好保存方法
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!");
}

/**
* 加上存储数据库
*/
private void saveData() {
log.info("{}条数据,开始存储数据库!", list.size());
//这里自行实现service层方法存储数据库
usersService.saveList(list,deptId);

}

}

3、Controller方法

/**
* 导入
* @param file
* @param deptId 部门id
* @author
* @date
* @return
*/
@PostMapping("/limitImport")
public void limitImport(@RequestParam("file") MultipartFile file,
@RequestParam("deptId") Integer deptId) throws IOException {
//初始化监听器
ExcelImoprtListener excelImoprtListener = new ExcelImoprtListener(usersService,deptId);
//解析数据
EasyExcel.read(file.getInputStream(), excelImoprtListener).sheet(0).doReadSync();

}

4、导入模板

springboot整合easyExcel实现不固定列导入_springboot

springboot整合easyExcel实现不固定列导入_java_02

5、效果查看

springboot整合easyExcel实现不固定列导入_springboot_03

标签:deptId,springboot,easyExcel,list,param,导入,context,import,解析
From: https://blog.51cto.com/u_11541219/5759119

相关文章

  • SpringBoot整合
    1、JedisPoolConfig(这个是配置连接池)2、RedisConnectionFactory这个是配置连接信息,这里的RedisConnectionFactory是一个接口,我们需要使用它的实现类,在SpringData......
  • django-import-expor处理导入和导出数据的库
    顾名思义,django-import-export是一个用于处理导入和导出数据的库。它支持多种格式,包括xls、csv、json、yaml以及tablib支持的所有其他格式。它还可以轻松与Django管理后台......
  • 基于springboot高速公路收费管理系统的设计设计与实现-计算机毕业设计源码+LW文档
    摘  要通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以高速公路收费管理的实际应用需要出发,架构系......
  • 基于springboot的永加乡精准扶贫信息管理系统设计与实现-计算机毕业设计源码+LW文档
    摘要:本精准扶贫信息管理系统是针对目前精准扶贫信息管理的实际需求,从实际工作出发,对过去的精准扶贫信息管理系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管......
  • Debug时导入测试数据
    一般开发在D系统,测试是Q系统,但是D系统没数据,测试不方便,但是传输Q又得走流程。可以考虑测试时把Q系统内表数据下载下来,然后在D系统中导入使用。(针对在D系统修改代码的情况)比......
  • SpringBoot集成Xxl-Job
    Xxl-Job介绍开源社区:https://www.xuxueli.com/xxl-job下载地址:https://gitee.com/xuxueli0323/xxl-job.gitXXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、......
  • SpringBoot中Server层以及Mapper层常用注解
    4.Service层注解@Service注解一般写在业务层的接口实现类上,而不是接口上。4.1@Service@Service:@Service注解用于类上,标记当前类是一个service类,加上该注解会将当......
  • 由浅入深:Python 中如何实现自动导入缺失的库?
    在写Python项目的时候,我们可能经常会遇到导入模块失败的错误:​​ImportError:Nomodulenamed'xxx'​​​或者​​ModuleNotFoundError:Nomodulenamed'xxx'​​......
  • springboot+resttemplat+请求拦截器
    参考:https://www.cnblogs.com/kaibindirver/p/15527052.html   创建配置文件来注册拦截器MyMvcConfig1packagecom.config;23importcom.controle.lanj......
  • Springboot整合MQTT
    业务场景硬件采集的数据传入EMQX平台(采用MQTT协议),java通过代码连接MQTT服务器,进行采集数据接收、解析、业务处理、存储入库、数据展示。MQTT是基于发布(Publish)/订......