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>

总结

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

相关文章

  • Java Spring AOP之PointCut案例详解

    Java Spring AOP之PointCut案例详解

    这篇文章主要介绍了Java Spring AOP之PointCut案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java打包Jar包后使用脚本执行

    Java打包Jar包后使用脚本执行

    本文详细讲解了Java打包Jar包后使用脚本执行的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • Java实现添加条形码到PDF表格的方法详解

    Java实现添加条形码到PDF表格的方法详解

    条码的应用已深入生活和工作的方方面面。本文以操作PDF文件为例,介绍如何利用Java语言在编辑表格时,向单元格中添加条形码,感兴趣的可以学习一下
    2022-06-06
  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    这篇文章主要介绍了2020最新IDEA SpringBoot整合Dubbo(zookeeper版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 关于Spring中的三级缓存解析

    关于Spring中的三级缓存解析

    这篇文章主要介绍了关于Spring中的三级缓存,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Spring Data JPA自动生成表时列顺序混乱的最新解决办法

    Spring Data JPA自动生成表时列顺序混乱的最新解决办法

    文章主要介绍了Spring Boot 3.3.5版本中SpringDataJPA自动生成表时列顺序混乱的问题,以及如何通过替换Hibernate实现来解决这个问题,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Java实现二维码功能的实例代码

    Java实现二维码功能的实例代码

    今天这篇文章,主要是利用Java实现二维码功能,本文思路清晰,需要的朋友参考下
    2017-02-02
  • springboot如何读取配置文件到静态工具类

    springboot如何读取配置文件到静态工具类

    这篇文章主要介绍了springboot实现读取配置文件到静态工具类方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Mybatis使用XML实现动态sql的示例代码

    Mybatis使用XML实现动态sql的示例代码

    当编写 MyBatis 中复杂动态 SQL 语句时,使用 XML 格式是一种非常灵活的方式,本文主要为大家详细介绍了Mybatis使用XML实现动态sql的具体方法,需要的可以参考下
    2023-12-12
  • Java中MapStruct使用方法解析

    Java中MapStruct使用方法解析

    这篇文章主要介绍了Java中MapStruct使用方法解析,接受请求参数都会使用一个vo类,这个vo类里封装了所有需要接受的参数,然后对参数进行业务逻辑处理,处理完后会持久化处理, 使用MapStruct可以快速帮你解决转换工作,需要的朋友可以参考下
    2023-10-10

最新评论