如何对 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 表格数据批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java WebService技术详解

    Java WebService技术详解

    本文详细讲解了Java WebService技术工作原理以及调用方式。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • SpringBoot启动及自动装配原理过程详解

    SpringBoot启动及自动装配原理过程详解

    这篇文章主要介绍了SpringBoot启动及自动装配原理过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Idea的Generate Sources无法生成QueryDSL问题及解决方法

    Idea的Generate Sources无法生成QueryDSL问题及解决方法

    这篇文章主要介绍了解决Idea的Generate Sources无法生成QueryDSL问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • java集合框架 arrayblockingqueue应用分析

    java集合框架 arrayblockingqueue应用分析

    ArrayBlockingQueue是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素
    2012-11-11
  • JAVA8之函数式编程Function接口用法

    JAVA8之函数式编程Function接口用法

    这篇文章主要介绍了JAVA8之函数式编程Function接口用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 关于Springboot如何获取IOC容器

    关于Springboot如何获取IOC容器

    大家好,我是孤焰。最近我在制作日志审计功能时发现不知道怎样获取到Springboot项目中的IOC容器,经过摸索,最终解决了这个问题,现在把解决方式和大家分享一下
    2021-08-08
  • java实现文件编码转换的方法

    java实现文件编码转换的方法

    这篇文章主要为大家详细介绍了java实现文件编码转换的方法,分享一个文件编码转换的工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • java8 stream排序以及自定义比较器方式

    java8 stream排序以及自定义比较器方式

    这篇文章主要介绍了java8 stream排序以及自定义比较器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Kubernetes k8s集群之包管理器Helm方式

    Kubernetes k8s集群之包管理器Helm方式

    这篇文章主要介绍了Kubernetes k8s集群之包管理器Helm方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • spring hibernate实现动态替换表名(分表)的方法

    spring hibernate实现动态替换表名(分表)的方法

    下面小编就为大家带来一篇spring hibernate实现动态替换表名(分表)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论