如何对 Excel 表格中提取的数据进行批量更新

 更新时间:2024年06月12日 14:25:33   作者:天纵云裳  
这篇文章主要介绍了如何对Excel表格中提取的数据进行批量更新操作,本文通过示例代码介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

书接上回,这篇文章主要来讲述如何对 Excel 表格中提取的数据进行批量更新操作

一.编写查询代码

目的是根据工号, 将其对应的 Flag 变为 1 ,那么 mapper 中我们可以这样做

//Mapper层
    public int updateFlagByEmployeeID(@Param("ids") List<String> ids);
//XML文件中
    <update id="updateFlagByEmployeeID">
        update OA_JDY_Personnel_Info_Test set enableFlag = 1
        where employeeID in
        <foreach collection="ids" separator="," item="employeeID" open="(" close=")">
            #{employeeID}
        </foreach>
    </update>

二.编写 Service 层代码

我们从 String response = " " 往下看,这段代码之前的在上篇博客解释了,主要是进行数据解析

​
    public String enableFlagUpdate(String filename) {
        //获取 PersonSynData 类的 Class 对象。
        Class<PersonSynData> head = PersonSynData.class;
        List<PersonSynData> updateList = new ArrayList<>();
        ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {
            @Override
            public void invoke(PersonSynData personSynData, AnalysisContext analysisContext) {
                updateList.add(personSynData);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("Excel解析完成......");
            }
        }).build();
        //创建 sheet 对象,并且读取Excel的第一个sheet(下表从0开始),也可以根据 sheet 名称获取
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        //读取 sheet 表格数据,参数是可变参数,也可以读取多个sheet
        //这个操作会读取 excel 表格的数据
        excelReader.read(readSheet);
        //需要自己关闭流操作,在读取文件的时候会创建临时文件,如果不关闭的话,会损耗磁盘
        excelReader.finish();
        String success = "";
        //创建更新集合
        List<String> employeeIDs = new ArrayList<>();
        for(int i = 0; i < updateList.size(); i++){
            //这里可以拿到表格内的所有数据,根据表格中的员工号,批量修改Flag
            String employeeID = updateList.get(i).getEmployeeID();
            employeeIDs.add(employeeID);
        }
        int totalUpdatedCount = 0;
        for (int i = 0; i < employeeIDs.size(); i += BATCH_SIZE) {
            List<String> batchIds = employeeIDs.subList(i, Math.min(i + BATCH_SIZE, employeeIDs.size()));
            int updatedCount = jdcloudDao.updateFlagByEmployeeID(batchIds);
            totalUpdatedCount += updatedCount;
        }
        //进行批量更新 每次只更新 2008条
        //int count = jdcloudDao.updateFlagByEmployeeID(employeeIDs);
        return "更新成功的条数:" + totalUpdatedCount + "<br>";
    }
​

 1. List<String> employeeIDs = new ArrayList<>(); 这段代码在经过下面的 for 循环后,里面存储的是每一列的信息,包括 姓名,工号,Flag 

2. 下面的 totalUpdatedCount 是用来记录更新成功的总条数

3.List<String> batchIds = employeeIDs.subList(i, Math.min(i + BATCH_SIZE, employeeIDs.size())); 最为关键的代码就是这个,它的意思是从结果集合 employeeIDs 中截取指定长度的元素集合,每次取的都是 i + BATCH_SIZE(2000)大小的元素。举个例子,假如出文件中的数据有 4200 条

第一次:employeeIDs.subList(0, Math.min(2000, 4200));   截取了 0 ~ 2000的数据进行更新

第二次:employeeIDs.subList(2000, Math.min(4000, 4200)); 截取了 2000~4000 的数据进行更新

第三次:employeeIDs.subList(4000, Math.min(6000, 4200)); 截取了 4000 ~ 4200 的数据更新

其实最关键的就是第三次,这段代码保证了如果最后一次的数据不够  BATCH_SIZE(2000)那么会截取到末尾的位置,来保证不会越界。

三.为什么要进行批量更新

在Mybatis和SqlServer数据源情况下,如果一次更新超过了 2100 条,会报:The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters and resend the request.; nested exception isxxxx  的错误

也就是它不支持一次更新太多的数据,所以就有了 Service 层中的批量更新操作

到此这篇关于如何对 Excel 表格中提取的数据进行批量更新的文章就介绍到这了,更多相关Excel 表格数据批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring rest接口中的LocalDateTime日期类型转时间戳

    Spring rest接口中的LocalDateTime日期类型转时间戳

    这篇文章主要介绍了Spring rest接口中的LocalDateTime日期类型转时间戳的方法,Java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间
    2023-03-03
  • Java中十六进制和十进制之间互相转换代码示例

    Java中十六进制和十进制之间互相转换代码示例

    这篇文章主要给大家介绍了关于Java中十六进制和十进制之间互相转换的相关资料,我们项目过程中总是要用到十进制与十六进制相互转换的方法,需要的朋友可以参考下
    2023-07-07
  • 关于mybatis plus 中的查询优化问题

    关于mybatis plus 中的查询优化问题

    这篇文章主要介绍了关于mybatis plus 中的查询优化问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringBoot实现OneDrive文件上传的详细步骤

    SpringBoot实现OneDrive文件上传的详细步骤

    这篇文章主要介绍了SpringBoot实现OneDrive文件上传的详细步骤,文中通过代码示例和图文讲解的非常详细,对大家实现OneDrive文件上传有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Java Spring Cloud Bus 实现配置实时更新详解

    Java Spring Cloud Bus 实现配置实时更新详解

    这篇文章主要介绍了SpringCloud Bus如何实现配置刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • springboot webflux 过滤器(使用RouterFunction实现)

    springboot webflux 过滤器(使用RouterFunction实现)

    这篇文章主要介绍了springboot webflux 过滤器(使用RouterFunction实现),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • JAVA代码设置selector不同状态下的背景颜色

    JAVA代码设置selector不同状态下的背景颜色

    这篇文章主要介绍了JAVA代码设置selector不同状态下的背景颜色,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 使用Java模拟鼠标和键盘的详细操作步骤

    使用Java模拟鼠标和键盘的详细操作步骤

    这篇文章主要介绍了使用Java模拟鼠标和键盘的详细操作步骤,要运行上面提供的Java程序,您需要遵循几个步骤来设置Java环境、编写程序代码,并执行该程序,文中有相关的代码示例,需要的朋友可以参考下
    2024-05-05
  • Java设计模式之建造者模式的示例详解

    Java设计模式之建造者模式的示例详解

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下
    2022-02-02
  • MyBatis增删改查快速上手

    MyBatis增删改查快速上手

    这篇文章给大家讲解的是MyBatis 这门技术的 CURD (增删改查) ,非常的详细与实用,有需要的小伙伴可以参考下
    2020-02-02

最新评论