EasyExcel的简单使用(easyExcel和poi)

EasyExcel的简单使用

前言
Excel读
1.实体类
2.读监听器与测试类
3.输出结果
Excel写
1.实体类
2.写入Excel的测试类
3.输出结果
填充Excel
1.Excel模板
2.测试类
3.输出结果
前言
EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。

版本支持:
2+版本支持Java7&Java6
3+版本支持Java8

这里使用的EasyExcel版本为3.1.1,JDK版本为1.8.0_161,同时辅助使用lombok和fastjson以简化代码或转化为Jason数据。
Maven依赖配置:

<dependencies>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>easyexcel</artifactId>
		<version>3.1.1</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>		//非必要
		<version>1.16.10</version>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>	//非必要
		<version>1.2.47</version>
	</dependency>
</dependencies>

Excel读
样例内容:
在这里插入图片描述
1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TextReadObject {

    @ExcelProperty(index = 0)
    private Integer studentId;

    @ExcelProperty(index = 1)
    private String studentName;

    @ExcelProperty(index = 2)
    private String institute;

    @ExcelProperty(index = 3)
    private Integer level_11;

    @ExcelProperty(index = 4)
    private Integer level_12;

    @ExcelProperty(index = 5)
    private Integer level_21;

    @ExcelProperty(index = 6)
    private Integer level_22;
}

其中注解@ExcelProperty可包含两个参数index和value,在简单表头(即表头只占用一行)中以下两条注解基本等价

@ExcelProperty(index = 0)
@ExcelProperty(value = “学号”)

而在复杂表头(即本例)中,需要使用index表示。
另外需要注意的是加入表头名字出现重复,会导致只有一个字段读取到数据,此外在读取操作时不建议index和value同时使用。综上所述,在已知excel表头内容的情况下使用参数index。

2.读监听器与测试类
四个监听器,这里使用前两个
在这里插入图片描述
AnalysisEventListener < T >
所有已实现的接口:Listener、ReadListener
直接已知子类:SyncReadListener
在这里插入图片描述

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;
import java.util.List;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class DemoDataListener extends AnalysisEventListener<TextReadObject> {
    private List<TextReadObject> dataList;
    //读取表头的内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头->"+headMap);
    }
    //一行一行读取excel中的内容
    @Override
    public void invoke(TextReadObject data, AnalysisContext context) {
        dataList.add(data);
    }
    //读取完成之后执行的方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}
}

读取Excel的测试类:

import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;

public class ExcelImport {
	public static void simpleRead() {
        String fileName = "F:\\rdtext.xls";
        List<TextReadObject> dataList = new ArrayList<>();
        //每次会读取100条数据然后返回过来,直接调用使用数据就行
        EasyExcel.read(fileName, TextReadObject.class, new DemoDataListener(dataList))
                .sheet(0)//读取第一个sheet
                .headRowNumber(3) //跳过前三行表头内容,假如是简单表头则这句可省略
                .doRead();
        //若需要实现读取全部sheet,可以使用.doReadAll()代替.sheet(0).doRead()

        for (TextReadObject dl : dataList) {
            System.out.println(JSON.toJSONString(dl));
        }
	}
	public static void main(String[] args) { simpleRead(); }
}

SyncReadListener:
所有已实现的接口:Listener、ReadListener
直接已知父类:AnalysisEventListener < T >

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.SyncReadListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class ExcelImportSync {
    public static void simpleRead() {
        String fileName = "F:\\text.xls";
        final List dataList = new ArrayList();
        EasyExcel.read(fileName, TextReadObject.class, new SyncReadListener() {
            @Override
            public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
                System.out.println("表头->"+headMap);
            }
            @Override
            public void invoke(Object object, AnalysisContext context) {
                dataList.add(object);
            }
        }).sheet(0).headRowNumber(3).doRead();
        for (Object o : dataList) {
            TextReadObject TOB = (TextReadObject) o;
            System.out.println(JSON.toJSONString(TOB));
        }
    }
    public static void main(String[] args) { simpleRead(); }
}

相较于AnalysisEventListener < T >,SyncReadListener更加适合对多种实体类实施相同操作的情况,在定义监听器时没有指定具体的实体类。

3.输出结果
二者输出结果一样:
在这里插入图片描述
Excel写
1.实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ColumnWidth(15) //列宽,最大值为255
@HeadRowHeight(16) //表头行高
@ContentRowHeight(16) //数据行高
public class TextWriteObject {
    //复杂表头自动合并相同的内容
    @ExcelProperty(index = 0, value = {"学号", "学号", "学号"})
    private Integer studentId;

