springboot接收excel数据文件去重方式

 更新时间:2024年12月12日 14:55:59   作者:jzx-sdjz  
文章主要介绍了如何在Spring Boot中实现文件上传并入库的功能,包括读取Excel文件、生成Entity对象、使用MergeInto语句进行数据库操作以及注意事项

springboot接收excel数据文件去重

1.创建测试表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL COMMENT '学号',
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `year` int(11) NOT NULL COMMENT '年份',
  `level` tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '等级',
  PRIMARY KEY (`id`, `name`, `year`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2.生产测试文档

3.springboot接收文件并入库

接收到上传的模板文件后,首先读取首行进行字段名称判断,然后一行行的读取excel表格中的数据,生成entity对象。

如果入库的数组大小超过1000,那就入库一次,然后入库使用的类似oracle的merge into语句的ON DUPLICATE KEY UPDATE

注意事项:

  1. 因为测试样例数据量小,上传文件大小限制在springboot中没有设置
  2. 生成的excel字段学号和年份单元格格式应该设置为数值
    @Autowired
    private OperateDao operateDao;

    @PostMapping(value = "/add/tax")
    public String insertTaxData(@RequestParam("file") MultipartFile file) {
        try {
            String filename = file.getOriginalFilename();
            System.out.println(filename);
            InputStream tps = (file.getInputStream());
            final XSSFWorkbook tpWorkbook = new XSSFWorkbook(tps);

            Sheet sheet = tpWorkbook.getSheetAt(0);
            Row headerRow = sheet.getRow(0);
            if (headerRow.getCell(0).getStringCellValue().equals("学号")
                    && headerRow.getCell(1).getStringCellValue().equals("姓名")
                    && headerRow.getCell(2).getStringCellValue().equals("年份")
                    && headerRow.getCell(3).getStringCellValue().equals("等级")
            ) {
                int i = 1;
                boolean flag = true;
                List<StudentEntity> entityList = new ArrayList<>();
                StudentEntity studentEntity;
                while (flag) {
                    Row row = sheet.getRow(i++);
                    if (row != null) {
                        studentEntity = new StudentEntity();
                        Cell id = row.getCell(0);
                        Cell name = row.getCell(1);
                        Cell year = row.getCell(2);
                        Cell level = row.getCell(3);
                        studentEntity.setId((int) id.getNumericCellValue());
                        studentEntity.setName(name.getStringCellValue());
                        studentEntity.setYear((int) year.getNumericCellValue());
                        studentEntity.setLevel( level.getStringCellValue());
                        entityList.add(studentEntity);
                    } else {
                        flag = false;
                    }
                    if (entityList.size() > 1000) {
                        int rs = operateDao.addOrUpdateBatchTax(entityList);
                        System.out.println(rs);
                        entityList.clear();
                    }
                }
                if (entityList.size() > 0) {
                    operateDao.addOrUpdateBatchTax(entityList);
                }
                tps.close();
            } else {
                return "检查模板是否正确";
            }
        } catch (IOException e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return "success";
    }
@Mapper
public interface OperateDao {
    Integer addOrUpdateBatchTax(List<StudentEntity> list);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.test.springboot.dao.OperateDao">
    <insert id="addOrUpdateBatchTax" parameterType="java.util.List">
        INSERT INTO `student`(`id`, `name`, `year`, `level`)
        VALUES
        <foreach collection="list" item="tax" index="index" separator=",">
            (#{tax.id},#{tax.name},#{tax.year},#{tax.level})
        </foreach>
        ON DUPLICATE KEY UPDATE
        level =VALUES ( `level` )
    </insert>

</mapper>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot实现实时弹幕的示例代码

    SpringBoot实现实时弹幕的示例代码

    实时弹幕系统已成为现代视频网站和直播平台的标准功能,它让观众可以在观看视频时发送即时评论,本文将介绍如何使用SpringBoot构建一个实时弹幕系统,需要的可以了解下
    2025-06-06
  • @FeignClient之name,value,url详解

    @FeignClient之name,value,url详解

    在FeignClient中,`name`用于指定服务的名称,通常与服务注册中心中的服务名关联,而`url`用于指定请求的基础URL,适用于不使用服务注册的场景,如果同时配置了`name`和`url`,则`url`会优先生效,Feign会直接使用`url`指定的地址
    2024-11-11
  • Spring Boot集成JWT实现无状态认证与授权方式

    Spring Boot集成JWT实现无状态认证与授权方式

    本文介绍了如何在SpringBoot中集成JWT实现无状态认证与授权,主要步骤包括添加依赖、配置JWT工具类、配置SpringSecurity、创建JWT请求过滤器、创建认证和授权接口、创建用户详情服务以及配置JWT密钥,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 创建SpringBoot项目的全过程

    创建SpringBoot项目的全过程

    文章介绍了如何在IDEA专业版中创建SpringBoot项目,并通过一个简单的示例展示了如何使用SpringBoot输出"hello,Springboot"
    2025-03-03
  • Java虚拟机运行时栈的栈帧

    Java虚拟机运行时栈的栈帧

    本节将会介绍一下Java虚拟机栈中的栈帧,会对栈帧的组成部分(局部变量表、操作数栈、动态链接、方法出口)分别进行介绍,最后还会通过javap命令反解析编译后的.class文件,进行分析方法执行时的局部变量表、操作数栈等
    2021-09-09
  • Java普通类、抽象类、接口的应用和区别解析

    Java普通类、抽象类、接口的应用和区别解析

    本文详细对比了Java普通类、抽象类和接口的区别,从定义关键字、继承或实现关键字、成员字段和方法等方面进行分析,感兴趣的朋友跟随小编一起看看吧
    2026-06-06
  • Java Collection集合遍历运行代码实例

    Java Collection集合遍历运行代码实例

    这篇文章主要介绍了Java Collection集合遍历运行代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java语法基础之选择结构的if语句、switch语句详解

    Java语法基础之选择结构的if语句、switch语句详解

    这篇文章主要为大详细介绍了Java语法基础之选择结构的if语句、switch语句,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Elasticsearch算分优化方案之rescore_query示例详解

    Elasticsearch算分优化方案之rescore_query示例详解

    这篇文章主要为大家介绍了Elasticsearch算分优化方案之rescore_query示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java版给爱人表白的玫瑰花程序代码

    Java版给爱人表白的玫瑰花程序代码

    这篇文章主要讲解了Java版给爱人表白的玫瑰花程序代码,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2018-05-05

最新评论