EasyExcel实现复杂Excel的导入

server/2024/9/20 3:58:29/ 标签: excel

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

1. Excel样板

<a class=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);// 数据处理...}
}

http://www.ppmy.cn/server/112809.html

相关文章

仿人机器人

1. ZMP 1.1 二维分析&#xff1a; 着重看公式3.3,考虑对应于力矩为零时的那个作用点&#xff0c;即满足\(\tau(p_x) 0\)的点\(p_x\)。 1.2 三维分析&#xff1a; 力矩为零的作用点&#xff1a; 点p就是压强中心&#xff0c;也即ZMP。 当机器人运动的时候&#xff0c;一般情况下…

灯塔:MYSQL笔记(2)函数

函数 是指一段可以直接被另一段程序调用的程序或代码。 字符串函数 SELECT 函数(参数); 数值函数 SELECT 函数(参数); -- 生成一个六位验证码 select lpad(round(rand()*1000000,0) ,6,0)as 验证码; 日期函数 流程函数 总结&#xff1a; 约束&#xff1a; 1. 概述&#xff…

使用docker调试odoo

使用 Visual Studio Code (VSCode) 的 Dev Containers 进行 Odoo 开发和调试是一个高效的方法&#xff0c;尤其是当你希望在一个清洁且一致的开发环境中工作时。以下是设置和配置 Dev Container 以在 Docker 环境中单步调试 Odoo 系统的步骤&#xff1a; ### 步骤 1: 准备 Doc…

【LeetCode】08.字符串转换整数

题目要求 解题思路 本题没有难点&#xff0c;只需注意最大整数的比较时要切换成long long 代码实现 class Solution { public:int myAtoi(string s) {//标记正负号int flag1;long long ret0;int ns.size();int i0;//去除空格while(s[i] ) i;//识别符号if(s[i]-) flag-1;i…

Zynq7000系列FPGA中的DDRC纠错码(ECC)

仅在半总线宽度&#xff08;16位&#xff09;数据宽度配置中提供可选的ECC支持。这种配置下&#xff0c;外部DRAM DDR设备需要26位&#xff0c;其中16位用于数据&#xff0c;10位用于ECC。每个数据字节使用独立的5位ECC字段&#xff0c;这种模式提供了单错误纠正和双错误检测的…

拥抱分布式云:云基础设施的下个新时代

在技术不断发展的过程中&#xff0c;云计算早已成为一股变革力量&#xff0c;使企业能够以前所未有的速度进行扩展、创新和适应。虽然世界仍然需要大规模集中式数据中心所产生的强大计算能力&#xff0c;但“提供更好体验”这个需求正在将云计算进一步地推向边缘。 ​ 这种需求…

速盾:ddos防御整体方案,高防cdn防御可靠吗

DDoS攻击是一种利用多台僵尸主机向目标网络发动大规模流量攻击的方式&#xff0c;旨在使目标系统资源耗尽&#xff0c;导致服务不可用。为了保护网络安全&#xff0c;许多企业选择使用DDoS防御解决方案。而其中一种常见的方法是使用高防CDN进行防御。 高防CDN是指具备较强的DD…

【网络安全】XSS之HttpOnly防护(附实战案例)

原创文章,不得转载。 文章目录 HttpOnly的产生背景HttpOnly的用途配置HttpOnly实战案例总结HttpOnly的产生背景 随着Web应用程序的普及,安全性问题也愈发凸显,尤其是与会话管理相关的安全漏洞。在Web应用中,服务器通常会通过HTTP协议在客户端和服务器之间传递重要信息,如…

pdf怎么压缩小一些?推荐的几种PDF压缩方法

pdf怎么压缩小一些&#xff1f;在工作中&#xff0c;我们经常处理PDF文件。大文件不仅存储麻烦&#xff0c;还会拖慢传输速度。因此&#xff0c;我们通常希望将这些文件压缩成更小的尺寸。压缩后的文件更便于分享和管理&#xff0c;适用于云存储、社交媒体或其他在线平台&#…

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出 文章目录 一、基本原理1. 数据预处理2. PSO优化&#xff08;粒子群优化&#xff09;3. KELM训练&#xff08;核极限学习机&#xff09;4. AdaBoost集成5. 模型评估和优化6.…

奥威让您更懂现金流情况

企业现金流一旦出了问题都是大问题&#xff0c;会直接影响到企业的日常运作&#xff0c;甚至直接关系到企业能不能继续存活&#xff0c;因此现金流量表是企业财务分析中重要报表之一&#xff0c;也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

go常用代码

连接阿波罗&#xff1a; 默认properties类型 package mainimport ("fmt""github.com/apolloconfig/agollo/v4""github.com/apolloconfig/agollo/v4/env/config" )func main() {c : &config.AppConfig{AppID: "2222",Cl…

java后端开发-Mybatis连接数据库步骤

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

计算机网络11——数据库语法2

目录 1、变量 (1)局部变量 (2)会话变量 (3)系统变量 2、判断选择 (1)if选择语法 (2)case选择 3、循环 (1)while循环 (2)其他循环 4、存储过程 5、触发器 6、事务:transaction 事务的特性 使用 1、变量 (1)局部变量 函数里面定义的,变量名 …

leetcode:3176 求出最长好子序列 使用动态规划

3176. 求出最长好子序列 题目链接https://leetcode.cn/problems/find-the-maximum-length-of-a-good-subsequence-i/ 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标 i 满足 seq[i] ! se…

压缩大型语言模型 LLMs

压缩大型语言模型 LLMs 随着人工智能技术的迅猛发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如GPT系列已成为自然语言处理领域的明星。然而&#xff0c;这些模型通常包含数十亿甚至上万亿的参数&#xff0c;导致巨大的计算和存储需求&#xff0c;限制了它们在消…

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景 "板凳龙"&#xff0c;又称"盘龙"&#xff0c;是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色&#xff0c;展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中&am…

c++ 链表tail->next = new ListNode(sum % 10); tail = tail -> next; 语句含义

这两行 C 代码&#xff1a; tail->next new ListNode(sum % 10); tail tail->next;通常出现在处理链表&#xff08;ListNode&#xff09;的上下文中&#xff0c;特别是在实现与数字相加相关的算法时&#xff0c;比如“两个数相加”问题。下面是对这两行代码的详细解释…

IIS 反向代理模块: URL Rewrite 和 Application Request Routing (ARR)

需要设置iis反向代理的场景其实挺多的。例如websocket、Server Sent Events(SSE) 都需要反向代理。 对于需要临时放公网访问的应用&#xff0c;直接运行127.0.0.1的开发环境&#xff0c;然后通过反向代理访问127.0.0.1就可以了&#xff0c;省去麻烦的iis设置。 IIS 实现反向代…

【Day07】

目录 MySQL-DQL- 基本查询 MySQL-DQL- 条件查询 MySQL-DQL- 聚合函数 MySQL-DQL- 分组查询 MySQL-DQL- 排序查询 MySQL-DQL- 分页查询 MySQL-DQL- 案例 MySQL-多表设计-一对多 MySQL-多表设计-一对多-外键约束 MySQL-多表设计-一对一&多对多 MySQL-多表设计-案例…