导读

  最近负责消息网关,里面有个短信模板导入功能,因为不同模板编号对应不同参数,导入后的数据定时发送,涉及到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列名的更多相关文章

  1. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  2. SpringBoot+Mybatis-plus整合easyExcel批量导入Excel到数据库+导出Excel

    一.前言 今天小编带大家一起整合一下easyExcel,之所以用这个,是因为easyExcel性能比较好,不会报OOM! 市面上常见的导入导出Excel分为三种: hutool easyExcel p ...

  3. SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多

    关于封面:晚饭后回自习室的路上 Easyexcel 官方文档 Easyexcel | github 前言 最近也是在写的一个小练习中,需要用到这个.趁着这次就将写个整合的Demo给大家. 希望能够让大 ...

  4. SpringBoot整合easyexcel实现Excel的导入与导出

    导出 在一般不管大的或者小的系统中,各家的产品都一样,闲的无聊的时候都喜欢让我们这些程序员导出一些数据出来供他观赏,非说这是必须需求,非做不可,那么我们就只能苦逼的哼哧哼哧的写bug喽. 之前使用PO ...

  5. springboot整合easyexcel实现Excel导入导出

    easyexcel:快速.简单避免OOM的java处理Excel工具 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套 ...

  6. SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

    作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...

  7. springboot整合Quartz实现动态配置定时任务

    前言 在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面就通过一个简单的示例,来实现这个功能. 一.新建一个springboot工程,并添加依赖 & ...

  8. SpringBoot整合quartz实现动态启动,停止定时任务功能

    注意:这个方法当程序重启之后会失效,所以必须将定时任务持久化到数据库,然后程序启动的时候重新把数据库的定时任务加载到quartz中 springboot程序启动初始化代码参考:https://www. ...

  9. SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...

  10. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例

    1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...

随机推荐

  1. oracle中commit之后如何进行回滚

    commit之后 第一种: 记住大概的时间,获取前大概时间的数据. select * from Test as of timestamp to_timestamp('2021-12-08 09:30: ...

  2. vulnhub靶场-->MATRIX-BREAKOUT: 2 MORPHEUS

    靶机下载地址 MATRIX-BREAKOUT: 2 MORPHEUS << 点我下载 开始打靶 IP发现 nmap扫描网段发现靶机ip:192.168.111.139 端口发现 对靶机进行 ...

  3. golang sync.once done 热路径

    sync.once 为什么会将done放在结构体第一个字段,就能够提升性能了? 我们先来看看sync.once的结构体: // Once is an object that will perform ...

  4. C# Afroge摄像头翻转90

    1.dll和命名空间就不在此列举了,如下只是将转换方法介绍: 第一个函数: public void Rotate90() { // 计算角度,类变量 //dAngle = dAngle + 90; / ...

  5. 提速15%,PaddleOCRSharp新版v4.3发布

    PaddleOCRSharp v4.3版本,已经于5月23日发布.该版本的发布,在不影响识别精度的同时,带来了10%~15%速度的提升. 项目地址:https://gitee.com/raoyutia ...

  6. containerd 源码分析:创建 container(一)

    0. 前言 Kubernetes:kubelet 源码分析之 pod 创建流程 介绍了 kubelet 创建 pod 的流程,containerd 源码分析:kubelet 和 containerd ...

  7. 「C++」深度分析C++中i++与++i的区别

    大家好,我是Charzie.在C++编程中,i++和++i是两个常见的自增运算符,用于将变量的值增加1(有时与i+=1效果一样).然而,虽然它们的功能看似相似,但在实际使用中却存在显著的区别.本博客将 ...

  8. python+k8s(基础,遇到的问题)

    python+k8s(基础,遇到的问题) CoreV1Api和ApiClient的区别 kubernetes.client.CoreV1Api kubernetes.client.ApiClient ...

  9. 引用数据类型string字符串 类型转换

    String 任何" "之间的值 包括空格 String类型的字面取值 String str1 = "你好" String str2 = "hello ...

  10. 程序员面试金典-面试题 16.25. LRU缓存

    题目: 设计和构建一个"最近最少使用"缓存,该缓存会删除最近最少使用的项目.缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量.当缓存被填满时,它应该 ...