首页 > 数据库 >SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel

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

时间:2023-01-12 09:47:18浏览次数:70  
标签:SpringBoot easyExcel Excel private 数据库 导入 public

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

 

一、前言

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

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

  • hutool
  • easyExcel
  • poi

hutooleasyExcel都是对poi的封装,使用起来更加方便!
如果想使用poihutool导出的可以看一下小编的之前写的文章:

使用POI+hutool导入Excel
使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet

导出的话看一下这篇,下面主要以导入来展开介绍!
EasyExcel导出Excel表格到浏览器,并通过Postman测试导出Excel

二、导入依赖

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

官方文档

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

三、实体类

这里可以自带的转换器:

  • @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
  • LocalDateTimeStringConverter

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

具体文档:官方文档

@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,导致挂掉!这里小编使用ServiceImplsaveBatch()方法,也可以自己写一下,像小编这样写,会出现循环依赖,加上@Lazy就行!

/**
 * @author wangzhenjun
 * @date 2022/12/2 15:38
 */
@Slf4j
@Component
// 每次bean都是新的,不要单例
@Scope("prototype")
public class ImportDataListener implements ReadListener<Test> {

    @Autowired
    @Lazy
    private TestService testService;
    
    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<Test> 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<Test> {
    void importExcel(MultipartFile multipartFile);
}

七、ServiceImpl

/**
 * @author wangzhenjun
 * @date 2022/10/26 16:56
 */
@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

/**
 * @author wangzhenjun
 * @date 2022/10/26 17:07
 */
public interface TestDbMapper extends BaseMapper<Test> {
}

九、测试

准备Excel数据:
在这里插入图片描述
postman上传:

在这里插入图片描述
控制台打印:
在这里插入图片描述
数据库查看:
在这里插入图片描述
完美搞定!!

十、总结

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

  • 自定义转换器
  • 监听器不要单例
  • 保存数据库采用批量
  • 版本差距

如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!

标签:SpringBoot,easyExcel,Excel,private,数据库,导入,public
From: https://www.cnblogs.com/manmanblogs/p/17045542.html

相关文章

  • linux 自启动服务SpringBoot Jar包程序指定配置文件
    如果有外部配置文件,需要在命令启动时指定。 jar包启动时指定配置文件application.ymlnohupjava-jar-Dserver.port=8080glass.jar--spring.config.location=fil......
  • 230111_50_SpringBoot入门
    整体视图SpringBoot简介​ SpringBoot基于Spring开发,SpirngBoot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Sprin......
  • python excel转Markdown
    使用Python,将Excel表格转成Markdown格式。废话不多说直接上代码。Excel文件的位置:D:\data\data.xlsx代码执行完成之后会在python文件所在的位置生成一个output.txt文件,......
  • 手把手教你使用IDEA快速搭建一个SpringBoot项目
     手把手使用IDEA快速创建一个SpringBoot项目目录​​手把手使用IDEA快速创建一个SpringBoot项目​​​​1.NewProject选择maven,next​​​​2,填写GroupId,ArtifactId,Ver......
  • 【springboot异常】如何在控制台输出彩色的日志
    微信公众号:​​程序yuan​​关注可获得更多干货哦!问题或建议,请公众号留言;在我们成功运行SpringBoot项目之后,查询控制台日志的时候会控制台的日志是黑白的,此时我们需要进行......
  • 【springboot异常】 Exception in thread "main" java.lang.UnsupportedClassVersionE
    微信公众号:​​程序yuan​​关注可获得更多干货哦!问题或建议,请公众号留言; 在我们运行SpringBoot应用的时候会遇到这样一个问题。Exceptioninthread"main"java.lang.U......
  • springboot-shiro
    1.依赖<!--shiro--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><versio......
  • 【转】前后端分离项目(vue+springboot)集成pageoffice实现在线编辑office文件
    前后端分离项目下使用PageOffice原理图集成步骤前端vue项目在您Vue项目的根目录下index.html中引用后端项目根目录下pageoffice.js文件。例如:<scripttype="text/......
  • 10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf
    上篇:BootstrapBlazor实战通用导入导出服务(Table组件)1.新建工程新建工程b14tabledotnetnewblazorserver-ob14table将项目添加到解决方案中:dotnetslnadd......
  • excel的学习7
    图表制作图表可以帮助我们更加清楚数据的趋势和走势,帮助我们看到数据中隐含的信息,相比于表格来说,图表更加简洁,使我们的数据价值进一步放大。具体操作第一步:在‘插入栏......