Java 读取 Excel 表格—— Easy Excel 基本使用

两种读对象的方式

  1. 确定表头:建立对象,和表头形成映射关系。
  2. 不确定表头:每一行数据映射为 Map<String, Object>,比如用户自己上传的表格。

两种读取模式

  1. 监听器:先创建监听器、在读取文件时绑定监听器。单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。
  2. 同步读:无需创建监听器,一次性获取完整数据。方便简单,但是数据量大时会有等待时长,造成卡顿,也可能出现内存溢出。

Easy Excel 基本使用

Easy Excel官网

  1. 导入依赖
        <!-- easy Excel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
        </dependency>
  1. 需要读取的类对象:
package com.heo.matchmatebackend.easyExcel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * 用户表格信息
 */
@Data
public class TableUserInfo {
    /**
     * 用户编号
     */
    @ExcelProperty("用户编号") // 列名匹配(或者也可以用列数 index=0 的方式进行匹配第一列)
    private String userCode;

    /**
     * 用户昵称
     */
    @ExcelProperty("用户昵称")
    private String username;
}
  1. 读取监听器
package com.heo.matchmatebackend.easyExcel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;

// 有个很重要的点 TableListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class TableListener implements ReadListener<TableUserInfo> {

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(TableUserInfo data, AnalysisContext context) {
        System.out.println(data);
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("已解析完成");
    }

}
  1. 两种读取数据的方法
package com.heo.matchmatebackend.easyExcel;

import com.alibaba.excel.EasyExcel;

import java.util.List;

/**
 *  导入Excel,读取数据
 */
public class ImportExcel {
    /**
     * 读取数据
     */
    public static void main(String[] args) {
        // 写法1:JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        // Excel数据文件放在自己电脑上,能够找到的路径
        String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
//          readByListener(fileName);
        synchronousRead(fileName);
    }
    /**
     * 监听器读取
     * @param fileName
     */
    public static void readByListener(String fileName) {
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        // 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行
        EasyExcel.read(fileName, TableUserInfo.class, new TableListener()).sheet().doRead();
    }

    /**
     * 同步读
     * 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面,且响应时间太久
     */
    public static void synchronousRead(String fileName) {
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
        List<TableUserInfo> list = EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
        for (TableUserInfo tableUserInfo : list) {
            System.out.println(tableUserInfo);
        }

    }
}

在这里插入图片描述

在这里插入图片描述

  1. 实操案例
package com.heo.matchmatebackend.easyExcel;

import com.alibaba.excel.EasyExcel;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ImportUser {
    public static void main(String[] args) {
        //Excel数据文件放在自己电脑上,能够找到的路径
        String fileName = "C:\\Codefield\\MY_PROJECT\\match-mate-backend\\src\\main\\resources\\testExcel.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
        List<TableUserInfo> userInfoList =
                EasyExcel.read(fileName).head(TableUserInfo.class).sheet().doReadSync();
        System.out.println("总数 = " + userInfoList.size());
        // 过滤username为空的信息,并分组为 map<列名,列数据的list>
        Map<String, List<TableUserInfo>> listMap =
                userInfoList.stream()
                        .filter(userInfo -> StringUtils.isNotEmpty(userInfo.getUsername()))
                        .collect(Collectors.groupingBy(TableUserInfo::getUsername));
        for (Map.Entry<String, List<TableUserInfo>> stringListEntry : listMap.entrySet()) {
            if (stringListEntry.getValue().size() > 1) {
                System.out.println("username = " + stringListEntry.getKey());
//                System.out.println("1");
            }
        }
        System.out.println("不重复昵称数 = " + listMap.keySet().size());
    }
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2 使用pdf.js 实现pdf预览,并可复制文本

需求&#xff1a;pdf预览&#xff0c;并且可以选中pdf的内容进行复制。 在ruoyi的vue前端项目中用到&#xff0c;参考了网上不少文章&#xff0c;因为大部分没给具体的pdf.js版本&#xff0c;导致运行过程中报各种api 错误&#xff0c;经过尝试以下版本可用&#xff0c…

2023全球边缘计算大会深圳站:核心内容与学习收获(附大会核心PPT下载)

边缘计算作为当今IT领域的热门话题&#xff0c;已经引起了全球范围内的广泛关注。本次大会汇聚了众多业界精英&#xff0c;共同探讨边缘计算的发展趋势、技术应用与创新实践。本文将围绕大会的核心内容展开讨论&#xff0c;并分析参会者从中能够学到的东西。 一、边缘计算的发…

电子学会C/C++编程等级考试2023年12月(七级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:迷宫 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下…

go 语言(九)----struct

定义一个结构体 type Book struct {title stringauth string }结构体使用 package mainimport "fmt"//定义一个结构体 type Book struct {title stringauth string }func main() {var book1 Bookbook1.title "Golang"book1.auth "zhang3"fmt…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

5、交叉验证

交叉验证 在本教程中,您将学习如何使用交叉验证来更好地衡量模型的性能。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、什么是交叉验证3、什么时候应该使用交叉验证?4、举例1)加载数据集2)创建管道3)获取MAE…

