Easyexcel读取单/多sheet页

news2024/12/28 11:24:46

Easyexcel读取单/多sheet页

此文档会说明单个和多个的sheet页的读取方法,包括本人在使用过程中的踩坑点。

依赖不会的自行百度导入,话不多说,直接上干货。以下示例基于2.x,新版本基本类似

1、创建实体

实体是用来接收对应列的数据的,官方文档中说明了可以用列号和列名进行指定

@Data
public class DemoExcelVO {

    @ExcelIgnore
    private String idNo;

    @ExcelProperty(value = "工时类型")
    private String workType;

    @ExcelProperty(index = 3)
    private String deliveryPhase;

    @ExcelIgnore
    private Integer orderBy;

    @ExcelIgnore
    private String workTypeEmptyColumn;

    @ExcelIgnore
    private String column;
}

创建实体如上所示,workType字段就是按照列名进行读取,deliveryPhase则是按照列号进行读取,更推荐使用列名指定,避免列的顺序出现变动影响读取数据的准确性。

需要特别注意,文档中多余的字段需要使用@ExcelIgnore进行标注,或者干脆不要写在这个实体内,接受完数据后自己去转对应的实体VO或者DTO。

读取excel文件

读取的方式有两种,

1、使用匿名内部类

如果是单个sheet页可以使用匿名内部类,这样就可以不用额外去写一个DemoDataListener。示例如下:

EasyExcel.read(inputStream, DemoExcelVO.class, new AnalysisEventListener<DemoExcelVO>() {
    
    // 存放列数据
	List<DemoExcelVO> dataList = new ArrayList<>();
    
    /**
     * 这里会一行行的返回头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
        // 这里是接收表头的,默认为第一行为表头,多行表头建议使用下面的第二种方法读excel
        Map<Integer, String> map = ConverterUtils.convertToStringMap(headMap, context);
        List<String> headNames = new ArrayList<>(map.values());
        // 这里可以做一些表头的校验之类的逻辑
        /** 逻辑处理
         * ....
         */
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(DemoExcelVO data, AnalysisContext context) {
        // 它会按照你提供的实体对象一行一行的对应赋值,每读取一行就会进入一次这个方法,所以这个方法可以处理单行的数据逻辑,最后添加到list中
        /** 逻辑处理
         * ....
         */
        // 添加到list中
        dataList.add(data);
    }

    /**
     * 将解析的数据缓存入redis,过期时间为第二天结束
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 上面把每一行的数据读取完之后,就会进入到这个方法,一般是处理dataList的数据
        /** 逻辑处理
         * ....
         */
    }
}).sheet().doRead();

2、写读的监听器

这里有讲究,因为有两种实现,可以实现ReadListener接口,也可以继承AnalysisEventListener,下面我们一起看看有什么不同。

1、实现ReadListener接口

public class DemoListener implements ReadListener {
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        
    }

    @Override
    public void invoke(Object data, AnalysisContext context) {

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }

    @Override
    public boolean hasNext(AnalysisContext context) {
        return false;
    }

    @Override
    public void invokeHead(Map headMap, AnalysisContext context) {

    }
}

这里我就不一一对类进行说明了,可以基本和我上面的匿名内部类说明逻辑相似。

有坑!这个地方要注意,如果我们是直接实现的ReadListener然后快捷键按出来的具体实现方法,如下:

请添加图片描述

默认的话是会全选的,那么出来就是上面我给的代码那样子。问题就是出在**hasNext()**这个方法,这里我也没去深究,但是如果你默认不去更改,return false的话是无法读取到数据的。借用一下别人的说明:hasNext()这个方法是如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。所以循环会一直下去。

因此我们要记得把这个hasNext()调整为true,或者直接把这个方法干掉!

2、继承AnalysisEventListener

public class DemoListener extends AnalysisEventListener {

    @Override
    public void invoke(Object data, AnalysisContext context) {

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }
}

需要重写的方法只有两个,分别是针对每行数据的处理和对最后结果的处理,如果数据简单推荐用继承AnalysisEventListener去实现监听器,没啥坑。

下面是针对本次demo的具体实现:

Listener类:

public class DemoListener implements ReadListener {

    // 存放列数据
    @Getter
    private final List<DemoExcelVO> dataList = new ArrayList<>();

