EasyExcel写入和读取多个sheet

news2025/2/1 5:34:29

        最近在工作中,作者频频接触到Excel处理,因此也对EasyExcel进行了一定的研究和学习,也曾困扰过如何处理多个sheet,因此此处分享给大家,希望能有所帮助

目录

1.依赖

2. Excel类

3.处理Excel读取和写入多个sheet

4. 执行结果


1.依赖

        首先需要导入EasyExcel依赖(lombok只是为了写实体类方便)

    <dependencies>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
        </dependency>

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

    </dependencies>

2. Excel类

        编写输出的Excel类,这里以Class类和Student类为例

@ToString
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Class {
    @ExcelProperty("班级id")
    private Integer id;

    @ExcelProperty("班级名称")
    private String name;
}
@ToString
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    @ExcelProperty("班级id")
    private Integer classId;

    @ExcelProperty("学生id")
    private Integer id;

    @ExcelProperty("学生姓名")
    private String name;
}

3.处理Excel读取和写入多个sheet

        通过注册监听器的方式处理数据的加载以及异常捕获等事件

@Slf4j
public class ExcelProcess {

    public void read(File file) {
        List<Class> classes = new ArrayList<>();
        List<Student> students = new ArrayList<>();

        try {
            EasyExcel.read(file).sheet(0) //指定处理第一页sheet
                    .head(Class.class) // 指定Class类型
                    .registerReadListener(new ExcelReadListener<Class>(classes, file.getName())) //注册监听器,在监听器中进行进一步操作
                    .doRead();
            EasyExcel.read(file).sheet(1)//指定处理第二页sheet
                    .head(Student.class)// 指定Student类型
                    .registerReadListener(new ExcelReadListener<Student>(students, file.getName()))//注册监听器,在监听器中进行进一步操作
                    .doRead();
        } catch (Exception e) {
            e.printStackTrace();
        }

        classes.forEach(System.out::println);
        students.forEach(System.out::println);

    }

    public void write(File file) {
        List<Class> classes = new ArrayList<Class>();
        classes.add(new Class(1, "1班"));
        classes.add(new Class(2, "2班"));

        List<Student> students = new ArrayList<>();
        students.add(new Student(1, 1, "小明"));
        students.add(new Student(1, 2, "小红"));
        students.add(new Student(2, 3, "小黄"));
        students.add(new Student(2, 3, "小蓝"));

        try {
            writeExcel(file, "excel名称", classes, students);
        } catch (Exception e) {
            log.error("写入excel失败", e);
            throw e;
        }
    }

    /**
     * 正常web开发网络响应传入的是流,因此需要再给一个excel名称,这里用不到
     *
     * @param file
     * @param excelName
     * @param lists     需要写入的数据
     */
    private void writeExcel(File file, String excelName, List... lists) {
        ExcelWriter excelWriter = EasyExcel.write(file).build();
        for (int i = 0; i < lists.length; i++) {
            WriteSheet writeSheet = EasyExcel.writerSheet("sheet" + (i + 1))
                    .head(lists[i].get(0).getClass())
                    .build();
            excelWriter.write(lists[i], writeSheet);
        }
        excelWriter.finish();
    }

    public static void main(String[] args) {
        File file = new File("test.xlsx");
        ExcelProcess excelProcess = new ExcelProcess();

        excelProcess.write(file);
        excelProcess.read(file);
        
    }
}

@Slf4j
public class ExcelReadListener<T> extends AnalysisEventListener<T> {

    private final List<T> dataList;
    private String fileName;

    public ExcelReadListener(List<T> dataList, String fileName) {
        this.dataList = dataList;
        this.fileName = fileName;
    }

    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        //将当前读取到的数据加入集合
        dataList.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("Excel文件:" + fileName + " sheet:" + analysisContext.getCurrentSheet().getSheetName() + " 读取完成");
    }

    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException e = (ExcelDataConvertException) exception;
            throw new RuntimeException("文件读取异常,sheet:" + context.getCurrentSheet().getSheetName() +
                    " 第" + (e.getRowIndex() + 1) + "行第" + (char) ('A' + e.getColumnIndex()) + "列出错,请修改后重新上传\n"
                    , e);
        } else {
            log.error("excel导入时出错");
            throw new RuntimeException("系统异常,请重新上传", exception);
        }
    }
}

4. 执行结果

        如果大家有更好的处理方式,欢迎在评论区讨论

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lanqiaoOJ 2097:青蛙过河 ← 二分+前缀和+贪心

【题目来源】 https://www.lanqiao.cn/problems/2097/learning/ https://www.luogu.com.cn/problem/P8775 【题目描述】 小青蛙住在一条河边&#xff0c;它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。 备注&#xff1a;此图由百度 AI 创作生成 河里的石头排…

