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

easyExcel 获取多个sheet中复杂表头的数据

easyExcel 获取多个sheet中复杂表头的数据

easyExcel 解释

EasyExcel是一个强大且易于使用的Java库,用于简化Excel文件的读写操作。它是阿里巴巴开源的一个基于POI实现的Excel处理工具,并提供了一组简单的API来处理Excel文件,包括读取、写入和转换。

EasyExcel的特点包括:

易于使用:EasyExcel提供了简单而直观的API,使得读取、写入和转换Excel文件变得容易。可以通过少量的代码实现复杂的Excel文件操作。

大数据量处理:EasyExcel对大数据量的处理进行了优化,支持高效读取和写入大型Excel文件,减少内存消耗和处理时间。

支持多种数据转换:EasyExcel支持将Excel文件与Java对象之间进行相互转换,可以方便地将Excel数据映射到Java对象,也可以将Java对象转换为Excel文件。

丰富的功能:EasyExcel提供了丰富的功能,包括支持读取和写入不同格式的Excel文件(例如xls和xlsx),支持读取和写入多个sheet,支持读取和写入复杂的Excel表头,支持数据校验等。

使用EasyExcel进行Excel操作通常包括以下步骤:

读取Excel文件:使用EasyExcel提供的API读取Excel文件,并将读取的数据映射到Java对象。

写入Excel文件:使用EasyExcel提供的API将Java对象数据写入Excel文件。

数据转换:使用EasyExcel提供的转换器功能,将Excel数据和Java对象之间进行相互转换。

总之,EasyExcel是一个功能强大且易于使用的Excel处理工具,它可以帮助开发人员更轻松地处理Excel文件,减少了代码量和开发时间。无论是处理大数据量还是进行数据转换,EasyExcel都是一个很好的选择。

实体

 @Data
public class HermalPowerRnterpriseVO {// index为excel中指定列(从0开始)@ExcelProperty(value = "名称", index = 0)private String name;
}

