Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录

    • 一、EasyExcel的示例
      • 导入依赖
      • 创建实体类
      • 数据导入和导出
    • 二、EasyExcel的作用
    • 三、EasyExcel的注解

EasyExcel是一个阿里巴巴开源的excel处理框架,它以使用简单、节省内存著称。在解析Excel时,EasyExcel没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。这种一行一行的解析模式,使得EasyExcel在处理大数据量的Excel文件时,性能非常高效。

本文先展示示例,后对EasyExcel做些简单介绍。

一、EasyExcel的示例

本文简单介绍EasyExcel的使用,使用xlsx文件读入。

导入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>

创建实体类

@Data
// 行高
@HeadRowHeight(15)
// 行宽
@ColumnWidth(20)
public class ExcelEntity implements Serializable {
	
	// @ExcelProperty(index = 0, value = "data")  列顺序
	@ExcelProperty("用户姓名")
    private Integer name;
    
	// @ExcelIgnore 不生效
    @ExcelProperty("用户工号")
    private String userId;
    
    @ExcelProperty("用户权限")
    private String role;
    
    @ExcelProperty("用户部门")
    private Integer part;
    
}

数据导入和导出

实现一个数据例子:将Excel文件中(初始sheet)所有用户部门的人员进行分类,导出到原Excel的(调整sheet)。这个例子是读取一个Excel的sheet表格

origin表格

首先创建Excel表格,新建一个origin的sheet。新建一个Listener监听器,用于逐行读取数据。

public class TestDataListener extends AnalysisEventListener<TestExcelEntity>{
	
	private List<TestExcelEntity> list = new ArrayList<>();

	@Override
	public void invoke(TestExcelEntity data, AnalysisContext context) {
		System.out.println(data);  // 可以看到每一行的数据
		list.add(data);
	}

	@Override
	public void doAfterAllAnalysed(AnalysisContext context) {
		System.out.println("WriterExcelEntity All data analyzed");
	}

	public List<TestExcelEntity> getList() {
		return list;
	}

	public void setList(List<TestExcelEntity> list) {
		this.list = list;
	}	
}

新建执行代码

public class Test {
	public static void main(String[] args) throws FileNotFoundException {

        // 利用监听器读取Excel文件
        TestDataListener testDataListener = new TestDataListener();
        String path = "C:\\Users\\Desktop\\test.xlsx";
        ExcelReader excelReader = EasyExcel.read(path, TestExcelEntity.class, testDataListener).build();
        ReadSheet esgReadSheet = EasyExcel.readSheet(0, "origin").build();
        excelReader.read(esgReadSheet);
        excelReader.finish();
        
        List<TestExcelEntity> greenBondEntities = testDataListener.getList();

        // 对获取到的数据进行排序,并转换成 Map 数据格式
        greenBondEntities.sort((u1, u2) -> u1.getRole().compareTo(u2.getRole()));
        Map<String, List<TestExcelEntity>> map =
                greenBondEntities.stream().collect(Collectors.groupingBy(TestExcelEntity::getRole));

        // 根据业务操作
        List<TestExcelEntity> res = new ArrayList<>();
        map.entrySet().stream().forEach(entry -> {
            List<TestExcelEntity> list = entry.getValue();
            for (int i = 0; i < list.size(); i++) {
                TestExcelEntity test = new TestExcelEntity();
                if (i == 0) {
                    test.setRole(list.get(i).getRole());
                    test.setName(list.get(i).getName());
                    test.setUserId(list.get(i).getUserId());
                    test.setPart(list.get(i).getPart());
                } else {
                    test.setName(list.get(i).getName());
                    test.setUserId(list.get(i).getUserId());
                    test.setPart(list.get(i).getPart());
                }
                res.add(test);
            }
        });

        EasyExcel.write("C:\\Users\\Desktop\\res.xlsx", TestExcelEntity.class)
                .sheet(0,"update")
                .doWrite(res);
    }
} 

导出后的Excel如下图所示:
update表格
如果想要读取多个sheet表格:

// 读取多条sheet
@Test
public void read() {
	TestDataListener testDataListener = new TestDataListener();
	String path = "C:\\Users\\Desktop\\test.xlsx";
	ExcelReader excelReader = EasyExcel.read(path, TestExcelEntity.class, testDataListener).build();
    List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();

    for (ReadSheet sheet : sheets) {
        String sheetName = sheet.getSheetName();
        System.out.println(sheetName);
        ReadSheet readSheet = EasyExcel.readSheet(sheetName).build();
        excelReader.read(readSheet);
    }

    excelReader.finish();
}