MybatisX插件快速创建项目

一、安装插件 二、创建一个数据表测试 三、IDEA连接Mysql数据库 四、选择MybatiX构造器 五、配置参数 六、项目结构

llama3学习

首先是预训练部分&#xff0c;数据注意版权和风险问题。数据去重和数据清理&#xff0c;PII人的身份信息&#xff08;人名、地址等&#xff09;。如果数据有大量PII数据则这个数据丢掉。 网页的数据&#xff0c;提取&#xff0c;代码和数学的提取的特别的方法&#xff0c;OCR…

H3CNE-31-BFD

Bidirectional Forwarding Dection&#xff0c;双向转发检查 作用&#xff1a;毫秒级故障检查&#xff0c;通常结合三层协议&#xff08;静态路由、vrrp、ospf、BGP等&#xff09;&#xff0c;实现链路故障快速检查。 BFD配置示例 没有中间的SW&#xff0c;接口down&#xff…

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位取反运算&#xff1a;一个二进制数&#xff0c;0变1,1变0。 【1】…

Ability Kit(程序框架服务)

Ability Kit&#xff08;程序框架服务&#xff09;提供了应用程序开发和运行的应用模型&#xff0c;是系统为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&am…

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。 拦截器是Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 拦截器的作用&#xff1a;拦截请求&#xff0c;在指定方法调用前后&#xff0c;根…

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序

目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子&#xff1a; POST请求的例子&#xff1a; 3. 案例&#xff1a;…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

傅里叶分析之掐死教程

https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复杂了&#xff0c;所以很多…

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器&#xff0c;根据需要的版本和自己硬件选择。 iso-cd/&#xff1a;较小&#xff0c;仅包含安装所需的基础组件&#xff0c;可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/&#xff1a;较…

乐理笔记——DAY02

三分钟音乐社视频地址&#xff1a; 调号总结篇https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&p25https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.epis…

企业知识管理在推动组织变革与适应性发展中的关键性作用分析

内容概要 企业知识管理是信息时代背景下的重要管理理念&#xff0c;旨在通过有效地获取、分享和再利用知识&#xff0c;提升组织在变革中的灵活性和创新能力。知识作为企业的重要资产&#xff0c;其有效管理不仅影响到日常运营&#xff0c;更是推动组织变革与适应性发展的核心…

动态规划DP 最长上升子序列模型 登山(题目分析+C++完整代码)

概览检索 动态规划DP 最长上升子序列模型 登山 原题链接 AcWing 1014. 登山 题目描述 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景点&#xff0c;并且决定按照顺序来浏览这些景点&#xff0c;即每次所浏览景点的编号都要大于前一个…

芯片AI深度实战:进阶篇之vim内verilog实时基于AST的自定义检视

本文基于Editor Integration | ast-grep&#xff0c;以及coc.nvim&#xff0c;并基于以下verilog parser(my-language.so&#xff0c;文末下载链接), 可以在vim中实时显示自定义的verilog 匹配。效果图如下&#xff1a; 需要的配置如下&#xff1a; 系列文章&#xff1a; 芯片…

AI 计算的未来:去中心化浪潮与全球竞争格局重塑

引言 人工智能(AI)正以前所未有的速度发展,尤其是大模型训练和推理效率的提升,使得 AI 计算成本迅速下降,呈现出向去中心化演进的趋势。 最新的 DeepSeek r1 模型,以仅 600 万美元 的训练成本,达到了 OpenAI o1 级别的性能,表明 AI 技术正迈向更具普惠性的阶段。这一趋…

JxBrowser 8.2.2 版本发布啦!

JxBrowser 8.2.2 版本发布啦&#xff01; • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 &#x1f517; 点击此处了解更多详情。 &#x1f193; 获取 30 天免费试用。

BWM 世界模型

DGX AGX Ominiverse With Cosmos 功能 1w 张 H100 训练了 3个月 使用 Ray 串流 数据 数据准备 处理 pipeline 数组组成 真实世界的物理数据 训练 1、使用 L1 损失&#xff0c;最小化 输入和重构视频之间的像素级差异 以及基于 VGG19 的一个特征感知损失 2、使用光流的损…

【已解决】windows7虚拟机安装VMtools频繁报错

为了在虚拟机VMware中安装win7&#xff0c;题主先在网上下载了windows7 professional版本的镜像&#xff0c;在vmware中安装vmtools时报错&#xff0c;信息如下 &#xff08;安装程序无法继续&#xff0c;本程序需要您将此虚拟机上安装的操作系统更新到SP1&#xff09; 然后就…

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…