EasyExcel简单实例

EasyExcel简单实例

  • 准备工作
  • 场景一:读取 Student 表
    • 需求1:简单读取
    • 需求2:读取到异常信息时不中断
    • 需求3:读取所有的sheet工作表
    • 需求4:读取指定的sheet工作表
    • 需求5:从指定的行开始读取
  • 场景二:写入 Student 表
    • 需求1:简单写入
    • 需求2:写入指定列
    • 需求3:指定写入列的名称和顺序
    • 需求4:写入多级表头
    • 需求5:重复写入
    • 需求6:往多个工作簿写入相同数据
    • 需求7:往多个工作簿写入不同数据

准备工作

导入easyExcel依赖,注意版本:

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>

场景一:读取 Student 表

需求1:简单读取

源表:
在这里插入图片描述

1. 编写实体类
可以使用 @ExcelProperty 指定数据封装为实体类对象的规则,后面可以跟index 和 列名(二选一);
若不加注解则按照默认封装规则: ①根据 Excel 列与实体类属性的顺序②根据 Excel 列的单元格式与对象字段类型匹配。

@Data
public class Student {@ExcelProperty("姓名")private String name;@ExcelProperty("年级")private String grade;@ExcelProperty("年龄")private int age;
}

2. 监听器
invoke():每读取一行就执行的方法,每一行数据会被封装成一个 student 对象(invoke方法的第一个参数);
doAfterAllAnalysed():读取结束后执行的方法;

class studentListener implements ReadListener<Student> {int i=1;@Overridepublic void invoke(Student student, AnalysisContext context) {System.out.println("读取到第 "+(i++)+" 行:"+student);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("\nxlsx文件读取结束");}
}

3. 测试类
read():读取workbook工作簿,传入文件路径、实体类、监听器;
sheet():选定读取的工作表,默认读取第一个;
doRead():执行读操作;

public class easyExcelTest {@Testpublic void readTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";EasyExcel.read(filePath,Student.class,new studentListener()).sheet().doRead();}
}

打印效果:
在这里插入图片描述

需求2:读取到异常信息时不中断

源表:
当出现了不符合数据类型的数据时,希望不中断读取
在这里插入图片描述
1. 实体类:
不变;
2. 监听器:
只需要调整监听器,在监听器加入 onException()方法;

class studentListener implements ReadListener<Student> {int i = 1;@Overridepublic void invoke(Student student, AnalysisContext context) {System.out.println("读取到第 " + (i++) + " 行:" + student);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("\nxlsx文件读取结束");}@Overridepublic void onException(Exception exception, AnalysisContext context) throws Exception {System.out.println("读取异常:"+exception);}
}

3. 测试类:
不变;

打印效果:
异常数据被打印,且不中断读取;
在这里插入图片描述

需求3:读取所有的sheet工作表

源表:
此时多个sheet都有数据;
在这里插入图片描述

1. 实体类
不变;
2. 监听器
不变;
3. 测试类
将sheet().doRead改为 doReadAll()

public class easyExcelTest {@Testpublic void readTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";EasyExcel.read(filePath,Student.class,new studentListener()).doReadAll();}
}

效果:
读取到了两个sheet的数据:
在这里插入图片描述

需求4:读取指定的sheet工作表

源表:
此时多个sheet都有数据;
在这里插入图片描述

1. 实体类
不变;
2. 监听器
不变;
3. 测试类
在sheet()中传递指定sheet的index索引或者名称即可:

public class easyExcelTest {@Testpublic void readTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";EasyExcel.read(filePath,Student.class,new studentListener()).sheet("Sheet2").doRead();EasyExcel.read(filePath,Student.class,new studentListener()).sheet("Sheet1").doRead();}
}

效果:
此时先指定读取sheet2,再读取sheet1;
在这里插入图片描述

需求5:从指定的行开始读取

源表:
假设此时有多行表头,内容需要从第3行开始读取;
在这里插入图片描述