二、EasyExcel的作用

  • 高效性能 :EasyExcel在处理大型Excel文件时具有出色的性能。它采用了基于流的读写方式,能够快速处理大量数据,显著提高了读写效率。同时,EasyExcel针对大数据量处理进行了优化,提供了 分批读写内存优化 等策略,保证了处理大型Excel文件时的 高效性稳定性
  • 简洁易用 :EasyExcel提供了简洁而强大的API,可以轻松地读取、写入和操作Excel文件,减少了繁琐的操作和代码量。
  • 低内存占用 :与传统的Excel文件读取方式相比,EasyExcel显著降低了内存占用。它采用基于 事件驱动 的模型,通过 回调函数 来处理每一行数据,而不是一次性将整个文件读入内存。这种流式的处理方式极大地节省了内存资源,使得处理大文件时更加稳定可靠。
  • 支持多种格式和复杂操作 :EasyExcel支持多种Excel文件格式,包括 .xls.xlsx.xlsm 等,使得它在处理不同版本的Excel文件时具有更大的灵活性。同时,它还支持处理复杂的Excel表格,包括合并单元格、样式、图表等,满足各种复杂场景的需求。
  • 强大的扩展性 :EasyExcel提供了丰富的扩展接口,开发者可以根据自己的需求轻松定制Excel文件的读写操作,满足各种复杂场景的需求。比如支持自定义转换器,使得数据格式的处理更为灵活。

EasyExcel在处理Excel文件时具有高效、简洁、低内存占用、支持多种格式和复杂操作以及强大的扩展性等优点,这使得它在 大数据量 的Excel操作场景下成为一个非常不错的选择。然而,也需要注意到,虽然EasyExcel有很多优点,但它可能还需要额外引入依赖包,这可能会增加项目的复杂度。因此,在选择是否使用EasyExcel时,需要综合考虑项目的具体需求和实际情况。

三、EasyExcel的注解

  • @ExcelProperty :这是用于指定Java对象中的字段与Excel表格中的 列的映射关系 的注解。通过设置该注解的 value 属性,可以指定列名。设置 index 属性,可以指定列名的序号,从而实现字段与列的对应关系。
  • @ExcelIgnore :这个注解用于指定Java对象中的字段在Excel中的读写操作中被忽略。当需要在Excel文件中忽略某个字段时,可以在该字段上添加此注解。
  • @ContentFontStyle :用于设置字体样式。
  • @ContentLoopMerge :用于合并单元格。
  • @ContentRowHeight :用于设置 行高
  • @ContentStyle :用于设置内容格式。
  • @HeadFontStyle :用于定制标题字体格式。
  • @HeadRowHeight :用于设置 标题行行高
  • @HeadStyle :用于设置标题样式。
  • @ColumnWidth :用于设置 列宽
  • @DateTimeFormat :日期格式化。
  • @NumberFormat :数字格式化。

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

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

相关文章

使用 Flask 和 Flask-Login 构建用户认证的 Web 应用程序

在本篇技术博客中&#xff0c;我们将学习如何使用 Flask 框架和 Flask-Login 扩展构建一个具有用户认证功能的简单 Web 应用程序。我们将从创建 Flask 应用实例开始&#xff0c;然后逐步添加用户认证功能。 1. 安装依赖库 首先&#xff0c;确保您已经安装了 Flask、Flask-PyM…

大模型微调的几种常见方法

在文章深入理解大语言模型微调技术中&#xff0c;我们详细了解大语言模型微调的概念和训练过程&#xff0c;本篇给大家介绍大模型微调常见的7种训练方法。 1、Adapter Tuning 2019年谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for NLP》提出针对 BERT 的…

2024年Q1季度空调行业线上市场销售数据分析

Q1季度一直以来就是空调行业的淡季&#xff08;旺季一般出现在5月至7月&#xff09;。而今年&#xff0c;空调线上市场低迷发展的态势越发明显。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;空调累计销量约270万件&#x…

开源 Ruo-Yi 项目引入 Mybatis-Plus:3.5.3 报错ClassNotFoundException:

开源 Ruo-Yi 项目引入 Mybatis-Plus:3.5.3 报错ClassNotFoundException&#xff1a; Caused by: java.lang.ClassNotFoundException: com.baomidou.mybatisplus.extension.plugins.MybatisPlusInter1 分析问题 控制台报错说明我们引入的 mybatis-plus 的依赖里找不到com.baom…

Apache Tomcat 简单使用

Apache Tomcat 下载 download Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。 支持JDK版本 JDK8 要下载tomcat 9.0.x版本 …

【云计算】混合云分类

