SpringBoot 整合EasyExcel 获取动态Excel列名
导读
最近负责消息网关,里面有个短信模板导入功能,因为不同模板编号对应不同参数,导入后的数据定时发送,涉及到Excel中列名不固定问题,于是想根据列名+值,组合成一个大JSON,具体代码如下。
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
Excel监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON; import java.util.*; /**
* @Description:Excel监听器
* @Author:chenyanbin
* @Date:2021/4/28 下午3:36
* @Versiion:1.0
*/ public class ExcelListener extends AnalysisEventListener<Map<Integer, String>> {
//Excel数据
private List<Map<Integer, Map<Integer, String>>> list;
//Excel列名
private Map<Integer, String> headTitleMap = new HashMap<>(); public ExcelListener() {
list = new ArrayList<>();
} @Override
public void invoke(Map<Integer, String> data, AnalysisContext context) {
System.out.println("解析到一条数据:" + JSON.toJSONString(data));
Map<Integer, Map<Integer, String>> map = new HashMap<>();
map.put(context.readRowHolder().getRowIndex(), data);
list.add(map);
} @Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据解析完成");
} @Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
headTitleMap = headMap;
} public List<Map<Integer, Map<Integer, String>>> getList() {
return list;
} public void setList(List<Map<Integer, Map<Integer, String>>> list) {
this.list = list;
} public Map<Integer, String> getHeadTitleMap() {
return headTitleMap;
} public void setHeadTitleMap(Map<Integer, String> headTitleMap) {
this.headTitleMap = headTitleMap;
}
}
控制器
注:已经组装好动态列名数组,具体业务逻辑,需自行实现
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.ybchen.springbooteasyexcel.listener.ExcelListener;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* @Description:
* @Author:chenyanbin
* @Date:2021/4/28 下午3:36
* @Versiion:1.0
*/
@RestController
public class DemoController {
/**
* 导入
*
* @param file
* @throws IOException
*/
@RequestMapping(value = "import")
public List<Object> importStudentInfos(MultipartFile file) throws IOException {
ExcelListener studentListener = new ExcelListener();
EasyExcel.read(file.getInputStream(), studentListener).sheet().doRead();
List<Map<Integer, Map<Integer, String>>> list = studentListener.getList();
Map<Integer, String> headTitleMap = studentListener.getHeadTitleMap();
List<Map<String, String>> mapList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Map<Integer, Map<Integer, String>> integerMapMap = list.get(i);
integerMapMap.forEach((k, l) -> {
Map<String, String> map = new HashMap<>();
l.forEach((y, z) -> {
map.put(headTitleMap.get(y), z);
});
mapList.add(map);
});
}
System.out.println(mapList);
System.out.println("=============================");
System.out.println(JSON.toJSONString(mapList));
return null;
}
}
Excel模板

演示

SpringBoot 整合EasyExcel 获取动态Excel列名的更多相关文章
- SpringBoot整合MyBatisPlus配置动态数据源
目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...
- SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel
一.前言 今天小编带大家一起整合一下easyExcel,之所以用这个,是因为easyExcel性能比较好,不会报OOM! 市面上常见的导入导出Excel分为三种: hutool easyExcel p ...
- SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多
关于封面:晚饭后回自习室的路上 Easyexcel 官方文档 Easyexcel | github 前言 最近也是在写的一个小练习中,需要用到这个.趁着这次就将写个整合的Demo给大家. 希望能够让大 ...
- SpringBoot整合easyexcel实现Excel的导入与导出
导出 在一般不管大的或者小的系统中,各家的产品都一样,闲的无聊的时候都喜欢让我们这些程序员导出一些数据出来供他观赏,非说这是必须需求,非做不可,那么我们就只能苦逼的哼哧哼哧的写bug喽. 之前使用PO ...
- springboot整合easyexcel实现Excel导入导出
easyexcel:快速.简单避免OOM的java处理Excel工具 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套 ...
- SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录
作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...
- springboot整合Quartz实现动态配置定时任务
前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...
- SpringBoot整合quartz实现动态启动,停止定时任务功能
注意:这个方法当程序重启之后会失效,所以必须将定时任务持久化到数据库,然后程序启动的时候重新把数据库的定时任务加载到quartz中 springboot程序启动初始化代码参考:https://www. ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...
随机推荐
- Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现
1. 我们经常写页面的时候会遇到页面很长需要做返回顶部的操作:$("id /class").animate({scrollTop:$('.class').offset().top} ...
- rocketMQ 文章
10 DefaultMQPushConsumer 使用示例与注意事项.md (lianglianglee.com) 手动回滚事务: (29条消息) spring 控制事务回滚重要知识点:Transac ...
- spiderFlow学习笔记
1.下载demo demo地址:代码下载,文档地址:文档下载 2.加入selenium插件 文档有些,但我琢磨了好一会(QAQ) ①先去码云下载 spider-flow-selenium ②再把插件丢 ...
- kubernetes ingress部署
ingress概念 ingress与service,deployment同样都是k8s中的一种资源 ingress用于实现域名方式访问k8s内部应用 安装ingress 1. 安装helm: wget ...
- 11种排序算法(Python实现)
10种排序算法(Python实现) 冒泡排序 1. 两重循环,每次都将一个点移动到最终位置 def BubbleSort(lst): n=len(lst) if n<=1: return lst ...
- 【Java面试题-基础知识03】Java线程连环问
1.Java中的线程是什么? 在Java中,线程是程序执行流的最小单元.每个Java程序都至少有一个主线程,也称为主执行线程,它是程序开始执行时自动创建的.除了主线程外,程序员还可以创建额外的线程来执 ...
- .NET使用原生方法实现文件压缩和解压
前言 在.NET中实现文件或文件目录压缩和解压可以通过多种方式来完成,包括使用原生方法(System.IO.Compression命名空间中的类)和第三方库(如:SharpZipLib.SharpCo ...
- 2>&1解释
场景 /root/test.sh > runoob.log 2>&1 那2>&1是什么意思? 解释 将标准错误 2 重定向到标准输出 &1 ,标准输出 &am ...
- 10-Python进程与线程
Python进程 创建新进程 from multiprocessing import Process import time def run_proc(name): #子进程要执行的代码 for i ...
- Java解析微信获取手机号信息
在微信中,用户手机号的获取通常是通过微信小程序的getPhoneNumber接口来实现的.这个接口允许用户在授权后,将加密的手机号数据传递给开发者.由于隐私保护,微信不会直接提供用户的明文手机号,而是 ...