1. 实体类
不变;
2. 监听器
不变;
3. 测试类
使用 headRowNumber(),参数中填写开始读取的行数;(默认从第2行开始读取,即headRowNumber()默认参数是索引1);
此时读取的内容要从第3行开始,索引为2,所以填入headRowNumber()的参数为2!

public class easyExcelTest {@Testpublic void readTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";EasyExcel.read(filePath,Student.class,new studentListener()).sheet("Sheet1").headRowNumber(2).doRead();}
}

效果:
在这里插入图片描述

场景二:写入 Student 表

需求1:简单写入

1. 实体类
需要比读取excel多添加实体类的构造函数;

@Data
public class Student {@ExcelProperty("姓名")private String name;@ExcelProperty("年级")private String grade;@ExcelProperty("年龄")private int age;public Student(){}public Student(String name, String grade, int age) {this.name = name;this.grade = grade;this.age = age;}
}

2. 模拟建数据的类
将每一行数据封装为Student对象,并放入一个List集合中;

class CreateData{public static List<Student> create(){List<Student> datas = Arrays.asList(new Student("张三","一年级",23),new Student("里斯","一年级",19),new Student("王五","一年级",22),new Student("赵六","一年级",21));return datas;}
}

3. 测试类
写的时候会自动将实体类的属性作为excel表的表头;
sheet()的参数为写入的工作表;
doWrite()的参数为要写入的数据,要求格式为Collection集合类型;

  • 写法1
public class easyExcelTest {@Testpublic void writeTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";EasyExcel.write(filePath,Student.class).sheet("学生表1").doWrite(CreateData.create()); // doWrite()的参数为 Collection 集合}
  • 写法2:
    适合写多个sheet;
public class easyExcelTest {@Testpublic void writeTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";try(ExcelWriter excelWriter=EasyExcel.write(filePath,Student.class).build()){WriteSheet writeSheet=EasyExcel.writerSheet("学生表2").build();excelWriter.write(CreateData.create(),writeSheet);}}

效果:
成功生成指定sheet表的数据!
在这里插入图片描述

需求2:写入指定列

  • 方法1:注解排除某列
    不写哪列就在对应的属性加上 @ExcelIgnore 属性;
    在这里插入图片描述

  • 方法2:给 excludeColumnFieldNames() 传入不包含的列
    注意:set中方的列明是实体类的属性名,而不是表格中的列名!
    在这里插入图片描述

  • 方法3:给 includeColumnFieldNames() 传入所有要写的列
    在这里插入图片描述

效果:
年龄age一列没有写入excel;
在这里插入图片描述

需求3:指定写入列的名称和顺序

1. 实体类
同样使用 @ExcelProperty 注解来指定写入列的名称和索引!
注意:顺序 index是从0开始的;
在这里插入图片描述

2. 模拟建数据的类
不变;
3. 测试类
不变;
效果:
在这里插入图片描述

需求4:写入多级表头

目标样式:
此时有多级表头;
在这里插入图片描述

  1. 实体类
    @ExcelProperty 注解中对表头进行分级!上层表头相同的属性就会归到一块!
    在这里插入图片描述
    2. 模拟建数据的类
    不变;
    3. 测试类
    不变;
    效果:
    在这里插入图片描述

需求5:重复写入

1. 实体类
不变;
2. 模拟建数据的类
不变;
3. 测试类
使用循环来实现重复写入;

public class easyExcelTest {@Testpublic void writeTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(filePath, Student.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("学生表1").build();for (int i = 0; i < 3; i++) {excelWriter.write(CreateData.create(), writeSheet);}}}
}

效果:
重复写入了3次;
在这里插入图片描述

需求6:往多个工作簿写入相同数据

1. 实体类
不变;
2. 模拟建数据的类
不变;
3. 测试类
使用循环来实现重复写入;

public class easyExcelTest {@Testpublic void writeTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(filePath, Student.class).build()) {for (int i = 1; i <= 3; i++) {WriteSheet writeSheet = EasyExcel.writerSheet("学生表"+i).build();excelWriter.write(CreateData.create(), writeSheet);}}}
}

效果:
三个sheet都有相同的数据;
在这里插入图片描述

