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

EasyExcel实现复杂Excel的导入

最近项目中遇到一个复杂的Excel的导入,并且数据量较大。因为数据不规则,所以只能使用POI进行自定义读取,但是发现数据量大之后,读取数据非常耗时。后面换成EasyExcel,性能起飞。

1. Excel样板

excel样例
如上图,需要导入学校学生信息。前面三列,固定为学校班级信息,可以理解为主表。从第四列开始,为学生信息,其中一列为一条子表信息。

2. 具体实现

  1. 引入EasyExcel的依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>
  1. 自定义导入监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;public class ImportExcelListener extends AnalysisEventListener<Object> {// 封装数据	private List<Object> list = new ArrayList<>();// sheet页索引private int sheetNo = 0;@Overridepublic void invoke(Object t,AnalysisContext context) {// 读取Excel内容int currentSheetNo = context.readSheetHolder().getSheetNo();if(currentSheetNo != sheetNo){// 根据sheet页索引,防止重复添加数据list = new ArrayList<>();sheetNo = currentSheetNo;}list.add(t);}/*** 将表格转化为map集合(复杂Excel)*/public List<LinkedHashMap> getListMap(){String jsonObj = JSON.toJSONString(list);return JSON.parseArray(jsonObj,LinkedHashMap.class);}/*** 读取完数据后的操作*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context){}
}
  1. 测试使用
    3.1. TestController
@RestController
public class ExcelContorller{@Autowiredprivate ExcelService excelService;@PostMapping("/testImport")public Boolean importExcel(MultipartFile file) throws IOException {return excelService.importExcel(file);}
}

3.2. ExcelService

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.test.excel.bean.SchoolInfo;
import com.test.excel.listener.ImportExcelListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.util.StopWatch;import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;@Slf4j
@Service
public class ExcelService {/*** 导入*/public boolean importExcel(MultipartFile file) throws IOException {log.debug("进入导出方法");StopWatch watch = new StopWatch();watch.start();ImportExcelListener importListener = new ImportExcelListener ();ExcelReader excelReader = null;try {// 1为跳过标题行数excelReader = EasyExcelFactory.read(file.getInputStream,importListener).headRowNumber(1).build();List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();List<SchoolInfo> dataList = new ArrayList<>();// 循环处理Sheetfor (ReadSheet sheet : sheets){excelReader.read(sheet);this.dealSheetData(importListener.getListMap(),dataList);}}catch(Exception ex){log.error("导入失败",ex)}finally{watch.stop();log.debug("导入耗时{}毫秒",watch.getTotalTimeMilis());}}
}/*** 数据处理*/
private void dealSheetData(List<LinkedHashMap> rowList,List<SchoolInfo> resultList) {int rowSize = rowList.size();for(int i=0; i < rowSize; i++){// 这里为一行的数据,map的key为单元格的下标,从0开始,value为对应单元格的值LinkedHashMap<Integer,String> row = rowList.get(i);// 数据处理...}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux系统中,计算两个文件的相对路径
  • springboot中的请求过滤filter与拦截interceptor分析
  • 如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
  • Windows下Python和PyCharm的应用(一)__第一个测试程序
  • linux 配置 iscsi 存储资源共享
  • 基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真
  • 计算机网络 第二章: 物理层_信道复用技术
  • Linux_kernel移植uboot07
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • 【MySQL进阶之路】数据库的操作
  • HarmonyOS Menu 组件使用详解
  • DNS故障怎么排查?
  • Sentence-BERT实现文本匹配【回归目标函数】
  • Linux学习~树莓派gpio控制(1)
  • Leetcode JAVA刷刷站(108)将有序数组转换为二叉搜索树
  • 【Leetcode】101. 对称二叉树
  • Cookie 在前端中的实践
  • Date型的使用
  • linux安装openssl、swoole等扩展的具体步骤
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python3爬取英雄联盟英雄皮肤大图
  • tweak 支持第三方库
  • 阿里云Kubernetes容器服务上体验Knative
  • 反思总结然后整装待发
  • 给初学者:JavaScript 中数组操作注意点
  • 关于extract.autodesk.io的一些说明
  • 聊聊hikari连接池的leakDetectionThreshold
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何合理的规划jvm性能调优
  • 如何设计一个比特币钱包服务
  • 三分钟教你同步 Visual Studio Code 设置
  • 微服务核心架构梳理
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 微信小程序--------语音识别(前端自己也能玩)
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 转载:[译] 内容加速黑科技趣谈
  • 正则表达式-基础知识Review
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​​​​​​​​​​​​Γ函数
  • ​Python 3 新特性:类型注解
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #07【面试问题整理】嵌入式软件工程师
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2)STL算法之元素计数
  • (k8s)Kubernetes本地存储接入
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (利用IDEA+Maven)定制属于自己的jar包
  • .htaccess 强制https 单独排除某个目录