业务代码

    @Overridepublic void importData(MultipartFile file) {//初始化实体Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = initializeSheetMap();Map<Class<?>, List<Object>> entityMap = initializeEntityMap(sheetMap);//声明并初始化inputStreamtry (InputStream inputStream = file.getInputStream()) {// 读取excelList<ReadSheet> readSheetList = EasyExcel.read(inputStream).build().excelExecutor().sheetList();for (ReadSheet readSheet : readSheetList) {//读取特定Excel表格try (InputStream sheetInputStream = file.getInputStream()) {AbstractMap.SimpleEntry<Integer, Class<?>> sheetInfo = sheetMap.get(readSheet.getSheetName());if (sheetInfo != null) {readSheet(sheetInputStream, sheetInfo.getKey(), sheetInfo.getValue(), entityMap.get(sheetInfo.getValue()));}} catch (Exception e) {e.printStackTrace();}}// 输出读到的内容for (Map.Entry<Class<?>, List<Object>> entry : entityMap.entrySet()) {log.info(entry.getKey().getSimpleName() + ": " + JSON.toJSONString(entry.getValue()));}} catch (IOException e) {e.printStackTrace();}}/*** 初始化sheet内容* XXX 为sheet的名称,0,1,2,3为指定的sheet下表*/private Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> initializeSheetMap() {Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = new HashMap<>(16);sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(0, LoadVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(1, HermalPowerRnterpriseVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(2, HydropowerEnterpriseVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(3, CentralizedSceneryVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(4, NewEnergyStorageVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(5, PowerAggregatorVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(6, LoadAggregatorVO.class));sheetMap.put("XXX", new AbstractMap.SimpleEntry<>(7, AggregateBodyVO.class));return sheetMap;}/*** 初始化entity内容*/private Map<Class<?>, List<Object>> initializeEntityMap(Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap) {Map<Class<?>, List<Object>> entityMap = new HashMap<>(16);for (Class<?> clazz : sheetMap.values().stream().map(AbstractMap.SimpleEntry::getValue).distinct().toArray(Class<?>[]::new)) {entityMap.put(clazz, new ArrayList<>());}return entityMap;}/*** 获取sheet数据*/private void readSheet(InputStream inputStream, Integer sheetNum, Class<?> clazz, List<?> dataList) {EasyExcel.read(inputStream, clazz, new EasyExcelVOListener(dataList))//sheetNum为获取第几个sheet的数据.sheet(sheetNum)// 跳过表头.headRowNumber(2).doRead();}

优化2.0

问题:版本1.0会生成临时文件(这是因为EasyExcel的底层,它使用了ZipFile来处理Excel文件,而未正确关闭ZipFile可能会导致资源泄漏),程序会走垃圾清除:Cleaning up unclosed ZipFile for archive
解决:使用 EasyExcel.read()方法的另一个重载,以关闭自动生成的临时文件。使用 ExcelReader 对象来替代
EasyExcel.read().build().excelExecutor().sheetList(),然后在 finally 块中调用 excelReader.finish() 来关闭和删除临时文件。

临时文件问题代码

 List<ReadSheet> readSheetList = EasyExcel.read(inputStream).build().excelExecutor().sheetList();
    @Overridepublic void importData(MultipartFile file) {//初始化excel实体Map<String, AbstractMap.SimpleEntry<Integer, Class<?>>> sheetMap = initializeSheetMap();Map<Class<?>, List<Object>> entityMap = initializeEntityMap(sheetMap);ExcelReader excelReader = null;//声明并初始化inputStreamtry (InputStream inputStream = file.getInputStream()) {excelReader = EasyExcel.read(inputStream).build();// 读取excelList<ReadSheet> readSheetList = excelReader.excelExecutor().sheetList();for (ReadSheet readSheet : readSheetList) {//读取特定Excel表格try (InputStream sheetInputStream = file.getInputStream()) {AbstractMap.SimpleEntry<Integer, Class<?>> sheetInfo = sheetMap.get(readSheet.getSheetName());if (sheetInfo != null) {readSheet(sheetInputStream, sheetInfo.getKey(), sheetInfo.getValue(), entityMap.get(sheetInfo.getValue()));}} catch (Exception e) {e.printStackTrace();}}// 输出读到的内容for (Map.Entry<Class<?>, List<Object>> entry : entityMap.entrySet()) {log.info(entry.getKey().getSimpleName() + ": " + JSON.toJSONString(entry.getValue()));}} catch (IOException e) {e.printStackTrace();}finally {if (excelReader != null) {excelReader.finish();}}}

相关文章:

  • 2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷①
  • MySQL语法及IDEA使用MySQL大全
  • SpringBoot整合Knife4j
  • Linux信号处理浅析
  • Kubernetes WebHook 入门 -- 入门案例: apiserver 接入 github
  • Flyio封装API接口(uniapp开发微信小程序)
  • linux(ubuntu)中drontab定时器命令详解
  • MySQL之导入导出远程备份(详细讲解)
  • 在VS Code中安装Copilot与安装其他扩展的方法一样,只需简单几步
  • Filter Options in Select Field
  • BERT Intro
  • 图像中部分RGB矩阵可视化
  • JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制
  • [VSCode] VSCode 常用快捷键
  • Java设计模式-访问者模式
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 5、React组件事件详解
  • Cumulo 的 ClojureScript 模块已经成型
  • HTML5新特性总结
  • JavaScript服务器推送技术之 WebSocket
  • JS基础之数据类型、对象、原型、原型链、继承
  • laravel5.5 视图共享数据
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue--为什么data属性必须是一个函数
  • Yii源码解读-服务定位器(Service Locator)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 从0到1:PostCSS 插件开发最佳实践
  • 将回调地狱按在地上摩擦的Promise
  • 排序算法之--选择排序
  • 判断客户端类型,Android,iOS,PC
  • 七牛云假注销小指南
  • 前端相关框架总和
  • 首页查询功能的一次实现过程
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 携程小程序初体验
  • 学习HTTP相关知识笔记
  • 转载:[译] 内容加速黑科技趣谈
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 大数据全解:定义、价值及挑战
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (转)为C# Windows服务添加安装程序
  • .Net Core和.Net Standard直观理解
  • .net 提取注释生成API文档 帮助文档
  • .NET单元测试
  • .NET关于 跳过SSL中遇到的问题
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • 。Net下Windows服务程序开发疑惑