需求7:往多个工作簿写入不同数据

此时要在不同的sheet写入 student 和 teacher两个不同的表!
1. 实体类
新增 Teacher 实体类;

@Data
public class Teacher {@ExcelProperty("姓名")private String name;@ExcelProperty("科目")private String subject;@ExcelProperty("年龄")private int age;public Teacher(){}public Teacher(String name, String subject, int age) {this.name = name;this.subject = subject;this.age = age;}
}

2. 模拟建数据的类
新增教师数据;

class CreateData {public static List<Student> createStudent() {List<Student> datas = Arrays.asList(new Student("张三", "一年级", 23),new Student("里斯", "一年级", 19),new Student("王五", "一年级", 22),new Student("赵六", "一年级", 21));return datas;}public static List<Teacher> createTeacher() {List<Teacher> datas = Arrays.asList(new Teacher("张老师", "政治", 41),new Teacher("李老师", "高数", 42),new Teacher("王老师", "线代", 39),new Teacher("赵老师", "英语", 40));return datas;}
}

3. 测试类
建立不同的sheet对象来写入;

public class easyExcelTest {@Testpublic void writeTest() {String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";// 此时 EasyExcel.write() 的参数不传入实体类.classtry (ExcelWriter excelWriter = EasyExcel.write(filePath).build()) {//1. 创建不同的 sheetWriteSheet studentSheet = EasyExcel.writerSheet("学生表").head(Student.class).build();WriteSheet teacherSheet = EasyExcel.writerSheet("教师表").head(Teacher.class).build();//2. 向不同的sheet写入数据excelWriter.write(CreateData.createStudent(), studentSheet);excelWriter.write(CreateData.createTeacher(), teacherSheet);}}
}

效果:
在两个sheet分别写入了不同的数据;
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3中ref和reactive联系与区别以及如何选择

vue3中ref和reactive区别与联系 区别 1、ref既可定义基本数据类型&#xff0c;也可以定义引用数据类型&#xff0c;reactive只能定义应用数据类型 2、ref在js中取响应值需要使用 .value&#xff0c;而reactive则直接取用既可 3、ref定义的对象通过.value重新分配新对象时依旧…

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角&#xff0c;去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构&#xff0c;而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式&#xff0c;重新定义了云服务的未来。 1.摒弃中心化的弊端 …

如何在 openKylin 上安装 ONLYOFFICE 文档?

文章作者&#xff1a;ajun ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档、电子表格和演示文稿的查看和编辑功能。它高度兼容微软 Office 格式&#xff0c;包括 .docx、.xlsx 和 .pptx 等文件格式&#xff0c;并支持实时协作编辑&#xff0c;使团队成员能…

边缘计算AI智能分析网关V4算力分析及应用场景

一、硬件介绍 智能分析网关V4是TSINGSEE青犀视频推出的一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz。硬件内置近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、…

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时&#xff0c;需要做关联。但很多情况下&#xff0c;也没有办法保证其中一张表的维度是全的&#xff0c;用left join或right join可能会导致数据丢失。所以借助full join处理。 1&#xff09;如&#xff0c;将下面的数据处理成表格中的效果&…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

Spring Boot 3 + Vue 3实战:实现用户登录功能

文章目录 一、实战概述二、实战步骤​&#xff08;一&#xff09;创建前端项目 - login-vue1、创建Vue项目2、安装axios模块3、安装vue-router模块4、安装less和less-loader模块5、运行Vue项目6、在浏览器里访问首页7、在IDEA里打开Vue项目8、创建登录Vue组件9、创建首页Vue组件…

rime中州韵小狼毫 词组注释 滤镜

教程目录&#xff1a;rime中州韵小狼毫须鼠管安装配置教程 保姆级教程 100增强功能配置教程 在rime中州韵小狼毫 联想词组 滤镜一文中&#xff0c;我们通过Filter滤镜功能配置了联想词组的功能&#xff0c;这使得我们在输入一些关键词汇时&#xff0c;可以联想补充一些附加的词…

HarmonyOS开发FA应用模型下多个页面的声明方式

目录 方式1 方式2 HarmonyOS配套的IDE是DevEco Studio&#xff0c;目前的版本是3.1。官网可以直接下载 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 ​ 方式1 ​在DevEco Studio如果是在pages目录通过右键New->ArkTS File生成的文件&#xff0c;需要注意&…

移动硬盘无法识别处理办法

今天这里做一下总结&#xff0c;我现在手上有一个移动硬盘&#xff0c;插入win10电脑是有盘号的&#xff0c;但是 但是点击就出问题 解决办法 安装DiskGenius 下载网址在https://www.diskgenius.cn/download.php 下载之后解压安装就行&#xff0c;非常简单&#xff0c;然后…

C++力扣题目501--二叉搜索树中的众数

给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

B端产品经理学习-版本规划管理

首先我们回顾一下用户故事&#xff0c;用户故事有如下特点&#xff1a; PRD文档的特点则如下&#xff1a; B端产品中用户角色不同&#xff0c;需求侧重也不同 决策人——公司战略需求&#xff1a;转型升级、降本增效、品牌提升等 管理负责人——公司管理需求&#xff1a;提升…

ROS2】MOMO的鱼香ROS2(六)ROS2入门篇——ROS2通信之参数与动作

ROS2通信之参数与动作 引言1 参数通信1.1 参数常用指令 2 参数之RCLPY实现2.1 创建功能包和节点2.2 编辑脚本文件parameters_basic.py2.3 编译测试 3 动作&#xff08;Action&#xff09;通信3.1 动作常用指令 3.2 自定义通信接口4 动作之RCLPY实现 引言 笔者跟着鱼香ROS的ROS…

全屏页面滚动个人简历模板源码

标题模板介绍 HTML5全屏页面滚动个人简历模板&#xff0c;响应式设计&#xff0c;自适应屏幕分辨率&#xff0c;兼容PC端 和手机移动端&#xff0c;单页面&#xff0c;多栏目&#xff0c;有工作经验、联系我、技能、关于我等栏目。 下载地址 CSDN下载

新版网易滑块

突然发现脸皮厚根本没用&#xff0c;大冬天的&#xff0c;风吹过来还是会冷。 大哥们多整件衣裳&#xff0c;好冷&#xff01;&#xff01;&#xff01;&#xff01; 网易更新了&#xff0c;这俩 dt跟f值。 dt为 这里返回的&#xff0c;忽略掉他。 data参数中的d值&#xff…

驾驭未来:从传统运维到智能化运维的转型之路

随着科技的飞速发展&#xff0c;企业的业务需求也在不断变化。为了满足这些需求&#xff0c;企业的IT架构逐渐向云原生、容器化和微服务化演进。作为支撑企业业务发展的运维人员&#xff0c;我们需要紧跟时代步伐&#xff0c;不断提升自己的技能和认知水平。 在2023年全球运维大…

python统计分析——操作案例(模拟抽样)

参考资料&#xff1a;用python动手学统计学 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as snsdata_setpd.read_csv(r"C:\python统计学\3-4-1-fish_length_100000.csv")[length] #此处将文件路径改为自己的路…

计算机网络 —— 数据链路层

数据链路层 3.1 数据链路层概述 数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。数据链路层使用的信道主要由以下两种类型&#xff1a; 点对点通信。广播通信。 数据链路和帧 链路&…

网络共享服务

存储类型&#xff1a;直连式&#xff08;DAS&#xff09;:距离最近&#xff0c;存储设备且直接连接到服务器上 存储区域网络&#xff08;SAN&#xff09;&#xff1a;适用于大型应用或数据库系统&#xff0c;可以使用文件的空间&#xff0c; 以及管理空间…

如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤

想阻止应用程序访问互联网吗&#xff1f;以下是如何通过简单的步骤阻止和允许Windows防火墙中的程序。​ 一般来说&#xff0c;大多数用户永远不需要担心应用程序访问互联网。然而&#xff0c;在某些情况下&#xff0c;你需要限制应用程序访问互联网。 例如&#xff0c;有问题…