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

EasyExcel复杂表头数据导入

目录

    • 表头示例
    • 导入代码
    • 数据导出

表头示例

在这里插入图片描述

导入代码

    @Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener = new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet().doRead();}
@Slf4j
public class ItemExcelListener extends AnalysisEventListener<ImportItem> {/*** 定义100条数据存储一次,然后清理list,方便内存回收*/private static final int BATCH_COUNT = 300;/*** 记录导入的总记录数*/private Long listSize = 0L;/*** 缓存的数据*/private List<ImportItem> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);//标记处理第一行表头private boolean firstRowProcessed = true;private HashMap<Integer, HashMap<String,String>> dynamicInfoList;/*** 解析每一行表头数据时调用*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {// 读取表头数据并构造HashMapif (firstRowProcessed){HashMap<Integer, HashMap<String, String>> infoList = new HashMap<>();for (Map.Entry<Integer, String> entry : headMap.entrySet()){Integer key = entry.getKey();String value = entry.getValue();if (!Objects.equals(value, "固定数据")){infoList.put(key,null);}}dynamicInfoList = infoList;firstRowProcessed = false;}else {for (Map.Entry<Integer, String> entry : headMap.entrySet()){HashMap<String, String> info = new HashMap<>();Integer key = entry.getKey();String value = entry.getValue();if (dynamicInfoList.containsKey(key)){info.put(value,null);dynamicInfoList.replace(key,info);}}}}/*** 每解析一条数据都会调用一次*/@Overridepublic void invoke(ImportItem importItem, AnalysisContext analysisContext) {// 获取实体类中不匹配的数据ReadRowHolder readRowHolder = analysisContext.readRowHolder();Map<Integer, Cell> cellMap = readRowHolder.getCellMap();JSONObject dynamicInformation = new JSONObject();for (Map.Entry<Integer, Cell> entry : cellMap.entrySet()){Integer key = entry.getKey();Cell entryValue = entry.getValue();if (dynamicInfoList.containsKey(key)){String string = JSON.toJSONString(entryValue);JSONObject jsonObject = JSON.parseObject(string);String value = jsonObject.getString("stringValue");HashMap<String, String> info = dynamicInfoList.get(key);for (String attribute : info.keySet()) {dynamicInformation.put(attribute,value);}}}cachedDataList.add(importItem);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成后调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if (!cachedDataList.isEmpty()){saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}public void saveData(){//将数据存入数据库}}

数据导出

参考文章:EasyExcel动态复杂表头导出方法

http://www.lryc.cn/news/216417.html

相关文章:

  • 【Redis】Redis安装教程基本操作语法
  • spring-boot-autoconfigure.jar/META-INF/spring.factories介绍
  • vue3视频大小适配浏览器窗口大小
  • Nignx安装负载均衡动静分离以及Linux前端项目部署将域名映射到特定IP地址
  • Plist编辑软件 PlistEdit Pro mac中文版功能介绍
  • CSS3网页布局基础
  • 【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】
  • Vue3.0 this,ref , $parent,$root组件通信 :VCA
  • 天猫商品评论API接口(评论内容|日期|买家昵称|追评内容|评论图片|评论视频..)
  • redis数据库简介
  • 数据结构 - ArrayList - 动态修改的数组
  • python爬虫实战——今日头条新闻数据获取
  • ardupilot开发 --- gdb 篇
  • 在Vue项目中定义全局变量
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • 大促期间如何监测竞品数据
  • Linux yum 没有可用软件包 fping。 错误:无须任何处理 的解决办法
  • 人工智能与脑机接口:开启人机融合的新时代
  • 【多线程面试题二十二】、 说说你对读写锁的了解
  • Panda3d 相机控制
  • Linux(CentOS)安装MySQL教程
  • 使用 OpenSSL 工具撰写 Bash 脚本进行密码明文的加密与解密
  • uniapp之actionsheet 自定义组件
  • 在nodejs中使用Mongoose和MongoDB实现curd操作
  • 10.28 校招 实习 内推 面经
  • Azure 机器学习 - 使用无代码 AutoML 训练分类模型
  • 【调试技术】用户态查看PEB和TEB
  • 如何搭建一个Spring MVC和Vue3的应用程序
  • CSS3设计动画样式
  • AtCoder abc 144