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

devtools/2024/9/25 8:40:54/

文章目录

    • 一、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>

创建实体类

java">@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监听器,用于逐行读取数据。

java">public class TestDataListener extends AnalysisEventListener<TestExcelEntity>{private List<TestExcelEntity> list = new ArrayList<>();@Overridepublic void invoke(TestExcelEntity data, AnalysisContext context) {System.out.println(data);  // 可以看到每一行的数据list.add(data);}@Overridepublic 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;}	
}

新建执行代码

java">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表格:

java">// 读取多条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 :数字格式化。

http://www.ppmy.cn/devtools/4310.html

相关文章

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32&#xff1a;新产品构思 新作品 我时常把自己看做一位木匠&#xff0c;有点手艺&#xff0c;能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时&#xff0c;要开启下一个作品的创造了。 其实早在2022的1…

labview中的同步定时结构

单帧定时循环定时比较精确&#xff0c;最常用的功能还是它的定时循环功能&#xff0c;定时循环允许不连接“循环条件”端子&#xff0c;可以连接定时循环“结构名称”端子&#xff0c;通过定时结构停止函数停止循环。 例子在附件中。

Ubuntu 忘记系统密码 如何修改密码

如果你忘记了Ubuntu系统的密码&#xff0c;你可以通过以下方法来修改密码&#xff1a; 通过GRUB引导菜单进入恢复模式 重启系统并进入GRUB引导菜单&#xff1a; 重启Ubuntu系统&#xff0c;并在启动时连续按Shift键&#xff08;或根据系统提示的其他按键&#xff09;&#xf…

网站卡顿的各种情况分析

首先&#xff0c;确定这些问题是否存在。 1.服务器带宽是否超出&#xff1f; 2.服务器里面是否还存在着运行其他软件导致服务器卡顿&#xff1f; 3.服务器配置是否达到标准需求&#xff1f; 4.服务器是否会超出延迟标准&#xff0c;或者PING值掉包严重&#xff1f; 以上四个问题…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

中缀表达式求值

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 对于这个过程可以抽象为一颗二叉树来理解后序的做法&#xff08;理解过程&#xff0c;但不是最终解法&#xff09; 对于 1 2 * 2 - 1&#xff0c;可以通过中序遍历构建出一颗二叉树 计算过程为 对于上述过程可以总结出一个…

微信小程序浮标,可以拖动,自动靠边隐藏一半客服图标功能

不多说&#xff0c;直接上代码。全屏拖动无抖动&#xff0c;中间停留自动靠边&#xff0c;拖动隐藏一半&#xff0c;可自己根据代码改动为自己想要的效果 js代码 import { tpStaticUrl,basictpStaticUrl } from "../../../envConfig"; let app getApp(); Componen…

nginx-http-flv配置

hls配置 hls配置放在 http.server里面 http {server {# HTTP监听端口listen 8002;location /hls {types {application/vnd.apple.mpegurl m3u8;video/mp2t ts;}alias ./temp/hls; # HLS文件存放路径&#xff0c;请替换为你实际的路径expires -1;add_header Cache-Control no…