Easyexcel简介及写、读操作

news2024/12/28 5:54:09

Easyexcel简介及写、读操作

  • 一、背景
  • 二、简介
  • 三、引入依赖
  • 四、代码实现
    • 1.创建实体类
    • 2.写入excel操作
    • 3.读取文件操作
      • 3.1 指定excel对应索引
      • 3.2 设置监听器
      • 3.3 执行读取操作

一、背景

作为一个经常进行数据分析的后端人员,免不了面对各种报表,且在日常的工作中,经常需要处理大量的数据,并进行各种复杂的计算和分析。而Excel作为一个重要的工具,在数据处理与分析上也起到了至关重要的作用。但是,Excel的操作繁琐、效率低下等问题也制约着我们的工作效率。为了解决这个问题,我们可以使用EasyExcel这个优秀的Java类库,来优化Excel数据的读写,并提高我们的工作效率。

二、简介

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)

官方网站: https://easyexcel.opensource.alibaba.com
github地址: https://github.com/alibaba/easyexcel
gitee地址: https://gitee.com/easyexcel/easyexcel

三、引入依赖

<!-- xls格式excel依赖包 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<!--xlsx格式excel依赖包-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
<!-- easyexcel依赖包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.1</version>
</dependency>

四、代码实现

1.创建实体类

这个实体类的属性内容要与excel的表头字段进行绑定,可以在属性上添加@ExcelProperty指定相应的表头的内容。

public class UserData {
    @ExcelProperty("用户id")
    private Integer uid;
    @ExcelProperty("用户名")
    private String userName;
    @ExcelProperty("性别")
    private String sex;
    @ExcelProperty("年龄")
    private Integer age;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2.写入excel操作

public class ExcelWriteDemo {
    public static void main(String[] args) {
        List<UserData> list = new ArrayList<>();
        for(int i = 0;i<100;i++){
            UserData userData = new UserData();
            userData.setUid(i);
            userData.setUserName("excelwriteTest"+i);
            userData.setSex("男");
            userData.setAge(20+i);
            list.add(userData);
        }

        String fileName = "D:\\excelTest\\20230729.xls";
        EasyExcel.write(fileName,UserData.class).sheet("用户信息").doWrite(list);
    }

}

执行后文件如下:

11:58:22.004 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Begin to Initialization 'WriteContextImpl'
11:58:22.037 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.113 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeWorkbookHolder
11:58:22.433 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Initialization 'WriteContextImpl' complete
11:58:22.434 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Sheet number is null
11:58:22.435 [main] DEBUG com.alibaba.excel.metadata.property.ExcelHeadProperty - The initialization sheet/table 'ExcelHeadProperty' is complete , head kind is CLASS
11:58:22.435 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - CurrentConfiguration is writeSheetHolder
11:58:22.436 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Can not find sheet:0 ,now create it
11:58:22.854 [main] DEBUG com.alibaba.excel.context.WriteContextImpl - Finished write.

在这里插入图片描述

3.读取文件操作

3.1 指定excel对应索引

对于excel的读操作,需要修改下注解,指定该属性对应在excel中的哪一列的索引。

public class UserData {
    @ExcelProperty(value = "用户id",index = 0)
    private Integer uid;
    @ExcelProperty(value = "用户名",index = 1)
    private String userName;
    @ExcelProperty(value = "性别",index = 2)
    private String sex;
    @ExcelProperty(value = "年龄",index = 3)
    private Integer age;

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

3.2 设置监听器

读操作需要设置一个监听器,目的就是能够一行一行的去读取文件中的数据。

public class ExcelLisenner extends AnalysisEventListener<UserData> {
    // 一行一行的读取内容,从第二行开始
    @Override
    public void invoke(UserData userData, AnalysisContext analysisContext) {
        System.out.println(userData.toString());
        System.out.println("读取一行,执行操作");
    }


    // 读取之后执行的操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取之后执行的操作");
    }

    // 读取第一行表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头信息:" + headMap);
    }
}

3.3 执行读取操作

public class ExcelReadDemo {
    public static void main(String[] args) {
        String fileName = "D:\\excelTest\\20230729.xls";
        EasyExcel.read(fileName,UserData.class,new ExcelLisenner()).sheet().doRead();
    }
}

执行结果如下:

