IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 使用Hutool的流方式读取Excel大文件 -> 正文阅读

[开发测试]使用Hutool的流方式读取Excel大文件

官网介绍:?

在标准的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数据,依次类推;

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 19:07:17  更:2022-04-22 19:08:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/19 13:25:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码