使用Hutool的流方式读取Excel大文件

2023-11-04

官网介绍: 

在标准的ExcelReader中,如果数据量较大,读取Excel会非常缓慢,并有可能造成内存溢出。因此针对大数据量的Excel,Hutool封装了Sax模式的读取方式。

Excel07SaxReader支持Excel2007格式的Sax读取。

参考他人博客结合使用经验,总结如下工具类ExcelKit: (类完整代码如下)

package com.xxx.app.blog.common.kit;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.poi.excel.sax.Excel07SaxReader;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import java.util.*;

/**
 * ExcelKit excel文件处理库,依赖Hutool
 */
public class ExcelKit {

	private static List<Object> headLine;
	private static List<Map<String, Object>> datas = new ArrayList<>();

	/**
	 * @param pathAndName        文件路径
	 * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet
	 */
	public static List<Map<String, Object>> readBigExcel(String pathAndName, int idOrRidOrSheetName) {
		Console.log("【{}】 开始读取 ... ", pathAndName);
		datas.clear();
		Excel07SaxReader reader = new Excel07SaxReader(new MyRowHandler());
		reader.read(pathAndName, idOrRidOrSheetName);
		Console.log("【{}】 读取完成 ... ", pathAndName);
		return datas;
	}

	/**
	 * @param pathAndName        文件路径
	 * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet
	 * @param beanType           类类型
	 * @param <T>                返回值为List<T>
	 * @return
	 */
	public static <T> List<T> read(String pathAndName, int idOrRidOrSheetName, Class<T> beanType) {
		return read(pathAndName, idOrRidOrSheetName, beanType, Collections.EMPTY_MAP);
	}

	/**
	 * @param pathAndName        文件路径
	 * @param idOrRidOrSheetName Excel中的sheet id或者rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet
	 * @param beanType           类类型
	 * @param fieldMapping       T类型对应的别名,即类类型对应的 excel 的关系
	 * @param <T>                返回值为List<T>
	 * @return
	 */
	public static <T> List<T> read(String pathAndName, int idOrRidOrSheetName, Class<T> beanType, Map<String, String> fieldMapping) {
		CopyOptions copyOptions = CopyOptions.create();
		if (CollUtil.isNotEmpty(fieldMapping)) {
			copyOptions.setFieldMapping(fieldMapping);
		}
		readBigExcel(pathAndName, idOrRidOrSheetName);
		List<T> datalist = new ArrayList<>();
		for (Map<String, Object> data : datas) {
			T t = ReflectUtil.newInstanceIfPossible(beanType);
			datalist.add(BeanUtil.fillBeanWithMap(data, t, copyOptions));
		}
		return datalist;
	}

	private static class MyRowHandler implements RowHandler {
		@Override
		public void handle(int sheetIndex, long rowIndex, List<Object> rowList) {
			//Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowList);
			if (rowIndex == 0) {
				headLine = rowList;
			} else {
				Map<String, Object> tMap = new HashMap<>(rowList.size());
				for (int i = 0; i < rowList.size(); i++) {
					tMap.put(transStr(headLine.get(i)), rowList.get(i));
				}
				datas.add(tMap);
			}
		}
	}

	private static String transStr(Object obj) {
		return obj == null ? "" : obj.toString();
	}
}

调取使用方法:

//大数据量excel读取方式
List<Map<String,Object>> recordBMapList = null;
recordBMapList = ExcelKit.readBigExcel("文件路径",-1);
//第二个参数,-1代表读取全部sheet数据;0代表读取第一个sheet数据,依次类推;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Hutool的流方式读取Excel大文件 的相关文章