    @ExcelProperty(index = 1, value = {"姓名", "姓名", "姓名"})
    private String studentName;

    @ColumnWidth(25)//单独设置列宽
    @ExcelProperty(index = 2, value = {"学院", "学院", "学院"})
    private String institute;
    //复杂表头嵌套
    @ExcelProperty(index = 3, value = {"成绩", "第一学年", "第一学期"})
    private Integer level_11;

    @ExcelProperty(index = 4, value = {"成绩", "第一学年", "第二学期"})
    private Integer level_12;

    @ExcelProperty(index = 5, value = {"成绩", "第二学年", "第一学期"})
    private Integer level_21;

    @ExcelProperty(index = 6, value = {"成绩", "第二学年", "第二学期"})
    private Integer level_22;
}

此时在注解@ExcelProperty中可以同时使用参数index和value,用于同时指定位置和内容。

其他未使用注解:
@ContentStyle用于设置内容格式
在这里插入图片描述
在这里插入图片描述
@ContentFontStyle用于设置单元格内容字体格式
在这里插入图片描述
在这里插入图片描述
@ExcelIgnore不将该字段转换成Excel

@ExcelIgnoreUnannotated没有注解的字段都不转换

2.写入Excel的测试类

import java.util.ArrayList;
import java.util.List;

public class ExcelExport {
    public static void simpleWrite(){
        String fileName = "F:\\wttext.xls";
        List<TextWriteObject> dataList = new ArrayList<>();
        dataList.add(new TextWriteObject(2022101, "张三",
                "生命科学院", 653, 602, 683, 707));
        dataList.add(new TextWriteObject(2022102, "李四",
                "生命科学院", 568, 596, 611, 632));
        dataList.add(new TextWriteObject(2022103, "王五",
                "生命科学院", 606, 673, 624, 653));
        dataList.add(new TextWriteObject(2022201, "赵六",
                "语言文学院", 710, 722, 686, 703));
        EasyExcel.write(fileName, TextWriteObject.class)
                .sheet(0)
                .doWrite(dataList);
    }
    public static void main(String[] args) { simpleWrite(); }
}

3.输出结果
在这里插入图片描述
原文链接:https://blog.csdn.net/hermit_f/article/details/126850664
https://blog.csdn.net/hermit_f/article/details/126850664?spm=1001.2014.3001.5506

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

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

相关文章

Go 语言数组和切片的区别

原文链接&#xff1a; Go 语言数组和切片的区别 在 Go 语言中&#xff0c;数组和切片看起来很像&#xff0c;但其实它们又有很多的不同之处&#xff0c;这篇文章就来说说它们到底有哪些不同。 另外&#xff0c;这个问题在面试中也经常会被问到&#xff0c;属于入门级题目&…

堆及其堆排序

堆是一种特殊的数据结构&#xff0c;底层实现是靠数组存储以及完全二叉树的性质 文章目录一、堆概念二、堆实现三、堆源码四、堆排序一、堆概念 完全二叉树用数组来存储可以达到空间的有效利用且可以直观反映它们之间的逻辑关系&#xff0c;双亲与孩子之间的关系。一般在数组中…

一文说透虚拟内存

为什么我们需要虚拟内存 提供一个虚拟化封装&#xff0c;让上层的程序员不用担心内存分配&#xff0c;物理地址的总大小。同时如果要手动管理内存是一件麻烦的事&#xff0c;比如一个程序读到另一个程序的物理地址&#xff0c;并且也很难保障多个处理器不会同时读取写入同一块…

GitHub Action 使用

GitHub Action 使用 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台&#xff0c;可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求&#xff0c;或将合并的拉取请求部署到生产环境。GitHub 提供 Linux、Windows 和 macOS 虚拟…

训练AI数据模型所需要的高性能计算机配置

目录 配置一 配置二 配置三 云服务器和超级计算机 AI模型训练是一种机器学习的过程&#xff0c;通过训练深度学习模型来自动化处理数据和完成任务。AI训练可以帮助企业和研究人员开发出更加智能、高效的应用&#xff0c;从而提高生产力和创新能力。 以下是按训练性能从低到…

对挖矿病毒 kdevtmpfsi 的处理办法

需求背景&#xff1a; 服务器CPU资源使用一直处于100%的状态&#xff0c;通过 top 命令查看&#xff0c;发现可疑进程 kdevtmpfsi。通过 google搜索&#xff0c;发现这是挖矿病毒。 排查方法 首先&#xff1a;查看 kdevtmpfsi 进程&#xff0c;使用 ps -ef | grep kdevtmpfsi …

