SpringBoot结合easyexcel处理Excel文件

原创/朱季谦

假如有这样一个需求,每天需要读取以下表头的Excel文件,统计文件里击中黑名单的比例,该文件is_blacklist列的1表示击中了黑名单,0表示未击中黑名单。

image

基于该需求,可以在定时任务通过easyexcel工具进行处理。

一、首先需要在SpringBoot引入easyexcel的maven依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>

二、定义一个接收Excel文件表头列数据的Java Bean——

@Data@NoArgsConstructor@AllArgsConstructor@EqualsAndHashCodepublic class BlackTitle {@ExcelProperty(value = {"key"})private String key;@ExcelProperty(value = {"is_blacklist"})private String is_blacklist; }

这注解@ExcelProperty是easyexcel包的注解,起到的作用是,例如可以将private String key通过 @ExcelProperty(value = {"key"})映射到表格的key值。简单理解,就是每一个BlackTitle对象,能接收到表格每一行到数据,表格的key列值映射到BlackTitle的熟悉key值,表格的is_blacklist列值映射到BlackTitle的熟悉is_blacklist值。

三、继承EasyExcel 框架中的 AnalysisEventListener 接口的类 BlackTitleListener,用于监听并处理 Excel 文件中的数据行。

当EasyExcel解析每一行数据时,这个invoke 方法就会被调用,该BlackTitleListener类里的重写方法实现将当前读取的行数据添加到 data 列表中。该类最后提供了一个 getData() 方法,用于返回解析出来的数据列表,即集合data——

public static class BlackTitleListener extends AnalysisEventListener<BlackTitle> {private List<BlackTitle> data = new ArrayList<>();@Overridepublic void invoke(BlackTitle blackTitle, AnalysisContext analysisContext) {data.add(blackTitle);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}public List<BlackTitle> getData(){return data;}}

四、实现读取Excel文件的sheet表格——

String source = "C:\\Users\\Admin\\Desktop\\blacklist.xlsx";
BlackTitleListener listener = new BlackTitleListener();
//读取 Excel 文件的第一个 sheet 中的数据,并将其转换成 BlackTitle 对象,最终存储在 listener 对象中。
EasyExcel.read(source,listener).head(BlackTitle.class).sheet(0).headRowNumber(1).doReadSync();

这里创建一个名为 listener 的 BlackTitleListener 对象,在该对象里,可以监听读取每一行数据的操作。调用EasyExcel.read(...) 方法去读取Excel文件,通过 .head(BlackTitle.class) 设置表头信息,即将表头字段映射到BlackTitle类里属性。通过 .sheet(0) 指定要读取第一个sheet表格数据。.headRowNumber(1) 表示表头位于第一行(索引从 0 开始)。.doReadSync() 方法开始同步读取 Excel 数据,然后将数据存储到 listener 对象中。

五、获取读取存储到集合里的数据进行处理

获取读取到集合里的数据——

List<BlackTitle> data = listener.getData();

接下来,就可以通过简单的集合迭代来统计出表格is_blacklist列值为1的比例了——

 long blackSize = data.stream().filter(k->k.getIs_blacklist().equals("1")).count();

最后,完整代码如下——

public class BlackTitleTest {public static void main(String[] args) {String source = "C:\\Users\\Admin\\Desktop\\blacklist.xlsx";BlackTitleListener listener = new BlackTitleListener();EasyExcel.*read*(source,listener).head(BlackTitle.class).sheet(0).headRowNumber(1).doReadSync();List<BlackTitle> data = listener.getData();long blackSize = data.stream().filter(k->k.getIs_blacklist().equals("1")).count();}public static class BlackTitleListener extends AnalysisEventListener<BlackTitle> {private List<BlackTitle> data = new ArrayList<>();@Overridepublic void invoke(BlackTitle blackTitle, AnalysisContext analysisContext) {data.add(blackTitle);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}public List<BlackTitle> getData(){return data;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238543.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过adb命令查看当前界面的Activity

1、先进入shell 2、输入如下命令 dumpsys activity | grep "mFoc"执行效果如下&#xff1a; 从上图可以看到当前正在运行app的进程名称和当前显示的Activity完整路径类名。

Spring AOP 代码案例

目录 AOP组成 通知的具体方法类型 引入Spring AOP依赖 定义AOP层 UserController Postman测试 AOP工作流程 AOP组成 切面 : 切⾯&#xff08;Aspect&#xff09;由切点&#xff08;Pointcut&#xff09;和通知&#xff08;Advice&#xff09;组成&#xff0c;它既包含了…

第九节HarmonyOS 常用基础组件-Text

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

DynamicDataSource

DynamicDataSource 多数据源&#xff0c;读写分离&#xff0c;主从数据库

单片机实验(三)

前言 实验一&#xff1a;利用定时器T1的中断控制P1.7引脚输出音频信号&#xff0c;启动蜂鸣器发出一段熟悉的与众不同的具有10个音节的音乐音频。 实验二&#xff1a;使用定时器/计数器来实现一个LCD显示年、月、日、星期 、时、分、秒的电子表&#xff0c;要求时和分可以方便…

震坤行:数字驱动食品农副行业采购的新兴趋势与实践

震坤行&#xff1a;数字驱动食品农副行业采购的新兴趋势与实践 近年来消费者对于营养价值和健康的追求日益凸显&#xff0c;促使各类有机食品、低糖低脂食品、素食等健康食品受到热烈追捧。同时&#xff0c;以往单一的产品也被各家企业“卷”出了个性化&#xff0c;光是卖水&a…

vue实现数字千分位格式化 如6,383,993,037,937.463

1.封装文件&#xff1a;numberToCurrency.js /**实现数字千分位格式化 如6,383,993,037,937.463 */ export function numberToCurrencyNo(value) {if (!value) return 0// 获取整数部分const intPart Math.trunc(value)// 整数部分处理&#xff0c;增加,const intPartFormat …

WSL2+tensorflow-gpu 2.3.0 C++ 源码编译

wsl2已有gcc 版本为9.4.0&#xff0c;但tensorflow2.3.0需对应gcc7.3.1 tensorflow与cuda cudnn python bazel gcc版本对应关系 故需下载一个低版本的gcc&#xff0c;但同时还想保留较高版本的gcc&#xff0c;那么参考文章&#xff1a;深度学习环境搭建(二): Ubuntu不同版本g…

附录A 指令集基本原理

1. 引言 本书主要关注指令集体系结构4个主题&#xff1a; 1. 提出对指令集进行分类的方法&#xff0c;并对各种方法的优缺点进行定性评估&#xff1b; 2. 提出并分析一些在很大程度上独立于特定指令集的指令集评估数据。 3. 讨论语言与编译器议题以及…

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践(一)

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践 Power Pages 网页搭建 微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践1、Power Pages 介绍2、开始创建一个站点3、选择一个合适的模板4、编辑我们的模板5、面向专业开发人员的高级开发功能6、预览…

完美的输出打印 SQL 及执行时长[MyBatis-Plus系列]

导读 Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 在我们日常开发工作当中,避免不了查看当前程序所执行的SQL语句,以及了解它的执行时间,方便分析是否出现了慢SQL问题。 MyBatis-Plus提供了两种SQL分析打印的方式,用于输出每条SQL语句及其执行时间,针…

【开源】基于JAVA的大病保险管理系统

项目编号&#xff1a; S 031 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S031&#xff0c;文末获取源码。} 项目编号&#xff1a;S031&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大…