SpringBootMybatisplus整合easyExcel导入Excel到数据库导出
一、前言
今天小编带大家一起整合一下 easyExcel ,之所以用这个,是因为easyExcel 性能比较好,不会报OOM !
市面上常见的导入导出Excel分为三种: hutool easyExcel poi
hutool 和easyExcel 都是对poi 的封装,使用起来更加方便!
如果想使用poi 和hutool 导出的可以看一下小编的之前写的文章:
使用POI+hutool导入Excel并把内容添加到数据库中,直接可以用!!!_掉发的小王的博客-CSDN博客_hutool导入excel
使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!_掉发的小王的博客-CSDN博客
导出的话看一下这篇,下面主要以导入来展开介绍!
EasyExcel导出Excel表格到浏览器,并通过Postman测试导出Excel【入门案例】
二、导入依赖
小编这里是 3.0.X 版本的,版本不同可能导致部分有出入,如果大家版本是3.1.X ,可以去官方文档看看有不一样的!
官方文档 com.alibaba easyexcel 3.0.5 三、实体类
这里可以自带的转换器: @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒") LocalDateTimeStringConverter
或者自定义转化器:
实现: implements Converter
具体文档:官方文档
@ExcelProperty 参数注意:
这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name去匹配
用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据 /** * @author wangzhenjun * @date 2022/12/2 15:52 */ @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 就行!/** * @author wangzhenjun * @date 2022/12/2 15:38 */ @Slf4j @Component // 每次bean都是新的,不要单例 @Scope("prototype") public class ImportDataListener implements ReadListener { @Autowired @Lazy private TestService testService; /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 100; /** * 缓存的数据 */ private List importExcelDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); /** * 这个每一条数据解析都会来调用 * * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()} * @param context */ @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); } } /** * 所有数据解析完成了 都会来调用 * * @param context */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); log.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", importExcelDataList.size()); testService.saveBatch(importExcelDataList); log.info("存储数据库成功!"); } } 五、Controller/** * @author wangzhenjun * @date 2022/10/26 16:51 */ @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/** * @author wangzhenjun * @date 2022/10/26 16:55 */ public interface TestService extends IService { void importExcel(MultipartFile multipartFile); } 七、ServiceImpl/** * @author wangzhenjun * @date 2022/10/26 16:56 */ @Service public class TestServiceImpl extends ServiceImpl 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/** * @author wangzhenjun * @date 2022/10/26 17:07 */ public interface TestDbMapper extends BaseMapper { } 九、测试
准备Excel数据:
在这里插入图片描述
postman上传:
在这里插入图片描述
控制台打印:
在这里插入图片描述
数据库查看:
在这里插入图片描述
完美搞定!! 十、总结
这样就完成了easyExcel批量导入Excel到数据库,还是有很多要注意的点: 自定义转换器 监听器不要单例 保存数据库采用批量 版本差距
如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!
可以看下小编的微信公众号首发看,欢迎关注,一起交流哈!!
我的家乡有近期,不少旅游地火出圈淄博有烧烤云南有泼水节贵州有村BA不少网友也盘点起自己家乡的特色还想了解更多?这些宝藏旅游地推荐给你1hr山东潍坊近日,山东潍坊国际风筝会开幕现场上演硬核风筝
五都荟洛探寻全媒体直播活动在洛阳启动河南日报客户端记者田宜龙王雪娜吉小平4月17日,由河南日报社与洛阳市委宣传部联合推出的行走河南读懂中国之五都荟洛探寻全媒体直播活动在二里头夏都遗址博物馆启动。作为华夏文明的重要发源
金海湖150万平方米露营地开放了!上周六,平谷区环金海湖的十余块露营地再次开放。每周六,营地都将举办不同形式的文旅活动,打造小而美的微度假综合体。金海湖如一块翡翠,镶嵌在连绵群山中。山湖为背景帐篷为营,是不少年轻家
不出国门,在一脚踏四国的小县城就可以尽享异国风情你向往童话世界吗?你想看满大街的欧式建筑,还有那自带阿尔卑斯山画风的异域风情吗?如果你的答案是肯定的,那么欢迎你来新疆的布尔津,因为它是一个能满足你所有幻想的边陲小城,同时也是我国
李楠犯大错!G2中场曾大吼队员没有职业道德,自己同流合污该罚江苏男篮与上海男篮之间由于消极比赛被篮协重罚,参与其中的江苏男篮主教练李楠被处罚停赛3年,这对于他而言绝对是一个毁灭性的打击!曾经中国男篮的小李飞刀,曾经国家队的主教练,戎马一生战
假期遛娃,这条攻略值得收藏!读万卷书,行万里路丰富的自然地质景观深厚的历史文化积淀独特的民族风情让新疆成为研学游的热门地点图片来源一部手机游赛湖万物随春醒美好皆可期在这充满希望的季节里让我们带着萌娃一起来新疆
菏泽凉皮事件,最应该追究的不是这个女人,是站她身后的两个男人一碗凉皮,一个女人,毁了一个景点,一座城市的形象。但是大多数人只看到了这个女人的嚣张跋扈,却忽略站在她背后的那两个男人。首先,作为景区工作人员,商户的食品安全问题本就是工作的重点,
无锡的菜场,都这么卷了?要说一座城市最接地气的地方在哪里当然是菜市场逛菜市场的治愈性只有去过的人才能体会热闹有生活气息人间烟火扑面而来让人感到生之乐趣听说现在的菜市场很卷不仅要有颜值还要有智慧有很多菜市场
安顺经开区十里荷廊的樱桃熟了人间四月芳菲尽,又到樱桃成熟时。4月是摘樱桃的好时节。经开区十里荷廊樱桃园内,一颗颗又红又大的玛瑙红樱桃已经挂满了枝头,全面进入采摘期。今年是十里荷廊种植樱桃的第7个年头,园区种植
又偷了,韩国盯上满汉全席近日,韩国旅游发展官方微博称来到韩国,怎么能不尝下,韩国宫廷满汉全席一事,引发网友群嘲。网友调侃称你猜为什么叫满汉全席?韩国有满汉吗?最终,韩国旅游发展官方删除了该博并对评论区开启
四川东北游绵阳之梓潼县平武县1七曲山大庙在梓潼县城东北10公里,绵阳北50公里,道教全真派圣地,国家文物保护单位。由文昌宫和关帝庙组成,占地1。2万平方米,建筑面积6000平方米。门票60元,观光车20元,1