表头信息:{0=用户id, 1=用户名, 2=性别, 3=年龄}
UserData{uid=0, userName='excelwriteTest0', sex='男', age=20}
读取一行,执行操作
UserData{uid=1, userName='excelwriteTest1', sex='男', age=21}
读取一行,执行操作
UserData{uid=2, userName='excelwriteTest2', sex='男', age=22}
读取一行,执行操作
UserData{uid=3, userName='excelwriteTest3', sex='男', age=23}
读取一行,执行操作
UserData{uid=4, userName='excelwriteTest4', sex='男', age=24}
读取一行,执行操作
UserData{uid=5, userName='excelwriteTest5', sex='男', age=25}
读取一行,执行操作
UserData{uid=6, userName='excelwriteTest6', sex='男', age=26}
读取一行,执行操作
UserData{uid=7, userName='excelwriteTest7', sex='男', age=27}
读取一行,执行操作
UserData{uid=8, userName='excelwriteTest8', sex='男', age=28}
读取一行,执行操作
UserData{uid=9, userName='excelwriteTest9', sex='男', age=29}
读取一行,执行操作
UserData{uid=10, userName='excelwriteTest10', sex='男', age=30}
读取一行,执行操作
UserData{uid=11, userName='excelwriteTest11', sex='男', age=31}
读取一行,执行操作
UserData{uid=12, userName='excelwriteTest12', sex='男', age=32}
读取一行,执行操作
UserData{uid=13, userName='excelwriteTest13', sex='男', age=33}
读取一行,执行操作
UserData{uid=14, userName='excelwriteTest14', sex='男', age=34}
读取一行,执行操作
UserData{uid=15, userName='excelwriteTest15', sex='男', age=35}
读取一行,执行操作
UserData{uid=16, userName='excelwriteTest16', sex='男', age=36}
读取一行,执行操作
UserData{uid=17, userName='excelwriteTest17', sex='男', age=37}
读取一行,执行操作
UserData{uid=18, userName='excelwriteTest18', sex='男', age=38}
读取一行,执行操作
UserData{uid=19, userName='excelwriteTest19', sex='男', age=39}
读取一行,执行操作
UserData{uid=20, userName='excelwriteTest20', sex='男', age=40}
读取一行,执行操作

读取之后执行的操作

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

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

相关文章

onTouchEvent浅析