数据结构之线性表

文章目录1. 线性表的定义2. 线性表的抽象数据类型3. 线性表的顺序存储结构4. 线性表的链式存储结构5. 单链表结构和顺序存储结构优缺点6. 静态链表7. 循环链表8. 双向链表1. 线性表的定义 零个或多个数据元素的有限序列 线性表的定义中强调有限和序列两个方面。 有限&#xff…

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原

华硕ROG|玩家国度 冰刃7双屏 GX650PY Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个…

【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅲ

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

MySQL基础-变量/流程控制/游标/触发器

文章目录MySQL基础-变量/流程控制/游标/触发器一、变量1、系统变量2、用户变量二、流程控制1、分支语句2、循环语句3、跳转语句三、游标1、概念2、使用四、触发器1、触发器概念2、触发器使用3、触发器的优缺点MySQL基础-变量/流程控制/游标/触发器 一、变量 在MySQL数据库的存…

RocketMQ水平扩展及负载均衡详解

文章目录 Broker端水平扩展Broker负载均衡commit logProducer负载均衡Consumer负载均衡集群模式广播模式RocketMQ是一个分布式具有高度可扩展性的消息中间件。本文旨在探索在broker端,生产端,以及消费端是如何做到横向扩展以及负载均衡的。 Broker端水平扩展 Broker负载均衡…

前端项目-05-轮播图banner和Floor组件开发-全局轮播图组件抽取

目录 1-轮播图模块数据开发 2-floor组件开发 3-抽取全局轮播图组件 1-轮播图模块数据开发 轮播图需要用到swiper插件&#xff0c;先安装5.4.5版本的swiper&#xff1a;npm install --save swiper^5.4.5 --force 模拟从服务器获取数据&#xff1b; 1-编写mockRequests的js…

【ACWing算法课】二分查找

前言&#x1f349; 二分查找一个简单的算法&#xff0c;但是因为边界问题往往写不好。特此记录模板&#xff0c;以便快捷使用。 [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置&#x1f451; [二分查找]从列表q找到第一个>k的数&#xff0c;返回位置def bsear…

three.js实现3d球体树状结构布局——树状结构的实现

目录系列文章安装依赖基本分析实体类场景相机渲染器辅助线环境光点光源球形几何体球形几何体的材质线几何体线几何体的材质物体文本轨道控制实现效果实现源码参考文档系列文章 three.js实现3d球体树状结构布局——添加入场、出场、点击放大等动画 安装依赖 npm i three three…

Adaptive AUTOSAR——Time Synchronization(VRTE 3.0 R21-11)

15 Time Synchronization 15.1 What is Time Synchronization? 时间同步是自适应平台基础中的一个功能集群。时间同步通过库向应用程序提供C API&#xff0c;该库作为RTA-VRTE入门套件的一部分提供&#xff0c;并与应用程序链接以访问该功能。 本版本包含非常少量的时间同步…

ASIC-WORLD Verilog(1)一日Verilog

写在前面 在自己准备写一些简单的verilog教程之前&#xff0c;参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好&#xff0c;奈何没有中文&#xff0c;在下只好斗胆翻译过来&#xff08;加了自己的理解&#xff09;分享给大家。 这是网站原文&…

Helm学习笔记

文章目录概念定义helm组件helm的工作流程helm安装helm仓库helm部署应用helm应用的更新或回退或卸载概念 定义 学习helm首先得了解helm是什么&#xff0c;我们先来看一下helm的定义&#xff1a;helm是将kubernetes的各种资源对象打包&#xff0c;类似于Linux中的yum工具&#…

【HTML系列】第六章 · 框架标签、HTML实体、HTML全局属性和meta元信息

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【前端面试题——微信小程序】

目录1.请谈谈wxml与标准的html的异同&#xff1f;2.请谈谈WXSS和CSS的异同&#xff1f;3.请谈谈微信小程序主要目录和文件的作用&#xff1f;4.请谈谈小程序的双向绑定和vue的异同&#xff1f;5.简单描述下微信小程序的相关文件类型&#xff1f;6.微信小程序有哪些传值(传递数据…

jsp+javaEE+mysql校园物品租赁系统dzkf5294程序

1&#xff0e;物品信息管理&#xff1a;管理员发布物品信息后&#xff0c;普通用户便可以查询到该物品信息&#xff0c;用户选择某个物品信息&#xff0c;查询物品信息&#xff0c;管理员审核添加&#xff0c;或删除物品信息。 2&#xff0e;租赁管理&#xff1a;管理员发布租赁…