    /**
     * 这里会一行行的返回头
     *
     * @param headMap
     * @param context
     */
    @Override
    public void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context) {
        // 这里是接收表头的,默认为第一行为表头,多行表头建议使用下面的第二种方法读excel
        Map<Integer, String> map = ConverterUtils.convertToStringMap(headMap, context);
        List<String> headNames = new ArrayList<>(map.values());
        // 这里可以做一些表头的校验之类的逻辑
        /** 逻辑处理
         * ....
         */
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(DemoExcelVO data, AnalysisContext context) {
        // 它会按照你提供的实体对象一行一行的对应赋值,每读取一行就会进入一次这个方法,所以这个方法可以处理单行的数据逻辑,最后添加到list中
        /** 逻辑处理
         * ....
         */
        // 添加到list中
        dataList.add(data);
    }

    /**
     * 将解析的数据缓存入redis,过期时间为第二天结束
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 上面把每一行的数据读取完之后,就会进入到这个方法,一般是处理dataList的数据
        /** 逻辑处理
         * ....
         */
    }

    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
		// 这里是异常的处理,可以选择抛出自定义的异常。
    }

    @Override
    public boolean hasNext(AnalysisContext context) {
        return true;
    }
}

业务方法:

public void demoImport(MultipartFile file) {
        ExcelReader excelReader;
        try (InputStream inputStream = file.getInputStream()) {
            excelReader = EasyExcel.read(inputStream).build();
        }
        catch (IOException e) {
            throw new EdmpRuntimeException("文件流读取错误!");
        }
        if (excelReader == null) {
            throw new EdmpRuntimeException("文件流读取错误!");
        }
        // 读取Sheet页数据,如果是多个sheet页面需要多个Listener,比如readSheet1、readSheet2
        DemoListener demoListener = new DemoListener();
        ReadSheet readSheet = EasyExcel
                .readSheet("demo")
                .head(DemoExcelVO.class)
                .registerReadListener(demoListener)
                .build();
        excelReader.read(readSheet);
    	// 获取数据
		List<DemoExcelVO> dataList = demoListener.getDateList()
        /*
          处理业务
         */
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机找不到vcruntime140_1.dll文件的解决方法,完美解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到vcruntime140_1.dll。这些动态链接库文件是程序运行所必需的&#xff0c;一旦缺失&#xff0c;就会导致程序无法正常运行。但是不用担心&#xff0c;下面我将为大家介绍5个解决方法&am…

【STM32】I2C通信

基本的任务是&#xff1a;通过通信线&#xff0c;实现单片机读写外挂模块寄存器的功能。其中至少要实现在指定位置写寄存器和在指定的位置读寄存器这两个功能。 1 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线 两根通信线&#x…

Ubuntu 常用命令之 less 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 less命令是一个在Unix和Unix-like系统中用于查看文件内容的命令行工具。与more命令相比&#xff0c;less命令提供了更多的功能和灵活性&#xff0c;例如向前和向后滚动查看文件&#xff0c;搜索文本&#xff0c;查看长行等。 les…

用VS Code修改源代码的编码格式

用VS Code打开一个编码格式为GB2312的源代码文件&#xff0c;中文部分显示为乱码 这是因为VS Code默认解码格式为UTF-8 此时我们点击上面红框这个位置&#xff0c;命令面板弹出两个选项&#xff0c;选择通过编码重新打开 可以看到VS Code已经猜测出该文件就是GB 2312编码的…

卡通动漫AI绘画视频风格化AI智能PR插件StyleX免费下载

带有AI的视频风格化工具PR AI智能绘画插件。将视频转换为卡通、绘图、绘画、半色调和许多其他风格。 性能高度依赖GPU&#xff0c;一些旧的GPU卡&#xff08;2012年之前&#xff09;不受支持。 StyleX是一款先进的视频风格化工具&#xff0c;采用AI技术&#xff0c;它不仅可以将…

中小型教育网络安全解决方案

热门IT技术视频教程&#xff1a;https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 一、中小型教育网络的安全现状及挑战 当前&#xff0c;校园网的安全形势非常严峻&#xff0c;大量的垃圾邮件、黑客攻击、病毒蠕虫等困扰着管理者。而且这些作…

IP数据在大数据行业的创新应用

随着大数据技术的迅猛发展&#xff0c;IP数据的应用在大数据行业中变得愈加广泛。IP数据云通过真实案例&#xff0c;研究IP数据在大数据行业中的创新应用&#xff0c;探讨其在用户行为分析和个性化推荐等方面的关键作用。 第一部分&#xff1a;IP数据在用户行为分析中的应用 …

使用bs4 分析html文件

首先需要 pip install beautifulsoup4安装 然后为了方便学习此插件&#xff0c;随便打开一个网页&#xff0c;然后鼠标右键&#xff0c;打开源网页&#xff0c;如下图片 这样就可以获得一个网页源码&#xff0c;全选复制粘贴到本地&#xff0c;存储为 .html 文件&#xff0c;…

了解免费SSL证书:单域名、多域名与通配符

SSL证书是一种常用的安全协议&#xff0c;它通过加密数据传输&#xff0c;确保用户与网站之间的信息传递得以安全进行。本文将介绍免费SSL证书的三种常见类型&#xff1a;单域名、多域名和通配符&#xff0c;帮助您选择适合您需求的SSL证书。 单域名SSL证书 单域名SSL证书是最…

[AFCTF 2021]google authenticator

文章目录 前置知识谷歌身份验证redis-cli结合定时任务提权 解题过程 前置知识 谷歌身份验证 GitHub上有开源的项目 参考文章 我们下载下载该项目&#xff0c;然后按照给的exp修改一下 在该项目创建exp.php&#xff0c;内容如下 <?php require_once PHPGangsta/GoogleAu…

多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-CNN-LST…

硬件基础-LDO

LDO&#xff08;低压差线性稳压器&#xff09; 1.原理 通过运放调节P-MOS的输出 低压差&#xff1a; 输出压降比较低&#xff0c;例如输入3.3V&#xff0c;输出可以达到3.2V。 线性&#xff1a; LDO内部的MOS管工作于线性状态。 稳压器&#xff1a; 说明了LDO的用途是用来…

3d max高质量渲染时,硬件的要求有什么?

渲染过程中&#xff0c;想要追求&#xff0c;效果图高质量渲染&#xff0c;高效率渲染的过程中&#xff0c;3d max高清渲染不只是三维软件的一个要求&#xff0c;对于本地计算机的硬件要求配置也是很重要的。 今天&#xff0c;小编带大家来聊聊3d max高质量渲染过程中&#xff…

Linux——apt-get工具

apt-get是Debian和Ubuntu等基于Debian的Linux发行版的包管理工具&#xff0c;用于自动从互联网软件仓库中搜索、下载、安装、升级、卸载软件或操作系统&#xff0c;以及自动处理依赖关系。 使用apt-get进行软件包安装的基本步骤 &#xff08;请注意&#xff0c;具体的命令和操…

vue+element-ui实现el-time-picker组件只显示分钟和秒

1.实现效果 2.页面代码 <el-time-pickerv-model"formValidate.flightDuration"value-format"mm:ss"format"mm:ss":picker-options"{selectableRange: 00:00:00 - 00:59:59}"popper-class"noneMinute"placeholder"飞…

06.仿简道云公式函数实战-前瞻

1.前言 在上篇文章中&#xff0c;我们介绍了QLExpress的进阶知识&#xff0c;扩展操作符&#xff0c;自定义操作符和自定义函数等内容。学了上面的内容后&#xff0c;目前对于QLExpress使用已经问题不大&#xff0c;从这篇文章&#xff0c;我们就进入我们的主题仿简道云公式函…

JavaGUI(但期末速成版)之事件监听和处理

点击返回标题->JavaGUI期末速成版-CSDN博客 前言 依旧先声明&#xff0c;本篇记录的JavaGUI编程都是十分精简的&#xff0c;内容只取常用的、套路的、应付期末考试的。 我先放两张ppt的原内容。。。 看完&#xff08;我觉得你可能都没看完&#xff09;&#xff0c;摊牌了&a…

mysql 23-2day 数据库查询(DQL)

目录 数据库查询(DQL)环境&#xff1a;准备一个表格作为查询环境查看数据根据要求查看数据运算查询as 可以修改字段名字 进行查询查询所有部门拼接两个字段查询 2017年入职的员工一个是空null 一个是空白查询 NULL集合排序查询查看有那些组通配符正则查询函数 数据库查询(DQL) …

LeetCode 1901. 寻找峰值 II

一、题目 1、题目描述 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat &#xff0c;其中任意两个相邻格子的值都 不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。 你可以假设整个矩阵…

透明加密 | 半透明加密 \ 智能加密的区别

透明加密、半透明加密和智能加密都是数据加密技术&#xff0c;但它们在应用方式、加密效果和使用场景上存在一些区别。 PC端访问地址&#xff1a; www.drhchina.com 透明加密&#xff1a; 透明加密是一种强制加密技术&#xff0c;它通过文件过滤驱动透明加解密技术进行文件加…