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;

    @Override
    public void invoke(Student student, AnalysisContext context) {
        System.out.println("读取到第 "+(i++)+" 行:"+student);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("\nxlsx文件读取结束");
    }
}

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

public class easyExcelTest {
    @Test
    public 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;

    @Override
    public void invoke(Student student, AnalysisContext context) {
        System.out.println("读取到第 " + (i++) + " 行:" + student);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("\nxlsx文件读取结束");
    }

    @Override
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public 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 {
    @Test
    public void writeTest() {
        String filePath = "C:\\Users\\liziq\\Desktop\\student.xlsx";
        // 此时 EasyExcel.write() 的参数不传入实体类.class
        try (ExcelWriter excelWriter = EasyExcel.write(filePath).build()) {
            //1. 创建不同的 sheet
            WriteSheet 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分别写入了不同的数据;
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

YOLOv8 Ultralytics:使用Ultralytics框架进行MobileSAM图像分割

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行MobileSAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行MobileSAM图像分割参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标&#xff08;Metrics&#xff09; 2.2.2 日志&#xff08;log&#xff09; 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

SMART PLC绝对值定位往复运动控制(脉冲绝对定位+状态机编程)

三菱FX3GA系列绝对定位指令DDRVA实现往复运动控制详细内容介绍请参考下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍SMART PLC里如何开启绝对值定位指…

隧道自动化监测系统的主要产品和监测内容

一、背景 随着交通行业的不断发展&#xff0c;隧道作为交通基础设施的重要组成部分&#xff0c;其安全和稳定性对于保障人们的生命财产安全具有重要意义。隧道自动化监测系统作为一种先进的安全监测手段&#xff0c;能够实时监测隧道内部的各项参数&#xff0c;为隧道的安全运…

CentOS 7.6的HTTP隧道代理如何支持移动设备和远程用户

在CentOS 7.6上配置HTTP隧道代理以支持移动设备和远程用户&#xff0c;需要考虑到移动网络的特点以及远程用户的需求。以下是一些关键步骤和策略&#xff0c;可以帮助你实现这一目标。 1. 优化移动设备体验 压缩数据&#xff1a;HTTP隧道代理可以用于压缩进出移动网络的数据&…

Fluent 动网格应用:2.5D 网格重构

1 概述 2.5D 网格重构是一种快速网格重构方法&#xff0c;主要应用于涡旋压缩机等存在复杂平面运动且无法简化为二维计算的问题。 涡旋压缩机工作原理&#xff08;视频源&#xff1a;维基百科&#xff09; 适用于 2.5D 动网格的问题特点&#xff1a; 计算域几何形状为柱体类形…

(菜鸟自学)搭建虚拟渗透实验室——安装Windows 7 靶机

安装Windows 7 靶机 新建一台虚拟机&#xff0c;并选择Windows 7系统 虚拟机基本配置如下 为虚拟机挂载Windows7的镜像 点击开启虚拟机&#xff0c;将进入安装程序&#xff0c;按如下步骤进行操作&#xff1a; 点击“下一步”》勾选“我接受许可条款”&#xff0c;点击“下…

【读书笔记】《重构_改善既有代码的设计》重构的方法论

重构的方法论 标题&#xff1a;【读书笔记】【读书笔记】《重构_改善既有代码的设计》重构的方法论 时间&#xff1a;2024.01.14 作者&#xff1a;耿鬼不会笑 重构是什么? 什么是重构&#xff1a; “重构”这个词既可以用作名词也可以用作动词。 重构&#xff08;名词&…

八. 实战:CUDA-BEVFusion部署分析-导出带有spconv的SCN网络的onnx

目录 前言0. 简述1. 使用spconv进行SCN的推理测试2. 导出onnx3. 补充-装饰器钩子函数总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章——实战&#x…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望&#xff0c;其中典型的是每每到重大节日尤其是双十一或者双十二&#xff0c;消费市场异常火爆&#xff0c;这也使得快递行业加班加点的干也不追不上人们下单的速度。如今&#xff0c;互联网时代崛起&#xff0c;网购成为了大家最寻…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统&#xff08;RDBMS&#xff09; SQLSQL介绍SQL类型SQL 基础语言学习创建表&#xff08;create table&#xff09;语法 数据类型SQL最常用的数据类型 学习链接 基础篇&#xff1a;数据库 SQL 入门教程 数据库 用于存储数据 存放…

2024年《一个项目征服Java中高级体系》博客计划

终于下决心来写一套大型的Java 笔记&#xff0c;不为别的&#xff0c;就是为了强迫自己将整个Java体系梳理清楚&#xff0c;让自己成为内功扎实的Java高级架构师。牛已经吹出来了&#xff0c;不做对不起网友&#xff01; 经过一个多月的持续规划&#xff0c;现在终于定好了整体…

Repo命令与git的关系

Repo命令与git的关系是很密切的。 我们都知道&#xff0c;git是一个开源的版本控制系统&#xff0c;常用在大型项目的管理上。 我们对repo的使用和了解就比较少了。Repo是一个基于Git构建出来的工具&#xff0c;它的出现不是为了取代Git&#xff0c;而是为了更方便开发者使用Gi…

vue倒计时60秒改变按钮状态效果demo(整理)

你可以使用Vue的计时器和绑定状态的方法来实现这个功能。 首先&#xff0c;在data中添加一个计时器countdown&#xff0c;初始值为0。 data() {return {countdown: 0} }<template><div><button click"startCountdown" :disabled"countdown > …

RestClient查询和结果处理的Java代码

match_all查询&#xff1a; //查询所有文档 match_all查询Testvoid testMatchAll() throws IOException {// 1.准备RequestSearchRequest request new SearchRequest("hotel");// 2.准备DSLrequest.source().query(QueryBuilders.matchAllQuery());// 3.发送请求Sea…

centos 7 上如何安装chrome 和chrome-driver

centos 7 上如何安装chrome 和chrome-driver 查找自己的服务器是什么系统 cat /etc/os-release这里以centos linux 7为例 下载google-chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm安装chrome sudo yum localinstall go…

Airtest-Selenium实操小课

1. 前言 上一课我们讲到用Airtest-Selenium爬取网站上我们需要的信息数据&#xff0c;还没看的同学可以戳这里看看~ 那么今天的推文&#xff0c;我们就来说说看&#xff0c;怎么实现看b站、刷b站的日常操作&#xff0c;包括点击暂停&#xff0c;发弹幕&#xff0c;点赞&#…

c语言实现b树

概述&#xff1a;B 树&#xff08;B-tree&#xff09;是一种自平衡的搜索树数据结构&#xff0c;广泛应用于数据库和文件系统等领域。它的设计旨在提供一种高效的插入、删除和查找操作&#xff0c;同时保持树的平衡&#xff0c;确保各个节点的深度相差不大。 B 树的特点包括&a…