WEB-前端 表格标签-合并单元格

目录 合并单元方式 &#xff1a; 跨行合并 &#xff1a; 跨列合并 &#xff1a; 目标单元格 : 跨行的话 跨列的话 合并的步骤 : 跨行合并 &#xff1a; 跨列合并 &#xff1a; 特殊情况下&#xff0c;可以把多个单元格合并为一个单元格&#xff0c;我们呢先…

【Leetcode】2788. 按分隔符拆分字符串

文章目录 题目思路代码 题目 题目链接 给你一个字符串数组 words 和一个字符 separator &#xff0c;请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组&#xff0c;不包括空字符串 。 注意 separator 用于决定拆分发生的位置&#…

Ubuntu中查看IP地址的常用命令及使用方法

在Ubuntu操作系统中&#xff0c;了解和查看IP地址是进行网络配置、故障排除以及连接其他设备的重要一步。 以下是几个常用的命令来查看IP地址&#xff1a; 一、ifconfig命令 输入ifconfig 输出如图所示&#xff0c;即为ip地址 如若提示没有ifconfig命令&#xff0c;则可以使用…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一&#xff1a;我的方法 2 方法二&#xff1a;动态规划 3 方法三&#xff1a;双指针 菜鸟做题第一周&#xff0c;语言是 C 42. 接雨水 1 方法一&#xff1a;我的方法 Warning&#xff1a;这是我的智障做法&#xff0c;请勿模仿 我只能说它教会…

macOS系统ISO镜像完整制作过程

1.下载dmg包 下载中... 下载完成后会自动弹出安装窗口如下: 启动台中也有 Install macOS Sonoma图标 2.创建一个空的15G的dmg镜像: 创建空dmg镜像命令如下: hdiutil create -o ./Sonoma.cdr -size 15000m -layout SPUD -fs

python毕设选题 - 大数据工作岗位数据分析与可视化 - python flask

文章目录 0 前言1 课题背景2 实现效果3 项目实现3.1 概括 3.2 Flask实现3.3 HTML页面交互及Jinja2 4 **完整代码**5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要…

【Java】JDBC的使用

JDBC package jdbc_demo;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取…

信道复用技术码分复用 CDM(Code Division Multiplexing)

目录 一、码分复用 CDM&#xff08;Code Division Multiplexing&#xff09; 二、码分多址CDMA 三、码片序列的概念 四、码片序列的正交关系 五、CDMA的工作原理 一、码分复用 CDM&#xff08;Code Division Multiplexing&#xff09; 常用的名词是码分多址 CDMA (Code Di…

OceanBase集群部署

我认为学习一个中间件比较好的方式是&#xff0c;先了解它的架构和运行原理&#xff0c;然后动手部署一遍&#xff0c;加深对它的了解&#xff0c;再使用它&#xff0c;最后进行总结和分享 本篇介绍OceanBase部署前提条件和集群部署 1.使用开源免费的社区版&#xff0c;企业版…

JS-WebAPIS(四)

日期对象&#xff08;常用&#xff09; • 实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化创建一个时间对象并获取时间 获得当前时间 获得指定时间 • 时间对象方法 使用场景&#xff1a;因为日期对象返回的数据我们不能直接使用&#xff0c;所以…

Yearning存在任意文件读取漏洞

文章目录 前言声明一、Yearning简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Yearning MYSQL SQL语句审核平台。提供查询审计&#xff0c;SQL审核&#xff0c;SQL回滚&#xff0c;自定义工作流等多种功能。该平台存在任意文件读取漏洞。 声明 请勿利用文章内的…

ThinkPad T14/T15/P14s/P15s gen2电脑原厂Win10系统镜像 恢复笔记本出厂时预装自带OEM系统

lenovo联想原装出厂Windows10系统&#xff0c;适用型号&#xff1a; ThinkPad T14 Gen 2&#xff0c;ThinPad T15 Gen 2&#xff0c;ThinkPad P14s Gen 2&#xff0c;ThinkPad P15s Gen 2 &#xff08;20W1,20W5,20VY,20W7,20W0,20W4,20VX,20W6&#xff09; 链接&#xff1…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1&#xff09;Dcm和PduR的交互2&#xff09;Dcm和ComM模块的交互3&#xff09;Dcm和Dem的交互4&a…

职能部门的绩效考核改革,解决方案来了

一、客户背景及现状问题 A酒店是酒店行业的龙头企业&#xff0c;其品牌享有很高的知名度。为了适应市场竞争及发展的需要、充分发挥每个员工的积极性&#xff0c;提高企业的整体业绩&#xff0c;该企业于前几年开始实行严格的绩效考核制度。绩效考核实行之初&#xff0c;管理者…