当前位置: 首页 > news >正文

基于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.lryc.cn/news/135227.html

相关文章:

  • 链路聚合详解
  • Shell编程学习之if分支语句的应用
  • 2023.8 - java - 泛型
  • 【数据结构练习】链表面试题锦集一
  • 自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:SequentialChain和TransformationChain]
  • 什么是卷积神经网络
  • 银行数字化转型程度-根据年报词频计算(2012-2021年)
  • 微信开发之一键修改群聊备注的技术实现
  • [oneAPI] 基于BERT预训练模型的SQuAD问答任务
  • 机器学习笔记之优化算法(十七)梯度下降法在强凸函数的收敛性分析
  • shell脚本中linux命令的特殊用法记录
  • Nvidia H100:今年55万张够用吗?
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initLifecycle)
  • Android开发基础知识总结(三)简单控件(上)
  • 在Qt窗口中添加右键菜单
  • Day8 智慧商城
  • LeetCode:Hot100python版本之回溯
  • 分布式事务理论基础
  • 线性代数强化第三章
  • 搭建自己的私有 开源LoRaWAN 网络服务器(The ThingsStack)---之配置
  • 多维时序 | MATLAB实现SCNGO-CNN-Attention多变量时间序列预测
  • clickhouse的删除和更新
  • 微前端 - qiankun
  • 前端编辑页面修改后和原始数据比较差异
  • docker第一次作业
  • Springboot3.0.0+集成SpringDoc并配置knife4j的UI
  • 电脑运行缓慢?4个方法,加速电脑运行!
  • 3.Docker 搭建 MySQL8.0
  • Mybatis的SqlSource SqlNode BoundSql
  • html动态爱心代码【二】(附源码)