EasyExcel写出包含多个sheet页的Excel

news2025/1/3 11:43:18

EasyExcel导出包含多个sheet页的Excel

1.引入依赖

引入如下的EasyExcel的依赖,或直接下载jar包

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

2.构建数据封装bean(测试数据封装bean,除了类中的注解,其他信息无需过多关注)

2.1User类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;

// @ColumnWidth作用:设置全局列宽为20
@ColumnWidth(20)
// @ContentStyle作用:设置全局内容居中
@ContentStyle(verticalAlignment = VerticalAlignmentEnum.CENTER, horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class User {

    // @ExcelProperty作用:设置列标题名称
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("年龄")
    private int age;
    @ExcelProperty("身高")
    private int height;

    public User() {
    }

    public User(String name, int age, int height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}}
}", height=" + height +
                '}';
    }
}

2.2Department类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;

// 设置全局列宽为20
@ColumnWidth(20)
// 设置全局内容居中
@ContentStyle(verticalAlignment = VerticalAlignmentEnum.CENTER, horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class Department {

    // @ExcelProperty作用:设置列标题名称
    @ExcelProperty({"部门基本属性", "部门名称"})
    private String deptName;

    @ExcelProperty({"部门基本属性", "部门Code"})
    private String deptCode;

    @ExcelProperty({"部门其他属性", "部门地址"})
    private String deptLocation;

    @ExcelProperty({"部门其他属性", "部门类型"})
    private String deptType;

    public Department() {
    }

    public Department(String deptName, String deptCode, String deptLocation, String deptType) {
        this.deptName = deptName;
        this.deptCode = deptCode;
        this.deptLocation = deptLocation;
        this.deptType = deptType;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public String getDeptCode() {
        return deptCode;
    }

    public void setDeptCode(String deptCode) {
        this.deptCode = deptCode;
    }

    public String getDeptLocation() {
        return deptLocation;
    }

    public void setDeptLocation(String deptLocation) {
        this.deptLocation = deptLocation;
    }

    public String getDeptType() {
        return deptType;
    }

    public void setDeptType(String deptType) {
        this.deptType = deptType;
    }

    @Override
    public String toString() {
        return "Department{" +
                "deptName='" + deptName + '\'' +
                ", deptCode='" + deptCode + '\'' +
                ", deptLocation='" + deptLocation + '\'' +
                ", deptType='" + deptType + '\'' +
                '}';
    }
}   ", deptType='" + deptType + '\'' +
                '}';
    }
}

2.3Goods类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;

