前面讲述了使用实体类的方式绑定excel表头的方式进行读取和写入操作,是比较简单的,那么由于表头可能会变,那么就不能使用绑定实体类的方式进行了,于是搜索百度一番,借鉴别人的博客,使用map集合的方式进行读取和写入操作。

目录

1、导入相关依赖

2、读取Excel的服务调用

3、将excel数据读取到map中并保存到数据库

4、编写通过map保存到数据库的SQL语句

5、保存到数据库的结果

6、写入数据到excel

7、总结


1、导入相关依赖

<!--   easyexcel     --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency>

2、读取Excel的服务调用

 @Overridepublic void saveTypeSpectrumInfosFromExcel(MultipartFile file, SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService, Integer treeNodeId, HeaderTableService headerTableService) {//文件输入流InputStream is = null;try {is = file.getInputStream();} catch (IOException e) {e.printStackTrace();}//调用方法进行读取EasyExcel.read(is, new TypeSpectrumInfoExcelListener(selfDefineTypeSpectrumInfoService, treeNodeId, headerTableService)).sheet().doRead();
}

3、将excel数据读取到map中并保存到数据库


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bjsasc.productksys.exceptionHandler.SelfDefinitionException;
import com.bjsasc.productksys.headertableservice.entity.HeaderTable;
import com.bjsasc.productksys.headertableservice.service.HeaderTableService;
import com.bjsasc.productksys.selfdefinetypespectruminfoservice.service.SelfDefineTypeSpectrumInfoService;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Author 不要有情绪的  ljy* @Date 2022/11/16 9:41* @Description:*/
public class TypeSpectrumInfoExcelListener extends AnalysisEventListener<Map<Integer, Object>> {private SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService;private Integer treeNodeId;//用于存储表头的信息private Map<Integer, String> headMap;public TypeSpectrumInfoExcelListener(SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService, Integer treeNodeId) {this.selfDefineTypeSpectrumInfoService = selfDefineTypeSpectrumInfoService;this.treeNodeId = treeNodeId;}@Overridepublic void invoke(Map<Integer, Object> stringObjectMap, AnalysisContext analysisContext) {HashMap<String, Object> paramsMap = new HashMap<>();for (int i = 0; i < stringObjectMap.size(); i++) {String s = headMap.get(i);Object o = stringObjectMap.get(i);
//            System.out.println(s+"  "+o);//将表头作为map的key,每行每个单元格的数据作为map的valueparamsMap.put(s, o);}paramsMap.put("sys_tree_id", treeNodeId);System.out.println(paramsMap);//将数据插入到数据库中selfDefineTypeSpectrumInfoService.addTypeSpectrumInfo(paramsMap);}//读取excel表头信息@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;System.out.println("表头信息:" + headMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}

对以上代码进行解读下:首先创建了个map用于存储表头,是为了后面将数据存入数据库做准备,paramsMap 是一个存储所有插入数据库的(即excel一行的数据字段)参数,其中key为表头。value为读取的数据。

4、编写通过map保存到数据库的SQL语句

由于不是绑定的实体类,就不能直接使用mybatis-plus通过传递实体类进行数据的保存了,因此要自己的手动写SQL语句,SQL语句如下:

@Insert("<script> " +"insert into self_define_type_spectrum_info (" +"<foreach collection='paramsMap' item='value' index='key' separator=','>"+ "${key}"+ "</foreach>" +")"+ "values ("+ "<foreach collection='paramsMap' item='value' index='key' separator=','>"+ "#{value}"+ "</foreach>"+ ")"+   "</script>")public int addTypeSpectrumInfo(@Param("paramsMap") HashMap<String, Object> paramsMap);

为了清晰表达,再给个截图,如下:

5、保存到数据库的结果

这儿就不展示了

以上就是读取excel到map集合,然后保存到数据库的过程。

6、写入数据到excel

@ApiOperation(value = "选择一个路径,将当前的列表导出到excel")@GetMapping("/xxxxxx/{treeNodeId}")public R xxxxxx(HttpServletResponse response,@ApiParam(name = "treeNodeId", value = "当前树节点id", required = true) @PathVariable Integer treeNodeId) {SysTree treeNode = sysTreeService.getById(treeNodeId);String treeNodeName = treeNode.getNodeName();String fileName = treeNodeName + "_型谱信息.xlsx";List<Map<String, Object>> list = selfDefineTypeSpectrumInfoService.getAll(treeNodeId);List<HeaderTable> headerTableList = headerTableService.list(new QueryWrapper<HeaderTable>().eq("sys_tree_id", treeNodeId));String[] headArr = new String[headerTableList.size()+3];int i = 0;headArr[i++] = "产品专业";headArr[i++] = "产品类别";headArr[i++] = "产品规格";for (; i < headArr.length; i++) {headArr[i] = headerTableList.get(i-3).getHeaderName();}List<Object> dataList = new ArrayList<>();for (Map<String, Object> stringObjectMap : list) {List<Object> headList = new ArrayList<>();for (String s : headArr) {headList.add(stringObjectMap.get(s));}dataList.add(headList);}EasyExcel.write(fileName).head(createdHead(headArr)).sheet(treeNodeName).doWrite(dataList);return R.ok();}//处理字段的表头值private static List<List<String>> createdHead(String[] headMap) {List<List<String>> headList = new ArrayList<List<String>>();for (String head : headMap) {List<String> list = new ArrayList<String>();list.add(head);headList.add(list);}return headList;}

对以上代码进行解读:

由于表头不固定,但是我们是让自己配置表头,当配置的一致时,才可以让excel导入,因此,headerTableService是为了查询配置的表头为哪些的操作,此外,

headArr[i++] = "产品专业";
headArr[i++] = "产品类别";
headArr[i++] = "产品规格";

这三个是写入excel必须的表头,以及数据库中有相应的数据。

其主要看这行代码

EasyExcel.write(fileName).head(createdHead(headArr)).sheet(treeNodeName).doWrite(dataList);

顺便看下表头是如何与数据进行对应起来的!!!其中createdHead()函数是参考别人的博客,具体哪个的博客忘掉了,在此感谢无名的他或她,嘻嘻嘻!

上面代码的功能是通过查询哪些表头对应的数据需要写入excel,即比如数据库表中有 姓名 这一列,但是excel中不想需要写入,那么就可以改变以上代码完成相应需求。

下面附上查询数据库将数据封装到map中的SQL语句

@ResultType(Map.class)@Select("select * from self_define_type_spectrum_info where sys_tree_id = #{treeNodeId}")public List<Map<String, Object>> getAll(Integer treeNodeId);

7、总结

以上就是通过map对excel 的读取和写入操作,整个过程相对于绑定实体类的方式是较复杂的,希望你们认真看,认真读,我在尽力地写清楚我所说的话,可能其中没说明白,也希望谅解下,真心希望读完后能够帮助到你完成你的需求,哪怕一点点!!! 如果可以给个zan    赞!

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                         ------不写代码不会凸的小刘

(二)Easyexcel 的使用(读取数据到map集合中)相关推荐

