一、前言 今天小编带大家一起整合一下easyExcel,之所以用这个,是因为easyExcel性能比较好,不会报OOM! 市面上常见的导入导出Excel分为三种:hutooleasyExcelpoi hutool和easyExcel都是对poi的封装,使用起来更加方便! 如果想使用poi和hutool导出的可以看一下小编的之前写的文章: 使用POIhutool导入Excel并把内容添加到数据库中,直接可以用!!!掉发的小王的博客CSDN博客hutool导入excel 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet。最详细!!!掉发的小王的博客CSDN博客 导出的话看一下这篇,下面主要以导入来展开介绍! EasyExcel导出Excel表格到浏览器,并通过Postman测试导出Excel【入门案例】 二、导入依赖 小编这里是3。0。X版本的,版本不同可能导致部分有出入,如果大家版本是3。1。X,可以去官方文档看看有不一样的! 官方文档dependencygroupIdcom。alibabagroupIdeasyexcelartifactIdversion3。0。5versiondependency三、实体类 这里可以自带的转换器:DateTimeFormat(yyyy年MM月dd日HH时mm分ss秒)LocalDateTimeStringConverter 或者自定义转化器: 实现:implementsConverter 具体文档:官方文档 ExcelProperty参数注意: 这里不建议index和name同时用,要么一个对象只用index,要么一个对象只用name去匹配 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据authorwangzhenjundate202212215:52DatapublicclassTest{TableIdprivateIntegerid;ExcelProperty(index0)privateStringname;ExcelProperty(index1)privateIntegerage;ExcelProperty(index2,converterLocalDateTimeStringConverter。class)privateLocalDateTimetime;}四、编写监听器 注意点: 这个监听器一定不要是单例的,被spring管理默认为单例,如果要使用Component,一定要加上: Scope(prototype),这样在创建完后spring不会进行管理,每次都会是新bean! 不加Component在导入时要进行newImportDataListener! 小编这里不想new了直接这样写!!如果不想这样,可以使用构造器set进行使用! BATCHCOUNT:数据阈值,超过了就会清理list,在之前可以进行保存到数据库中,方便内存回收,防治OOM! 这里保存到数据库中一般使用批量保存,不要解析到一行就去保存数据库中,这样数据量大会给数据库增加IO,导致挂掉!这里小编使用ServiceImpl的saveBatch()方法,也可以自己写一下,像小编这样写,会出现循环依赖,加上Lazy就行!authorwangzhenjundate202212215:38Slf4jComponent每次bean都是新的,不要单例Scope(prototype)publicclassImportDataListenerimplementsReadListenerTest{AutowiredLazyprivateTestServicetestService;每隔5条存储数据库,实际使用中可以100条,然后清理list,方便内存回收privatestaticfinalintBATCHCOUNT100;缓存的数据privateListTestimportExcelDataListListUtils。newArrayListWithExpectedSize(BATCHCOUNT);这个每一条数据解析都会来调用paramdataonerowvalue。Isissameas{linkAnalysisContextreadRowHolder()}paramcontextOverridepublicvoidinvoke(Testdata,AnalysisContextcontext){log。info(解析到一条数据:{},JSON。toJSONString(data));importExcelDataList。add(data);达到BATCHCOUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif(importExcelDataList。size()BATCHCOUNT){saveData();存储完成清理listimportExcelDataListListUtils。newArrayListWithExpectedSize(BATCHCOUNT);}}所有数据解析完成了都会来调用paramcontextOverridepublicvoiddoAfterAllAnalysed(AnalysisContextcontext){这里也要保存数据,确保最后遗留的数据也存储到数据库saveData();log。info(所有数据解析完成!);}加上存储数据库privatevoidsaveData(){log。info({}条数据,开始存储数据库!,importExcelDataList。size());testService。saveBatch(importExcelDataList);log。info(存储数据库成功!);}}五、Controllerauthorwangzhenjundate2022102616:51Slf4jRestControllerRequestMapping(test)publicclassTestController{AutowiredprivateTestServicetestService;PostMapping(import)publicResultimportExcel(RequestBodyMultipartFilemultipartFile){testService。importExcel(multipartFile);returnResult。success(ok);}}六、Serviceauthorwangzhenjundate2022102616:55publicinterfaceTestServiceextendsIServiceTest{voidimportExcel(MultipartFilemultipartFile);}七、ServiceImplauthorwangzhenjundate2022102616:56ServicepublicclassTestServiceImplextendsServiceImplTestDbMapper,TestimplementsTestService{AutowiredprivateImportDataListenerimportDataListener;SneakyThrowsOverridepublicvoidimportExcel(MultipartFilemultipartFile){InputStreaminputStreammultipartFile。getInputStream();这里需要指定读用哪个class去读,然后读取第一个sheet文件流会自动关闭EasyExcel。read(inputStream,Test。class,importDataListener)。sheet()。doRead();}}八、Mapperauthorwangzhenjundate2022102617:07publicinterfaceTestDbMapperextendsBaseMapperTest{}九、测试 准备Excel数据: 在这里插入图片描述 postman上传: 在这里插入图片描述 控制台打印: 在这里插入图片描述 数据库查看: 在这里插入图片描述 完美搞定!!十、总结 这样就完成了easyExcel批量导入Excel到数据库,还是有很多要注意的点:自定义转换器监听器不要单例保存数据库采用批量版本差距 如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!! 可以看下小编的微信公众号首发看,欢迎关注,一起交流哈!!