// 设置全局列宽为20
@ColumnWidth(20)
// 设置全局内容居中
@ContentStyle(verticalAlignment = VerticalAlignmentEnum.CENTER, horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class Goods {

    // @ExcelProperty作用:设置列标题名称
    @ExcelProperty({"零食基本属性", "名称"})
    private String goodsName;

    @ExcelProperty({"零食基本属性", "类型"})
    private String goodsType;

    @ExcelProperty({"相关时间", "生产日期"})
    private String goodsProduceDate;

    @ExcelProperty({"相关时间", "保质期"})
    private String goods2Date;

    @ExcelProperty({"工厂", "核心厂"})
    private String goodsFactoryAddressMain;

    @ExcelProperty({"工厂", "副厂"})
    private String goodsFactoryAddressChild;

    public Goods() {
    }

    public Goods(String goodsName, String goodsType, String goodsProduceDate, String goods2Date, String goodsFactoryAddressMain, String goodsFactoryAddressChild) {
        this.goodsName = goodsName;
        this.goodsType = goodsType;
        this.goodsProduceDate = goodsProduceDate;
        this.goods2Date = goods2Date;
        this.goodsFactoryAddressMain = goodsFactoryAddressMain;
        this.goodsFactoryAddressChild = goodsFactoryAddressChild;
    }

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public String getGoodsType() {
        return goodsType;
    }

    public void setGoodsType(String goodsType) {
        this.goodsType = goodsType;
    }

    public String getGoodsProduceDate() {
        return goodsProduceDate;
    }

    public void setGoodsProduceDate(String goodsProduceDate) {
        this.goodsProduceDate = goodsProduceDate;
    }

    public String getGoods2Date() {
        return goods2Date;
    }

    public void setGoods2Date(String goods2Date) {
        this.goods2Date = goods2Date;
    }

    public String getGoodsFactoryAddressMain() {
        return goodsFactoryAddressMain;
    }

    public void setGoodsFactoryAddressMain(String goodsFactoryAddressMain) {
        this.goodsFactoryAddressMain = goodsFactoryAddressMain;
    }

    public String getGoodsFactoryAddressChild() {
        return goodsFactoryAddressChild;
    }

    public void setGoodsFactoryAddressChild(String goodsFactoryAddressChild) {
        this.goodsFactoryAddressChild = goodsFactoryAddressChild;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "goodsName='" + goodsName + '\'' +
                ", goodsType='" + goodsType + '\'' +
                ", goodsProduceDate='" + goodsProduceDate + '\'' +
                ", goods2Date='" + goods2Date + '\'' +
                ", goodsFactoryAddressMain='" + goodsFactoryAddressMain + '\'' +
                ", goodsFactoryAddressChild='" + goodsFactoryAddressChild + '\'' +
                '}';
    }
}

3.SheetInfoBean类

SheetInfoBean是用来封装sheet页相关信息的,使用bean将sheet页相关信息封装起来,可以使代码更加简洁优雅,可以根据实际需求,自行设计bean

import java.util.List;

public class SheetInfoBean {

    /**
     * sheet页名称
     */
    private String sheetName;

    /**
     * sheet标题bean
     */
    private Class<?> headClass;

    /**
     * sheet页数据
     */
    private List<?> dataList;

    public SheetInfoBean() {
    }

    public SheetInfoBean(String sheetName, Class<?> headClass, List<?> dataList) {
        this.sheetName = sheetName;
        this.headClass = headClass;
        this.dataList = dataList;
    }

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }

    public Class<?> getHeadClass() {
        return headClass;
    }

    public void setHeadClass(Class<?> headClass) {
        this.headClass = headClass;
    }

    public List<?> getDataList() {
        return dataList;
    }

    public void setDataList(List<?> dataList) {
        this.dataList = dataList;
    }

    @Override
    public String toString() {
        return "SheetInfoBean{" +
                "sheetName='" + sheetName + '\'' +
                ", headClass=" + headClass +
                ", dataList=" + dataList +
                '}';
    }
}

4.测试

以下是测试代码

@Test
    void test04() {
        // 构造用户数据
        List<User> userList = new ArrayList<>();
        userList.add(new User("小红", 18, 168));
        userList.add(new User("小白", 17, 165));
        userList.add(new User("小蓝", 18, 169));

        // 构造部门数据
        List<Department> deptList = new ArrayList<>();
        deptList.add(new Department("java开发部", "DEV001", "南京", "总部"));
        deptList.add(new Department("测试部", "TEST001", "上海", "研发中心"));
        deptList.add(new Department("财务", "ECONOMY001", "南京", "总部"));

        // 构造产品数据
        List<Goods> goodsList = new ArrayList<>();
        goodsList.add(new Goods("小面包", "速食", "2023-07-21", "3天", "成都", "上海"));
        goodsList.add(new Goods("旺旺仙贝", "膨化食品", "2023-07-21", "3天", "仙贝中心", "山寨仙贝厂"));
        goodsList.add(new Goods("领克03", "汽车", "2023-07-21", "永久", "领克工厂", "领克副厂"));

        // 构造各个sheet页相关信息
        List<SheetInfoBean> sheetInfoList = new LinkedList<>();
        sheetInfoList.add(new SheetInfoBean("用户信息", User.class, userList));
        sheetInfoList.add(new SheetInfoBean("部门信息", Department.class, deptList));
        sheetInfoList.add(new SheetInfoBean("产品信息", Goods.class, goodsList));

        // 导出文件
        File file = new File("C:\\Users\\Administrator\\Desktop\\多sheet导出测试.xlsx");
        try(ExcelWriter excelWriter = EasyExcel.write(file).build()) {
            WriteSheet writeSheet;
            for (SheetInfoBean bean : sheetInfoList) {
                // 构建sheet对象
                writeSheet = EasyExcel.writerSheet(bean.getSheetName()).head(bean.getHeadClass()).build();
                // 写出sheet数据
                excelWriter.write(bean.getDataList(), writeSheet);
            }
            // 关流
            excelWriter.finish();
        } catch (Exception e) {
            // do something you want
        }
    }