我们接着上次的自定义星星来作讲解 当 onTouchEvent 返回 super.onTouchEvent ( false ) 时 public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d("ACTION_DOWN","ACTION_DOWN:"event.getA…

Ansible-playbook(剧本)

Ansible-playbook(剧本) 一、playbook的构成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行&#xff08;2&#xff09;Variables&#xff1a;变量&#xff08;3&#xff09;Templates&am…

mybatis复杂环境搭建-多对一的处理-一对多的处理

复杂环境搭建&#xff1a; 1.1建表&#xff1a; CREATE table teacher( id int(10) not null, name varchar(30) default null, primary key(id) )engineInnoDB default charsetutf8mb3;INSERT INTO teacher (id, name) VALUES (1, 何老师);create table student( id int(10)…

用户端App自动化测试

一、自动化用例录制 1、Appium Inspctor 功能介绍 UI 分析录制用例元素查找测试Attcah 已有的 session云测试 2、用例录制 1&#xff09;获取 app 的信息 2&#xff09;配置待测应用 3、获取 app 的信息 1&#xff09;app 入口&#xff0c;两种方式获取&#xff1a; * 通…

Linux系统中MySQL主从复制

本节主要学习了MySQL Replication概述&#xff0c;优点&#xff0c;复制类型&#xff0c;复制方式&#xff0c;复制过程和复制过程的限制&#xff0c;部署MySQL主从异步复制的流程及问题解决。 目录 一、MySQL Replication概述 1、优点 二、MySQL复制类型 1.异步复制&#…

#vue3报错 Cannot read properties of null (reading ‘isCE‘)#

场景&#xff1a;使用 npm 安装依赖包的时候&#xff0c;如如安装 npm i xlsx npm i file-saver 重新运行报错 Cannot read properties of null (reading isCE)# 解决办法&#xff1a; 使用的vite vue 在vite.config.ts添加如下配置&#xff1a; dedupe: [ vue ]

LeetCode使用最小花费爬楼梯(动态规划)

使用最小花费爬楼梯&#xff08;动态规划&#xff09; 题目描述算法流程(方法一)编程代码优化代码算法流程&#xff08;方法二&#xff09;编程代码代码优化 链接: 使用最小花费爬楼梯 题目描述 算法流程(方法一) 编程代码 class Solution { public:int minCostClimbingStair…

【雕爷学编程】Arduino动手做(104)---16X16点阵汉字屏模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

8种工程设计优化问题Matlab代码:多种智能优化算法求解对比

目录 一、8种工程设计优化问题 二、8种工程设计优化问题部分问题介绍 2.1 焊接梁设计 2.2 拉力压缩弹簧设计 2.3 三杆衍架设计问题 2.4 压力容器设计 2.5 减速器设计问题 三、多种智能优化算法分别求解部分工程设计优化问题 3.1 焊接梁设计 3.2 拉力压缩弹簧设计 3.…

数据结构基础之二叉树

文章目录 二叉树性质二叉树分类遍历二叉树如何判断是否为完全二叉树 二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式&#xff0c;即使是一般的树也能简单地转换为二叉树&#xff0c;而且二叉树的存储结构及其算法都较为简单&#xff0c;因此…

企业选择租用CRM还是一次性买断CRM?分别有哪些优势?

CRM是企业管理客户关系&#xff0c;提升销售业绩&#xff0c;实现业务增长的重要工具。市场上的CRM系统销售方式主要有两种——租用型和买断型。那么&#xff0c;租用CRM好还是一次性买断CRM好&#xff1f;本文将从以下几个方面进行分析&#xff1a; 1、什么是租用型CRM和买断…

shell中按照特定字符分割字符串,并且在切分后的每段内容后加上特定字符(串),然后再用特定字符拼接起来

文件中的内容&#xff0c;可以这么写&#xff1a; awk -F, -v OFS, {for(i1;i<‌NF;i){$i$i"_suffix"}}1 input.txt-F,&#xff1a;设置输入字段分隔符为逗号&#xff08;,&#xff09;&#xff0c;这将使awk按照逗号分割输入文本。-v OFS‘,’&#xff1a;设置输…

数据结构:栈和队列的实现和图解二者相互实现

文章目录 写在前面栈什么是栈栈的实现 队列什么是队列队列的实现 用队列实现栈用栈模拟队列 写在前面 栈和队列的实现依托的是顺序表和链表&#xff0c;如果对顺序表和链表不清楚是很难真正理解栈和队列的 下面为顺序表和链表的实现和图解讲解 手撕图解顺序表 手撕图解单链表 …

VMware虚拟机中配置静态IP

目录 环境原因基础概念VMnet网络IPV4网络私有地址范围Vmnet8的作用网路通信的过程解决方法1&#xff1a;修改k8s组件重新启动解决方法2&#xff1a;配置静态IP系统网卡设置设置虚拟机网关修改虚拟机网卡 环境 本机系统&#xff1a;windows11虚拟机系统&#xff1a;CentOS-7-x8…

【AutoGluon_03】保存模型并调用模型

在训练好autogluon模型之后&#xff0c;可以将模型进行保存。之后当有新的数据需要使用autogluon进行预测的时候&#xff0c;就可以直接加载原来训练好的模型进行训练。 import pandas as pd from sklearn.model_selection import train_test_split from autogluon.tabular im…

第九章:stack类

系列文章目录 文章目录 系列文章目录前言stack的介绍stack的使用成员函数使用stack 总结 前言 stack是容器适配器&#xff0c;底层封装了STL容器。 stack的介绍 stack的文档介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

数字孪生技术从哪些方面为钢铁冶炼厂提高管理效率?

数字孪生系统是一种数字化技术&#xff0c;可以将物理世界中的实体对象、过程和数据进行数字化建模&#xff0c;以实现对其的可视化、模拟和优化。在炼铁生产管控中&#xff0c;数字孪生系统可以为以下方面提供支持&#xff1a; 炼铁生产线的可视化和控制&#xff1a;通过数字…

Web3 叙述交易所授权置换概念 编写transferFrom与approve函数

前文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 中 我们通过ERC-20一种开发者设计的不成文规定 也将我们的代币开发的很像个样子了 我们打开 ERC-20文档 我们transfer后面的函数就是transferFrom 这个也是 一个账号 from 发送给另一个账号 to 数量 val…

指针初阶(1)

文章目录 目录1. 指针是什么2. 指针变量的类型2.1 指针变量-整数2.2 指针变量的解引用 3. 野指针3.1 野指针成因3.2 如何规避野指针 4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 附&#xff1a; 目录 指针是什么指针变量的类型野指针指针运算指针和数组二级指针…

redis集群设置

先下载redis数据库可以在一台机器上设置redis集群高可用 cd /etc/redis/ mkdir -p redis-cluster/redis600{1..6} for i in {1..6} do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-s…