《混合云》系列&#xff0c;共包含以下 3 篇文章&#xff1a; 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f68…

Samtec应用分享 | 汽车应用中的视觉系统

【前言】 视觉系统在未来的汽车设计中扮演着关键的角色。 在过去&#xff0c;一直是由驾驶员掌握和应对道路上的危险&#xff0c;但现代车辆在保障驾驶安全方面发挥着前所未有的作用。 视觉系统&#xff0c;无论是可见光摄像头还是先进的探测系统&#xff0c;如激光雷达&…

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 3 分类问题为什么用交叉熵损失不用 MSE 损失 1 评估指标 混淆矩阵 TP(True Positive) ---- 正…

「51媒体」媒体邀约采访的分类?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约采访可以根据不同的标准进行分类。以下是一些常见的分类方式&#xff1a; 1. 按照邀约形式&#xff1a; - 电话邀约&#xff1a;通过电话与媒体联系&#xff0c;说明采访或报道…

免费的 ChatGPT、GPT4.0、GPTs、Midjourney-AI绘画(国内版)

&#x1f525;博客主页&#xff1a;只恨天高 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容…

【Java NIO】那NIO为什么速度快?

Java IO在工作中其实不常用到&#xff0c;更别提NIO了。但NIO却是高效操作I/O流的必备技能&#xff0c;如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术&#xff0c;NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃&#xff0c;但还是要慢慢消耗知识、学以致用哈…

小例子——Flask网站开发(二)【保姆级】

问题一&#xff1a; 如何实现Flask发送get请求&#xff1f; 下面是python代码演示。 要使用Flask发送GET请求&#xff0c;首先需要安装Flask库&#xff0c;然后创建一个Flask应用。1. 首先在管理员窗口安装Flask库&#xff1a; ​ 2. 创建一个名为app.py的文件&#xff0c;并添…

mac 最小化全部程序回到桌面(基于alfred workflow)

前言 换到 mac 系统之后&#xff0c;很多快捷键根本就不好用&#xff0c;组合太多了&#xff0c;除了 cmd Q/W/A/S/X/R/Z/C/V &#xff0c;个人认为其它的真的一坨屎。像我的需求就是&#xff0c;开的窗口太多了&#xff0c;我需要全部最小化&#xff0c;再重新打开我需要那个…

试试把GPT和Suno结合起来用(附免费GPT)

什么是GPT GPT&#xff08;生成预训练变换器&#xff09;是由OpenAI开发的一种先进的人工智能模型&#xff0c;它能够理解和生成人类语言。通过大量的数据训练&#xff0c;GPT模型不仅能够撰写文章、编写代码&#xff0c;还能创作诗歌和故事。而现在&#xff0c;这种技术已经扩…

C# .NET 中的反应式系统

概述&#xff1a;反应式系统已成为构建健壮、可扩展和响应迅速的应用程序的强大范式。这些系统被设计为更具弹性、弹性和消息驱动性&#xff0c;确保它们在各种条件下保持响应&#xff0c;包括高负载、网络延迟和故障。在本文中&#xff0c;我们将探讨 .NET 生态系统中反应式系…

Django中的定时任务与后台任务队列的实践【第164篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中&#xff0c;处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…

arm64-v8a、armeabi-v7a、x86、x86_64

当我们去GitHub下载应用的时候是不是经常很懵逼&#xff0c;就像下图一样&#xff0c;粗看一下如此多安装包到底要选择下载哪个且每种安装包到底有哪差别&#xff1f;毕竟因为自己一无所知&#xff0c;有时便随意下载一个后&#xff0c;安装时却报『此版本与你的系统不兼容』的…

Qt---状态栏、工具栏、浮动窗口

文章目录 工具栏创建工具栏停靠位置浮动性与移动 状态栏创建状态栏并显示消息 浮动窗口创建浮动窗口设置停靠位置往浮动窗口添加内容 工具栏 工具栏是应用程序中集成各种功能实现快捷键使用的⼀个区域。 创建工具栏 工具栏与菜单栏不同&#xff0c;并不会自动创建&#xff0…

【网络编程】如何创建一个自己的并发服务器?

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何创建一个自己的并发服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家…

UE 录屏自动化上传阿里云OSS

前言 最近在做一个功能&#xff0c;然后就发现了一个很有趣的东西&#xff0c;虽然在一定程度上属于偷懒&#xff0c;但是在一些短频快的应用中还是很适用的&#xff0c;下面我就针对于这个测试做一些简单的分享&#xff0c;希望帮助到大家&#xff0c;在实际的开发中获得一些灵…