  1. Map集合中value()方法与keySet()、entrySet()区别 ——转载

    为什么80%的码农都做不了架构师?>>>    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet(): 将Map中所有的键存入 ...

  2. 【Groovy】map 集合 ( 根据 Key 获取 map 集合中对应的值 | map.Key 方式 | map.‘Key’ 方式 | map[‘Key’] 方式 | 代码示例 )

    文章目录 一.根据 Key 获取 map 集合中对应的值 1.通过 map.Key 方式获取 map 集合中的值 Value 2.通过 map.'Key' 方式获取 map 集合中的值 Value 3 ...

  3. Map集合中的entry是什么?

    Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Value),而Set<Map.Entry<K,V>>表示一个映射项的Set. Map.Ent ...

  4. jdk8中Map集合中的compute系列方法的使用

    1.compute 现对List 中的map集合中的某个key进行批量的数据处理: package com.company.concurrent.jdk8;import java.util.Array ...

  5. 遍历Map集合、修改Map集合中的value值

    Map集合是基于java核心类--java.util中的: Map集合用于储存元素对,Map储存的是一对键值(key和value),是通过key映射到它的value values(): 是获取集合中的 ...

  6. Map集合中的两种取出方式keySet和entrySet

    /*map集合中的两种取出方式:1.Set<k> keySet:将map集合中所有的键存入到Set集合,因为Set具备迭代器.所有可用迭代方式取出所有的键,再根据get方法,获取每一个键对 ...

  7. java map key是否存在_java中如何判断map集合中是否存在key

    有两种方法可以判断map集合中是否存在某个key. 方法1:直接使用java api提供的containsKey(): 方法2:循环遍历,逐个比较. java相关视频推荐:java视频 具体实现代码如 ...

  8. 根据key删除Map集合中的key-value映射

    一:在遍历Map时是不可以删除key-value映射的,如果根据key删除,如下: public static void main(String[] args) {Map<String,Obje ...

  9. java map移除key为空_Java实现过滤掉map集合中key或value为空的值示例

    本文实例讲述了Java实现过滤掉map集合中key或value为空的值.分享给大家供大家参考,具体如下: import java.util.Collection; import java.util.H ...

最新文章

  1. [转]各种编码ANSI、GB2312、GBK、GB18030、UNICODE以及UTF-8傻傻分不清!
  2. 白话Elasticsearch22- 深度探秘搜索技术之match_phrase_prefix实现search-time搜索推荐
  3. CSS3的绝对定位与相对定位
  4. 【Java多线程编程】典型的多线程同步例程
  5. uniapp对象怎么获取值_第65p,关于:生成器、迭代器与迭代对象(上)
  6. linux中用参数代替键盘输入,Linux终端中使用上一命令减少键盘输入
  7. redis中有key但是删不掉_分布式锁用 Redis 还是 Zookeeper
  8. rss 订阅实现-iOS版
  9. python随机图片api_抓取随机图片
  10. 反编译class文件并重新编译的方法
  11. 微信小程序入门4-扫普通二维码进入小程序、打开短链接进入小程序
  12. 小程序开发商可以在哪里接项目订单/有几种接单方式
  13. 小牛叔讲Python第11章:函数的高级用法以及匿名函数
  14. UA MATH563 概率论的数学基础1 概率空间4 实数域上的概率测度
  15. 写不出好的策划方案?大神手把手教你写策划
  16. 你以为的匿名评价,原来并没真的匿名
  17. 微信小程序选择地址填写详细地址定位地点
  18. 一心多用多线程-future-java线程中的异步执行
  19. Appium: Windows系统桌面应用自动化测试(二)
  20. java怎么强制回收某个对象_4、如何强制垃圾回收一个对象?(java)

热门文章

  1. 移动app手机物理键返回、后退、上一页面并重新加载页面数据
  2. 2019计算机考研各科目时间安排,2019考研时间安排
  3. 有什么高效的Windows笔记软件?3款优秀的笔记软件推荐!
  4. 天池大赛:街景字符编码识别——Part2:数据读取与数据扩增
  5. 计算神经科学简介~【整理自】类脑计算背后的计算神经科学框架
  6. 牛客网第九场多校联赛 E Music Game
  7. 微软Visio流程图软件,Visio流程图制作工具下载安装教程(1)
  8. 区块链概念及简单介绍
  9. [Django项目案例]搭建用户与商品后台管理系统
  10. OpenGL导入3DS专题