5.运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.总结

以上是EasyExcel一个Excel文件导出多个sheet页的demo代码,其中重点代码为

 try(ExcelWriter excelWriter = EasyExcel.write(file).build()) {
  WriteSheet writeSheet;
  for (SheetInfoBean bean : sheetInfoList) {
     // 构建sheet对象
     writeSheet = EasyExcel.writerSheet(bean.getSheetName()).head(bean.getHeadClass()).build();
     // 写出sheet数据
     excelWriter.write(bean.getDataList(), writeSheet);
  }
  // 关流
  excelWriter.finish();
} catch (Exception e) {
 // do something you want
}

大家可以根据自己的需求,将该代码片段进行改造或封装成工具类,以适应自己的业务需求

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

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

相关文章

文心千帆大模型平台,一站式企业级大模型平台

文心千帆大模型平台&#xff0c;一站式企业级大模型平台 0. 前言1. 人工智能发展历程1.1 传统机器学习1.2 深度学习1.3 大模型时代 2. 文心千帆2.1 文心千帆介绍2.2 文心千帆应用场景2.3 文心千帆平台优势 3. 文心千帆初体验3.1 注册流程3.2 创建应用3.3 在线测试3.4 数据服务3…

玩转ChatGPT:Custom instructions (vol. 1)

一、写在前面 据说GPT-4又被削了&#xff0c;前几天让TA改代码&#xff0c;来来回回好几次才成功。 可以看到之前3小时25条的限制&#xff0c;现在改成了3小时50条&#xff0c;可不可以理解为&#xff1a;以前一个指令能完成的任务&#xff0c;现在得两条指令&#xff1f; 可…

如何将windows下的应用程序直接放到ubuntu下运行

安装wine https://blog.csdn.net/gc_2299/article/details/129077372 安装.NET https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472

Vue中的props配置

结构&#xff1a; main.js //引入Vue import Vue from vue //引入App import App from "./App"; //关闭Vue的生产提示 Vue.config.productionTip false//创建vm new Vue({el:#app,render:h>h(App) }) App.vue <template><div><Student name&qu…

运行Yolov5 7.0遇到的问题

遇到的错误 Traceback (most recent call last):File "E:\Users\user\anaconda3\envs\torch17\lib\site-packages\git\__init__.py", line 89, in <module>refresh()File "E:\Users\user\anaconda3\envs\torch17\lib\site-packages\git\__init__.py"…

RocketMQ Windows环境下启动导致C盘爆满原因及解决办法

原因 rocketmq取的默认路径是user.home路径&#xff0c;也就是用户的根目录&#xff0c;一般存储放在跟路径下的 /store目录。 在源码中也可以看到&#xff1a; 这里会有一个问题&#xff0c;RocketMQ很容易导致C盘空间不够&#xff0c;在使用过程中&#xff0c;创建一个主题默…

二,jmeter的简介和使用

文章目录 一、jmeter简介及安装1. 简介2. 安装 二、jmeter设置语言三、jmeter文件路径说明四、编写jmeter脚本五、乱码的处理&#xff1a;1. 请求内容出现乱码处理方法2. 响应内容出现乱码处理方法 六、写脚本方法扩展录制脚本&#xff1a; 七、 脚本功能增强 一、jmeter简介及…

pytorch学习——第二个模型(逻辑回归)

参考该博客系统学习Pytorch笔记二&#xff1a;Pytorch的动态图、自动求导及逻辑回归 c l a s s { 0 0.5 > y 1 0.5 ≤ y class\left\{ \begin{array}{rcl} 0 & & {0.5 > y}\\ 1 & & {0.5 \le y}\\ \end{array} \right. class{01​​0.5>y0.5≤y​ 根…