随机推荐

  • oracle导出后 ascii编码转utf-8问题

    1 在设置如下环境变量后 从oracle中导出的中文字符为乱码 export NLS LANG AMERICAN AMERICA ZHS16GBK 2 在Linux上用file i命令查看 编码格式如下 xy w2 backimage tx
  • Mybatis-plus动态条件查询QueryWrapper的使用

    Mybatis plus动态条件查询QueryWrapper的使用 一 queryWrapper介绍 queryWrapper是mybatis plus中实现查询的对象封装操作类 可以封装sql对象 包括where条件 order by排序
  • 【Shell牛客刷题系列】SHELL6 去掉空行:来学习字符转换工具——tr命令

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Linux 欢迎关注专栏 本文知识预告 首先学习了批量字符转换 压缩 删除的文本工具tr命
  • v-model的理解

    原理 1 展示 父组件v model 子组件接受一个props值value 将它展示到子组件自己的input上 2 改变 当子组件自身发生改变时 触发自身的input方法 然后触发父组件的事件方法 改变父组件的vaule 进而改变接受的pr
  • python作业(4)

    5 2 更多地条件测试 代码如下 str1 AAAA str2 BBBB str3 AAAA print str1 str2 str str1 str2 print str1 str3 str str1 str3 num1 10 num2
  • 蓝桥杯单片机14届记录 + 6-13届省赛代码+试题

    客观题 01 一个 8 位的 DAC 转换器 供电电压为 3 3V 参考电压 2 4V 其 1LSB 产生的输出电 压增量是 V A 0 0129 B 0 0047 C 0 0064 D 0 0094 02 IAP15F2K61S2 单片机
  • 编程实现古诗词填空

    编程实现古诗词填空登鹳雀楼 在屏募上品示 楼船 夜雪瓜洲渡 秋风大散关 请用户将缺失的汉宇 铁马 填入空白处 并在屏幕上显示完整的古诗词 楼船夜雪瓜洲渡 铁马秋风大散关
  • Java实现LRU算法

    文章目录 1 内存空间有限 当缓存满的时候 如何淘汰缓存 2 实现LRU demo 1 使用Java容器LinkedHashMap 2 哈希表 HashMap 双向链表 1 内存空间有限 当缓存满的时候 如何淘汰缓存 FIFO First
  • 【Linux】RPM软件包和Yum软件仓库、apt

    RPM 简介 RPM Package Manager RPM 包管理器 由红帽公司提出 Redhat SUSE 等系列采用 建立集中数据库 记录软件包安装 卸载等变化信息 分析软件包依赖关系 RPM 包 文件名特征 软件名 版本信息 操作系
  • 10种简单的Java性能优化学习

    10种简单的Java性能优化学习 你是否正打算优化hashCode 方法 是否想要绕开正则表达式 Lukas Eder介绍了很多简单方便的性能优化小贴士以及扩展程序性能的技巧 最近 全网域 Web Scale 一词被炒得火热 人们也正在通过
  • 多层目录编译的makefile文件编写

    一直想自己做一个目录结构稍复杂一点的makefile 看make的manual上写的有点不好理解 再从网上搜搜也没有发现比较好的教程 我是个搞工程的 懂点计算 也没有受过专业编程训练 对于一些技术不是很懂 有时想使用也会不知到如何下手 找不
  • Mysql 管理

    目录 0 课程视频 1 系统数据库 gt 安装完mysql gt 自带四个数据库 2 常用工具 gt 写脚本用 2 1 mysql 客户端工具 2 2 mysqladmin 2 3 mysqlbinlog gt 二进制日志 gt 运维讲解
  • UI架构相关

  • 锐捷网管系统漏洞利用分析

    利用此漏洞可获取后台密码 现在复现 1 fofa搜索 title RG UAC登录页面 body admin 2 现在 查看源代码 向下拉看到这个 就是密码 3 MD5解密 登录成功
  • SpringBoot配置双数据源(一个项目同时连接操作两台数据库)

    前言 近期公司要上线3 0版本 需要将2 0的数据迁移到3 0中继续沿用 由于3 0的数据库相比2 0 的数据库改动很大 最主要的是2 0数据库的主键为自然数自增主键 而3 0数据库的主键为UUID2 所以只能使用程序动态迁移 声明 本教程
  • ROS中的Navigation

    ROS中的Navigation 1 Navigation Stack的核心就是move base 2 move base的三个功能 全局规划 静态 局部规划 动态 处理异常行为 有三个接口 3 costmap 代价地图 是move base
  • 第三次C语言课程设计作业

    上节课我们学习了文件型指针的运用 这节课我们则学习了变量型指针和链表的学习的使用 还了解了free函数 malloc函数的应用 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同 只是将其指向类型定义为结构体类型即可 例如 st
  • Eclipse 常用快捷键

    常用的 编辑 Ctrl 1 快速修复 解决很多问题 比如import类 try catch包围等 Ctrl Shift F 格式化当前代码 Ctrl Shift M 添加类的import导入 Ctrl Shift O 组织类的import导
  • 时间序列分析之ARIMA模型预测__R篇

    相关文章 时间序列分析之ARIMA模型预测 SAS篇 之前一直用SAS做ARIMA模型预测 今天尝试用了一下R 发现灵活度更高 结果输出也更直观 现在记录一下如何用R分析ARIMA模型 1 处理数据 1 1 导入forecast包 fore
  • 使用Hutool的流方式读取Excel大文件

    官网介绍 在标准的ExcelReader中 如果数据量较大 读取Excel会非常缓慢 并有可能造成内存溢出 因此针对大数据量的Excel Hutool封装了Sax模式的读取方式 Excel07SaxReader支持Excel2007格式的S