easyexcel导入简单封装
文章目录
- 1 场景
- 2 版本
- 3 maven依赖
- 4 代码
- 4.1 数据处理器接口
- 4.2 工具类
- 5 使用
- 5.1 测试代码
- 5.2 输出内容
1 场景
本文主要对EasyExcel
的功能进行简单封装,实现我们在读取excel
中的简单操作。
实现以下功能,能满足大多数情况下的Excel文件读取(03版本、07版本+大数据量导入):
(1)获取列索引对应表头
(第一行为表头),获取表头主要用于判断
(2)以字符串
的形式获取单元格内容
,形式为(列号,单元格内容)
2 版本
EasyExcel:2.2.7
3 maven依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version>
</dependency>
4 代码
4.1 数据处理器接口
读取每xxx条
(默认1000条)数据,调用一次数据处理接口
package com.sa.example.easyexcel.util;import java.util.List;
import java.util.Map;/*** 数据处理器*/
public interface BaseProcessor {/*** 回调方法* @param list*/void invoke(List<Map<Integer,String>> list);
}
4.2 工具类
(1)工具类方法说明如下:
- 读取excel表头
// 读取前多少条的表头(第一行数据),封装到List<String>中返回
public static List<String> getExcelHead(InputStream inputStream, Integer headSize);
// 获取所有有内容的表头数据
public static List<String> getExcelHead(InputStream inputStream);
- 读取excel数据
// 读取1000条数据后,调用一次数据处理器BaseProcessor
public static long readData(InputStream inputStream, BaseProcessor baseProcessor);
// 读取指定条数据batchSize,调用一次数据处理器BaseProcessor
public static long readData(InputStream inputStream, BaseProcessor baseProcessor, final Integer batchSize);
(2)完整工具类代码如下:
package com.sa.example.easyexcel.util;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;/*** Excel工具类*/
public class ExcelUtil {/*** 行号索引*/public static final Integer ROW_NUMBER_INDEX = -1;private ExcelUtil() {}/*** 读取Excel表头* @param inputStream 输入流* @param headSize excel表头个数(指定返回的个数)* @return*/public static List<String> getExcelHead(InputStream inputStream, Integer headSize) {List<String> excelHeadList = getExcelHead(inputStream);if (headSize != null && headSize > 0 && CollectionUtils.isNotEmpty(excelHeadList) && excelHeadList.size() >= headSize) {return excelHeadList.subList(0, headSize);}return excelHeadList;}/*** 读取Excel表头* @param inputStream 输入流* @return excel表头*/public static List<String> getExcelHead(InputStream inputStream) {// 表头名称列表final List<String> headList = new ArrayList<>();//继续执行标志final AtomicBoolean execFlag = new AtomicBoolean(true);EasyExcel.read(inputStream, new AnalysisEventListener<Map<Integer, String>>() {@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {if (MapUtils.isNotEmpty(headMap)) {for (Map.Entry<Integer, String> entry : headMap.entrySet()) {headList.add(entry.getValue());}}// 终止读取execFlag.set(false);}@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {// Do nothing}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// Do nothing}@Overridepublic boolean hasNext(AnalysisContext context) {return execFlag.get();}}).sheet().doRead();return headList;}/*** 读取数据 (默认1000)* @param inputStream 文件流* @param baseProcessor 自定义处理器* @return 读取数据总数量*/public static long readData(InputStream inputStream, BaseProcessor baseProcessor) {return readData(inputStream, baseProcessor, 1000);}/*** 读取数据* @param inputStream 文件流* @param baseProcessor 处理器* @param batchSize 单批次处理数量* @return 读取数据总数量*/public static long readData(InputStream inputStream, BaseProcessor baseProcessor, final Integer batchSize) {// 数据行数final AtomicLong dataCount = new AtomicLong(0L);EasyExcel.read(inputStream, new AnalysisEventListener<Map<Integer, String>>() {/*** 缓存集合*/private List<Map<Integer, String>> list = new ArrayList<>(batchSize);/*** 当前行号*/private Integer lineNumber = 1;@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {lineNumber++;// 记录总行数dataCount.addAndGet(1);if (list.size() >= batchSize) {// 批量执行任务if (baseProcessor != null) {baseProcessor.invoke(list);}// 清除缓存list.clear();} else {// 记录行号data.put(ROW_NUMBER_INDEX, String.valueOf(lineNumber));// 写入缓存表list.add(data);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if (baseProcessor != null) {baseProcessor.invoke(list);}}}).sheet().doRead();return dataCount.get();}}
5 使用
使用到的excel文件《电话区域表.xlsx》如下:
5.1 测试代码
这里设定,每读取6条记录,执行一次
数据处理。
// 声明要读取的文件
File file = new File("D:\\电话区域表.xlsx");// ==========【一、读取表头】==========
final List<String> headList = new ArrayList<>();
try (InputStream inputStream = new FileInputStream(file)) {headList.addAll(ExcelUtil.getExcelHead(inputStream));System.out.println("获取表头:" + headList + "\n");
} catch (Exception e) {e.printStackTrace();
}// ==========【二、读取文件内容】==========
try (InputStream inputStream = new FileInputStream(file)) {long readDataCount = ExcelUtil.readData(inputStream, list -> {System.out.println("----------开始调用数据处理----------");// 持久化存储List<Map<String, Object>> dbDataMapList = new ArrayList<>();int headSize = headList.size();for (Map<Integer, String> dataMap : list) {Map<String, Object> dbDataMap = new HashMap<>(headSize + 1);// 行号dbDataMap.put("行号", Integer.valueOf(dataMap.get(ExcelUtil.ROW_NUMBER_INDEX)));// 导入数据for (int i = 0; i < headSize; i++) {dbDataMap.put(headList.get(i), dataMap.get(i));}System.out.println("获取数据:" + dbDataMap);}}, 6);System.out.println("\n----------读取数据总数量:" + readDataCount + "----------");
} catch (Exception e) {e.printStackTrace();
}
5.2 输出内容
获取表头:[前缀号段, 手机所在省份, 手机所在城市, 服务商]----------开始调用数据处理----------
获取数据:{前缀号段=1300000, 手机所在城市=济南, 行号=2, 手机所在省份=山东, 服务商=中国联通}
获取数据:{前缀号段=1300001, 手机所在城市=常州, 行号=3, 手机所在省份=江苏, 服务商=中国联通}
获取数据:{前缀号段=1300002, 手机所在城市=巢湖, 行号=4, 手机所在省份=安徽, 服务商=中国联通}
获取数据:{前缀号段=1300003, 手机所在城市=宜宾, 行号=5, 手机所在省份=四川, 服务商=中国联通}
获取数据:{前缀号段=1300004, 手机所在城市=自贡, 行号=6, 手机所在省份=四川, 服务商=中国联通}
获取数据:{前缀号段=1300005, 手机所在城市=西安, 行号=7, 手机所在省份=陕西, 服务商=中国联通}
----------开始调用数据处理----------
获取数据:{前缀号段=1300007, 手机所在城市=西安, 行号=9, 手机所在省份=陕西, 服务商=中国联通}
获取数据:{前缀号段=1300008, 手机所在城市=武汉, 行号=10, 手机所在省份=湖北, 服务商=中国联通}
获取数据:{前缀号段=1300009, 手机所在城市=西安, 行号=11, 手机所在省份=陕西, 服务商=中国联通}----------读取数据总数量:10----------
easyexcel导入简单封装相关推荐
- EasyExcel 导入导出封装工具
封装 ExcelExportUtil.java import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection. ...
- 【使用EasyExcel导入导出】
使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...
- easyExcel导入表格
easyExcel导入表格 本文章是介绍java,通过easyExcel导入较为复杂的表格 导入表格如下 前提工作导包 <!-- hutool--><dependency>&l ...
- Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!
欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...
- Spring Boot + EasyExcel 导入导出,好用到爆!
今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...
- Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
Spring JDBC * Spring框架对JDBC的简单封装.提供了一个JDBCTemplate对象简化JDBC的开发 * 步骤: 1. 导入jar包 ...
- Java对接腾讯IM以及一些方法的简单封装
一. 腾讯IM快速入门 1. 注册腾讯云账号,找到即时通信IM控制台 腾讯IM控制台:https://console.cloud.tencent.com/im 2. 创建即时通信应用 3. 进到应用里 ...
- uniapp简单封装的激励广告和插屏广告
挺久没更新公众号了,今天给大家写一个uniapp简单封装的激励广告和插屏广告的教程,主要的解决的问题就是如果一个小程序页面多且需要调用的广告也比较多,这样会导致出现许多的重复代码,而且使得页面js文件 ...
- EasyExcel的简单读取操作
EasyExcel的简单读取操作 Java领域解析.生成Excel比较有名的框架有Apache poi. jxl等.但他们都存在一个严重的问题就是 非常的耗内存.如果你的系统并发量不大的话可能还行,但 ...
最新文章
- 2022-2028年中国出版业投资分析及前景预测报告(全卷)
- 活动目录(Active Directory)安装
- css电子商务管理_从毕业生的角度看电子商务专业
- 李开复:AI行业正在回归商业本质,技术公司要有服务心态落地为王 | MEET2020
- tab-pane 怎么家点击事件_想起爆款?怎么样去打造一个人见人点的爆款主图?
- Asp将查询结果导出到excel里
- 一天搞定HTML----标签类型与类型转换05
- Springboot学习问题记录
- 促进儿童语言发展的方法
- Android uevent
- CAS项目部署和基础操作
- Docker系列三~docker安装nginx
- win10鼠标灵敏度怎么调_和平精英灵敏度怎么设置才最合适 调最适合自己用的
- Python机器学习:PCA与梯度上升03求数据的主成分PCA
- 【HTML+CSS网页设计与布局 从入门到精通】第7章-class、ID选择器,CSS格式
- Android 存储学习之保存系统短信到SD卡(使用XML序列化器)
- XP系统优化超简单实用版
- altium怎么锁定_在AD软件中的锁定与解锁命令应该如何使用?
- Android 开发的五大开源网站
- thinkcmf:Cannot redeclare cmf_get_date() (previously declared in
热门文章
- SYSTEM INSTRUCTIONS | 系统指令
- Three Memory Management Models
- Linux开机启动过程(14):start_kernel()->sched_init()调度器初始化
- 2021年三月中旬推荐阅读文章
- 为什么Linux内核常用unsigned long来代替指针
- tomcat虚拟盘符映射
- 快速搭建dajango框架
- java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
- idea java 非法字符_IDEA提示非法字符,你不懂的UTF-8
- 幼儿园小班上计算机课 作业内容是手口一致,小班幼儿手口不能一致的点数怎么办...