基于EasyExcel的Excel读取

1.引入依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version>
</dependency>
2.读取器代码:
package com.vz.utils.excel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.cache.MapCache;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;/*** @author visy.wang* @description: Excel读取器* @date 2023/8/18 11:03*/
@Slf4j
public class ExcelReader {public static void read(String fileName,BiConsumer<Integer, List<String>> readHandler,Consumer<Integer> finishHandler){EasyExcel.read(fileName, NoModelDataListener.create(readHandler, finishHandler)).readCache(new MapCache()).sheet().doRead();}public static void read(MultipartFile file,BiConsumer<Integer, List<String>> readHandler,Consumer<Integer> finishHandler) throws IOException {EasyExcel.read(file.getInputStream(), NoModelDataListener.create(readHandler, finishHandler)).readCache(new MapCache()).sheet().doRead();}private static class NoModelDataListener  extends AnalysisEventListener<Map<Integer, String>> {private int totalCount = 0;private static final int BATCH_SIZE = 5;private final List<RowData> list = new ArrayList<>(BATCH_SIZE);private final Consumer<Integer> finishHandler;private final BiConsumer<Integer, List<String>> readHandler;public static NoModelDataListener create(BiConsumer<Integer, List<String>> readHandler,Consumer<Integer> finishHandler){return new NoModelDataListener(readHandler, finishHandler);}private NoModelDataListener(BiConsumer<Integer, List<String>> readHandler,Consumer<Integer> finishHandler) {this.readHandler = readHandler;this.finishHandler = finishHandler;}@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {totalCount ++;invoke(data, context.readRowHolder().getRowIndex());}@Overridepublic void invokeHeadMap(Map<Integer, String> head, AnalysisContext context) {invoke(head, context.readRowHolder().getRowIndex());}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if(!CollectionUtils.isEmpty(list)){batchHandle();}log.info("所有数据已读取完毕!!!");if(Objects.nonNull(finishHandler)){finishHandler.accept(totalCount);}}private void invoke(Map<Integer, String> data, Integer rowIndex){list.add(RowData.builder().rowIndex(rowIndex).data(map2list(data)).build());if(list.size() >= BATCH_SIZE){batchHandle();list.clear();}}private void batchHandle(){log.info("-----------------------------------------------");list.forEach(rowData -> {readHandler.accept(rowData.getRowIndex(), rowData.getData());});}private List<String> map2list(Map<Integer, String> mp){List<String> list = new ArrayList<>(mp.size());for(int i=0; i<mp.size(); i++){list.add(mp.get(i));}return list;}}@Data@Builderprivate static class RowData {private Integer rowIndex;private List<String> data;}
}
3.测试
public static void main(String[] args) {String fileName = "E:\\test\\exl\\test.xlsx";ExcelReader.read(fileName, (rowNo, data) -> {if(rowNo == 0){log.info("第{}行,表头:{}", rowNo+1, JSON.toJSONString(data));}else{log.info("第{}行,数据:{}", rowNo+1, JSON.toJSONString(data));}}, total -> {log.info("一共读取了{}行数据", total);});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法是典型最短路径算法&#xff0c;用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展&#xff08;广度优先搜索思想&#xff09;&#xff0c;直到扩展到终点为止。 算法过程 设置…

离谱的Bug

离谱的 Bug Bug 情况发现 Bug修改 Bug其他感受历史 Bug火星Spirit号Mars Global Surveyor任务 Bug 情况 有一次&#xff0c;我在开发一个网页应用程序时&#xff0c;遇到了一个令人目瞪口呆的Bug。这个Bug出现在一个特定的页面上&#xff0c;当用户点击某个按钮时&#xff0c;…

【golang】关于指针的有限操作

传统意义上来说&#xff0c;指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址。在Go语言中有几种东西可以代表"指针"。其中最贴切传统意义的当属uintptr类型的了。该类型实际上是一个数值类型&#xff0c;也是Go语言内建的数据类型…

Redis 十大数据类型

Redis数据类型都有哪些&#xff1f; Redis支持丰富的数据类型&#xff0c;那么具体在Redis7中都有哪些数据类型呢&#xff1f;请看下图&#xff1a; 官网介绍&#xff1a;https://redis.io/docs/data-types/。 其中&#xff0c;String、Hash、List、Set、Sorted Set等类型是大…

C++ 写入txt文件内容并追加内容

咨询通义千问的“C 写入txt文件内容并追加内容”&#xff1a; 可以使用ofstream类来写入txt文件内容。若想追加内容&#xff0c;可以使用ios::app标志来创建输出流对象&#xff0c;然后在写入时将其设置为ios::app。以下是一个示例代码&#xff1a; #include <iostream>…

T599聚合物电容器:在汽车应用中提供更长的使用寿命的解决方案

自从电子技术被引入汽车工业以来&#xff0c;汽车的技术含量一直在提升。诸多技术被应用在汽车上&#xff0c;使汽车的形象更接近于轮子上的超级计算机。更多传感器、更强大的计算能力和电力被装载到汽车上&#xff0c;汽车应用中的电子产品数量正在迅速增长。随着电动汽车和自…

node使用高版本的oracledb导致连接oracle的Error: NJS-138异常

异常信息如下 Error: NJS-138: connections to this database server version are not supported by node-oracledb in Thin mode 我的oracle版本是11g&#xff0c;之前的使用正常&#xff0c;今天却报错了&#xff0c;显示不支持thin模式&#xff0c;后面回退版本就可以了。

winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?

这里写自定义目录标题 一、.net 6 和 framework 创建的项目的两者的区别二、.net 6 创建的winform 项目如何添加图表控件&#xff08;以ScottPlot为例&#xff09;三、framewrok 创建的winform 项目如何添加图表控件接下来&#xff0c;说明基于.net framework 的 winform 项目如…

【云驻共创】华为云之手把手教你搭建IoT物联网应用充电桩实时监控大屏

文章目录 前言1.什么是充电桩2.什么是IOT3.什么是端、边、云、应用协同4.什么是Astro轻应用 一、玩转lOT动态实时大屏&#xff08;线下实际操作&#xff09;1.Astro轻应用说明1.1 场景说明1.2 资费说明1.3 整体流程 2.操作步骤2.1 开通设备接入服务2.2 创建产品2.3 注册设备2.4…

C++之std::list<string>::iterator迭代器应用实例(一百七十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

OPTEE3.17+ubuntu20.04+qemu_v8搭建OPTEE开发环境

参考文章&#xff1a; https://blog.csdn.net/capodexi/article/details/123548850 https://blog.csdn.net/qq_42557044/article/details/130973200 https://blog.csdn.net/zhuwade/article/details/125513873 https://zhuanlan.zhihu.com/p/521196386 https://blog.csdn.net/…

解决方案中-excel表格的常用功能

解决方案中-excel表格的常用功能&#xff1a; 1.冻结表格的列&#xff0c;行 1.1冻结表格的列&#xff0c;行 需求&#xff1a;表格很多列的内容&#xff0c;我需要关注后面的内容的同时也需要关注前面的内容 操作步骤&#xff1a; 选定指定的列【那一列内容】&#xff0c;…

JAVA下载Excel文件之后无法打开,提示损坏

resources 目录下放模板 excel 文件&#xff0c;通过接口下载后&#xff0c;可以正常下载&#xff0c;但打不开。 问题&#xff1a; springboot 项目简单的下载excel 模板功能&#xff0c;模板放在resources/template/目录中 public void downloadItemBatch(HttpServletRespo…

Vue3 中 导航守卫 的使用

在Vue 3中&#xff0c;导航守卫&#xff08;Navigation Guards&#xff09;用于在路由切换前后执行一些操作&#xff0c;例如验证用户权限、取消路由导航等。Vue 3中的导航守卫与Vue 2中的导航守卫略有不同。下面是Vue 3中导航守卫的使用方式&#xff1a; 全局前置守卫&#xf…

java八股文面试[JVM]——垃圾回收

参考&#xff1a;JVM学习笔记&#xff08;一&#xff09;_卷心菜不卷Iris的博客-CSDN博客 GC垃圾回收面试题&#xff1a; JVM内存模型以及分区&#xff0c;需要详细到每个区放什么 堆里面的分区&#xff1a;Eden&#xff0c;survival from to&#xff0c;老年代&#xff0c;各…

go 方法

golang方法 go语言没有面向对象的特性&#xff0c;也没有类对象的概念。但是&#xff0c;可以使用结构体来模拟这些特性&#xff0c;我们都知道面向对象里面有类方法等概念。我们也可以声明一些方法&#xff0c;属于某个结构体go语言方法的语法 go中方法&#xff0c;是一种特殊…

Golang GORM 单表删除

删除只有一个操作&#xff0c;delete。也是先找到再去删除。 可以删除单条记录&#xff0c;也可以删除多条记录。 var s Studentdb.Debug().Delete(&s, "age ?", 100)fmt.Println(s)[15.878ms] [rows:1] DELETE FROM student WHERE age 100var s Studentdb.De…

2023-08-21 LeetCode每日一题(移动片段得到字符串)

2023-08-21每日一题 一、题目编号 2337. 移动片段得到字符串二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串 start 和 target &#xff0c;长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成&#xff0c;其中&#xff1a; 字符 ‘L’ 和 ‘R…

基于swing的零件销售系统java jsp客户信息维护mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的零件销售系统 系统有1权限&#xff1a;管…

论文阅读 - Understanding Diffusion Models: A Unified Perspective

文章目录 1 概述2 背景知识2.1 直观的例子2.2 Evidence Lower Bound(ELBO)2.3 Variational Autoencoders(VAE)2.4 Hierachical Variational Autoencoders(HVAE) 3 Variational Diffusion Models(VDM)4 三个等价的解释4.1 预测图片4.2 预测噪声4.3 预测分数 5 Guidance5.1 Class…