文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot+Mybatis-plus整合EasyExcel批量导入Excel到数据库+导出Excel

2024-12-13 16:03

关注

一、前言

今天小编带大家一起整合一下easyExcel​,之所以用这个,是因为easyExcel​性能比较好,不会报OOM!

市面上常见的导入导出Excel分为三种:

hutool和easyExcel​都是对poi​的封装,使用起来更加方便!

二、导入依赖

小编这里是3.0.X版本的,版本不同可能导致部分有出入,如果大家版本是3.1.X,可以去官方文档看看有不一样的!

官方文档:https://easyexcel.opensource.alibaba.com/

<dependency>
<groupId>com.alibabagroupId>
<artifactId>easyexcelartifactId>
<version>3.0.5version>
dependency>

三、实体类

这里可以自带的转换器:

或者自定义转化器:实现:implements Converter

具体文档:官方文档:https://easyexcel.opensource.alibaba.com/docs/3.0.x/quickstart/read#%E6%97%A5%E6%9C%9F%E6%95%B0%E5%AD%97%E6%88%96%E8%80%85%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2

@ExcelProperty参数注意:

这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配。

用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据。


@Data
public class Test {

@TableId
private Integer id;
@ExcelProperty(index = 0)
private String name;
@ExcelProperty(index = 1)
private Integer age;
@ExcelProperty(index = 2,converter = LocalDateTimeStringConverter.class)
private LocalDateTime time;
}

四、编写监听器

注意点:这个监听器一定不要是单例的,被spring管理默认为单例,如果要使用​@Component​,一定要加上:@Scope("prototype")​,这样在创建完后spring不会进行管理,每次都会是新bean!不加​@Component​在导入时要进行new ImportDataListener!小编这里不想new了直接这样写!!如果不想这样,可以使用构造器set进行使用!BATCH_COUNT​:数据阈值,超过了就会清理list,在之前可以进行保存到数据库中,方便内存回收,防治OOM!这里保存到数据库中一般使用​批量保存,不要解析到一行就去保存数据库中,这样数据量大会给数据库增加IO,导致挂掉!这里小编使用ServiceImpl的saveBatch()方法,也可以自己写一下,像小编这样写,会出现循环依赖,加上@Lazy就行!


@Slf4j
@Component
// 每次bean都是新的,不要单例
@Scope("prototype")
public class ImportDataListener implements ReadListener<Test> {

@Autowired
@Lazy
private TestService testService;


private static final int BATCH_COUNT = 100;

private List<Test> importExcelDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);



@Override
public void invoke(Test data, AnalysisContext context) {
log.info("解析到一条数据:{}", JSON.toJSONString(data));
importExcelDataList.add(data);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (importExcelDataList.size() >= BATCH_COUNT) {
saveData();
// 存储完成清理 list
importExcelDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
}
}


@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成!");
}


private void saveData() {
log.info("{}条数据,开始存储数据库!", importExcelDataList.size());
testService.saveBatch(importExcelDataList);
log.info("存储数据库成功!");
}
}

五、Controller


@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

@Autowired
private TestService testService;

@PostMapping("/import")
public Result importExcel(@RequestBody MultipartFile multipartFile){
testService.importExcel(multipartFile);
return Result.success("ok");
}
}

六、Service


public interface TestService extends IService<Test> {
void importExcel(MultipartFile multipartFile);
}

七、ServiceImpl


@Service
public class TestServiceImpl extends ServiceImpl<TestDbMapper, Test> implements TestService{

@Autowired
private ImportDataListener importDataListener;

@SneakyThrows
@Override
public void importExcel(MultipartFile multipartFile) {
InputStream inputStream = multipartFile.getInputStream();
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(inputStream, Test.class, importDataListener).sheet().doRead();
}
}

八、Mapper


public interface TestDbMapper extends BaseMapper<Test> {
}

九、测试

准备Excel数据:

postman上传:

控制台打印:

数据库查看:

完美搞定!!

十、总结

这样就完成了easyExcel批量导入Excel到数据库,还是有很多要注意的点:

来源:小王博客基地内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