图数据库Neo4j学习一——基本介绍

文章目录 1各类数据库基本概念1.1关系型数据库&#xff08;SQL&#xff09;1.2非关系型数据库&#xff08;NoSQL&#xff09;1.3图数据库1.3.1图数据库特点1.3.2图数据库应用场景 2图数据库基本概念2.1用户访问菜单2.2节点&#xff08;用户、角色、菜单&#xff09;2.3关系&…

动态规划:从入门到入土系列(一)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 前言 本篇…

高级web前端开发工程师岗位的具体内容概述

高级web前端开发工程师岗位的具体内容概述1 职责&#xff1a; 1、负责前端页面开发和维护&#xff0c;并根据需求优化产品性能、用户体验、交互效果及各种主流浏览器以及各类型移动客户端的兼容适配工作; 2、配合产品经理和UI设计师&#xff0c;通过各种前端技术手段&#xf…

[MySQL]MySQL用户管理

[MySQL]MySQL用户管理 文章目录 [MySQL]MySQL用户管理1. 用户的概念2. 用户信息3. 创建用户4. 修改用户密码5. 删除用户6. MySQL中的权限7. 给用户授权8. 回收权限 1. 用户的概念 MySQL中的用户分为超级用户&#xff08;root&#xff09;和普通用户。超级用户的操作是不受权限…

IDEA对JPA@Query查询的文本块支持

IDEA对JPAQuery查询的文本块支持 参考网址 JPA查询方式&#xff1a;方法命名规则、Query查询、结果集类型转化器 原先JPA的Query注解查询存在的问题 编写SQL时需要在value的""内&#xff0c;使用换行时会拼接字符串&#xff0c;观感极差如果SQL中使用到了单引号&…

第三十二章:MySQL事务日志

第三十二章&#xff1a;MySQL事务日志 32.1&#xff1a;概述 事物有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事物的隔离性有锁机制实现。而事物的原子性、一致性和持久性由事物的redo日志和undo日志来…

基于深度学习淡水鱼体重智能识别模型研究

工作原理为&#xff1a;首先对大众淡水鱼图片进行数据清洗并做标签分类&#xff0c;之后基于残差网络ResNet50模型进行有监督的分类识别训练&#xff0c;获取识别模型。其次通过搭建回归模型设计出体重模型&#xff0c;对每一类淡水鱼分别拟合出对应的回归方程&#xff0c;将获…

【基础算法】——双指针算法

文章目录 一、算法原理二、算法实战1. 力扣283 移动零2. 力扣1089 复写零3. 力扣15 三数之和4. 力扣18 四数之和 三、总结 一、算法原理 双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向(快慢指针)或者相反方向&#xff08;…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析&#xff0c;生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务&#xff0c;通过将相似的文本样本分组&#xff0c;可以帮助我们发现隐藏在文本数据中的模式和结…

Docker概述 镜像-容器基本操作

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足…

Redis应用(7)——Redis的项目应用(六):布隆过滤器---白名单 ----> Reids的问题,雪崩/ 击穿 / 穿透【重要】 布隆过滤器

目录 引出Redis的问题缓存雪崩&#xff1a;key不存在缓存击穿&#xff1a;热点key缓存穿透【重要】 穿透的解决方案&#xff1a;布隆过滤器问题&#xff1a;如何存储100w纯数字布隆过滤器项目应用&#xff1a;布隆过滤器≈白名单htool工具包案例 Redis项目应用&#xff08;六&a…

OpenCV4图像处理-图像交互式分割-GrabCut

本文将实现一个与人&#xff08;鼠标&#xff09;交互从而分割背景的程序。 GrabCut 1.理论介绍2. 鼠标交互3. GrabCut 1.理论介绍 用户指定前景的大体区域&#xff0c;剩下为背景区域&#xff0c;还可以明确指出某些地方为前景或者背景&#xff0c;GrabCut算法采用分段迭代的…