EasyExcel 初使用—— Java 实现多种写入 Excel 功能
前言
大家好,我是雪荷。之前有一篇博客(EasyExcel 初使用—— Java 实现读取 Excel 功能_java easyexcel.read-CSDN博客)介绍了 Java 如何读取 Excel 表格,那么此篇博客就和大家介绍下 Java 如何利用 EasyExcel 写入 Excel。
EasyExcel 官方网址:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel
前置准备
引入依赖
先创建一个 Spring Boot 工程,随后加入 EasyExcel 和 Lombok 依赖。
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>
设置一个写对象,即写入 Excel 的对象
@Data
@AllArgsConstructor
public class SaleData implements Serializable {@ExcelProperty("订单号")private Long id;@ExcelProperty("品种")private String name;@ExcelProperty("价格")private BigDecimal price;@ExcelProperty("数量")private Integer totalNum;@ExcelProperty("用户ID")private Long userId;@ExcelProperty("交易时间")private String datetime;
}
写入 Excel
最简单的写入 Excel 方式
看代码也能看出来,首先有一个写入 Excel 的对象 List,其次指定 Excel 表格的位置和表单名称,最后进行调用 write 方法将 list 写入 Excel 即可。
@Testpublic void simpleWriteDataToExcel() {List<SaleData> list = new ArrayList<>();list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));String fileName = "D:\\projects\\plant-sys-main\\src\\main\\resources\\销售数据1.xlsx";//写入excelEasyExcel.write(fileName, SaleData.class).sheet("Sheet1").doWrite(list);}
写入效果:
如果 EasyExcel.write() 方法不带上 SaleData.class,就表示未指定表头,那这样写入 Excel 时是直接写入的,但没有表头。
没指明表头的写入效果:
根据参数写入指定列
与上一种方法类似,无非多了两个 Set,一个需要写入的 Set,另一个不需要写入的 Set。
@Testpublic void excludeOrIncludeWrite() {List<SaleData> list = new ArrayList<>();list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));String fileName = "D:\\projects\\plant-sys-main\\src\\main\\resources\\销售数据2.xlsx";// 无需写入的 Set 集合Set<String> excludSet = new HashSet<>();excludSet.add("id");// 需要写入的 Set 集合Set<String> includeSet = new HashSet<>();includeSet.add("userId");// 指定两个 Set,并写入 ExcelEasyExcel.write(fileName, SaleDetailVO.class).includeColumnFieldNames(includeSet).excludeColumnFiledNames(excludSet).sheet("Sheet1").doWrite(list);}
在此段代码中,我指定了 id 不需要写入 Excel,userId 需要写入 Excel。最终可以看出,只有 userId 被写入 Excel 中。
写入指定的列
可以利用 ExcelProperty 注解的 index 属性,指定某些字段写到 Excel 的某一列。
@Data
@AllArgsConstructor
public class SaleData implements Serializable {@ExcelProperty(value = "订单号", index = 1)private Long id;@ExcelProperty(value = "品种", index = 2)private String name;@ExcelProperty(value = "价格", index = 3)private BigDecimal price;@ExcelProperty(value = "数量", index = 4)private Integer totalNum;@ExcelProperty(value = "交易对象", index = 5)private Long userId;@ExcelProperty(value = "交易时间", index = 6)private String datetime;
}
代码很简单我就不多解释了,相较于最简单的写入 Excel 方式,唯一不同的就是加了写入对象的 index 属性。
@Testpublic void writeSpecificColumn() {List<SaleData> list = new ArrayList<>();list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));String fileName = "D:\\projects\\plant-sys-main\\src\\main\\resources\\销售数据3.xlsx";EasyExcel.write(fileName, SaleDetailVO.class).sheet("Sheet1").doWrite(list);}
可以看出来,第一列被没有被写入,因为我的 index 是从 1 开始的,表格的第一列 index(索引) 为 0。最终效果如下:
复杂的头写入
这个复杂头写入不太好解释,所以大家直接看代码和写入效果就懂了。
@Data
@AllArgsConstructor
public class SaleData implements Serializable {@ExcelProperty({"主标题", "订单号"})private Long id;@ExcelProperty({"主标题", "品种"})private String name;@ExcelProperty({"主标题", "价格"})private BigDecimal price;@ExcelProperty({"主标题", "数量"})private Integer totalNum;@ExcelProperty({"主标题", "交易对象"})private Long userId;@ExcelProperty({"主标题", "交易时间"})private String datetime;
}
@Testpublic void complexHeadWrite() {QueryWrapper<Sale> queryWrapper = new QueryWrapper<>();queryWrapper.orderBy(true, false, "createTime");List<Sale> saleList = saleService.list(queryWrapper);List<SaleDetailVO> saleDetailVOList = saleList.stream().map(sale -> {SaleDetailVO saleDetailVO = new SaleDetailVO();saleDetailVO.setId(sale.getId());Date createTime = sale.getCreateTime();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String datetime = dateFormat.format(createTime);saleDetailVO.setDatetime(datetime);saleDetailVO.setTotalNum(sale.getTotalNum());saleDetailVO.setUserId(sale.getUserId());Plant plant = plantService.getById(sale.getPlantId());saleDetailVO.setPrice(plant.getPrice());saleDetailVO.setName(plant.getName());return saleDetailVO;}).collect(Collectors.toList());String fileName = "D:\\projects\\plant-sys-main\\src\\main\\resources\\销售数据4.xlsx";EasyExcel.write(fileName, SaleData.class).sheet("Sheet1").doWrite(saleDetailVOList);}
运行效果:
重复多次写入
前几种写入方式都只能在数据量不大的情况下才可使用,这个数量是指在 5000 一下,超过这个量级我们就得换种方式了,在此我就介绍一下官方演示的重复多次写入 Excel 方式。
老实说看代码并不复杂,也就是加了个 for 循环罢了,对于重复多次写入,我们不仅可以写入不同的表单(Sheet)还能写入不同的对象,甚至写入不同的数据(即写入不同的 list)。
利用这个方式我们可以在循环中调整不同的分页参数,然后分页查询数据库并把查到的数据写入 Excel 中,是不是很巧妙啊,要是一次性写入的话内存会溢出的。
可能有人会问怎么写入不同的表单(Sheet)和对象,我这里提供个思路,你可以创建一个表单或者对象集合,可以是 List 也可以是 Map,然后根据循环的 i 去获取对应的元素嘛。
@Testpublic void repeatedWrite() {List<SaleData> list = new ArrayList<>();list.add(new SaleData(1L, "苹果", new BigDecimal("10.00"), 10, 1L,"2024-01-01 13:00:00"));list.add(new SaleData(2L, "梨子", new BigDecimal("12.00"), 10, 1L,"2025-01-01 13:00:00"));list.add(new SaleData(3L, "西瓜", new BigDecimal("5.00"), 10, 1L,"2024-03-01 13:00:00"));list.add(new SaleData(4L, "香蕉", new BigDecimal("7.00"), 10, 1L,"2024-02-01 13:00:00"));String fileName = "D:\\projects\\plant-sys-main\\src\\main\\resources\\销售数据5.xlsx";// 写入不同对象,不同 sheettry (ExcelWriter excelWriter2 = EasyExcel.write(fileName, SaleData.class).build()) {for (int i = 0; i < 5; i++) {// 这里每次都要创建writeSheet,这里注意必须指定writerSheet,而且sheetNo必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个classWriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(SaleData.class).build();// 分页去数据库查询数据,这里可以去数据库查询每一页的数据excelWriter2.write(list, writeSheet);}}}
写入效果如下,我们可以看到共有 5 个表单,因为我们循环写入了 5 个不同的表单,并且每个表单数据都是一样的。
Java 读取 Excel
想要了解 Java 如何实现读取 Excel 的小伙伴可以看看这篇文章哈——EasyExcel 初使用—— Java 实现读取 Excel 功能_java easyexcel.read-CSDN博客。
在学习的过程中有任何问题都可以问我,如果你觉得还不错的话就给我点个赞吧。
开源项目
前一阵子,我开源了一个既好玩又能学到东西的项目,有兴趣的同学可以移步学习和体验哈——我终于有我的开源项目了!!!-CSDN博客。
相关文章:

EasyExcel 初使用—— Java 实现多种写入 Excel 功能
前言 大家好,我是雪荷。之前有一篇博客(EasyExcel 初使用—— Java 实现读取 Excel 功能_java easyexcel.read-CSDN博客)介绍了 Java 如何读取 Excel 表格,那么此篇博客就和大家介绍下 Java 如何利用 EasyExcel 写入 Excel。 Ea…...

MySQL 和 SQL Server 中的连表更新 UPDATE JOIN 写法比较
MySQL 和 SQL Server 中的连表更新 UPDATE JOIN 写法比较 一、前言1. MySQL 写法1.1 解释 2. SQL Server 写法2.1 解释 二、总结 一、前言 在关系型数据库管理系统(RDBMS)中,使用 UPDATE 语句进行表格更新是非常常见的操作。特别是当需要根据…...

手把手教你FL Studio 24.1.1.4234中文破解安装激活图文激活教程
在数字化音乐制作的浪潮中,FL Studio 24.1.1.4234中文破解版的发布无疑又掀起了一股新的热潮。这款由Image-Line公司开发的数字音频工作站(DAW)软件,以其强大的功能和易用的界面,赢得了全球无数音乐制作人的青睐。本文…...

使用Spring Boot与Spire.Doc实现Word文档的多样化操作
博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势: 强大的功能组合:Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力,而Spire.Doc则…...

从食堂采购系统源码到成品:打造供应链采购管理平台实战详解
本篇文章,笔者将详细介绍如何从食堂采购系统的源码开始,逐步打造一个完备的供应链采购管理平台,帮助企业实现采购流程的智能化和高效化。 一、需求分析与规划 一般来说,食堂采购系统需要具备以下基本功能: 1.供应商…...

在window将Redis注册为服务
将redis注册为系统服务,开启自启动 安装服务 默认注册完之后会自动启动,在window中的服务看一下,如果启动类型为自动,状态是自动运行则启动完成。如果是手动,需要右键属性调整为自动,在点击启动,…...

PHP商城案例
http://www.e9933.com/...

Linux:bash在被调用时会读取哪些启动文件?
(本文基于5.1-6ubuntu1.1版本的bash) bash在被调用时会读取哪些启动文件?要回答这个问题,首先要弄清楚两个概念:login shell和interactive shell。 login shell login shell是指这样的shell: 第一个命令行参数(进程…...

帆软FineReport之替换函数
在日常帆软FineReport中经常会使用字符串替换函数,记录下来,方便备查。 一、字符串替换 第一种、指定文本替换 使用SUBSTITUTE函数,语法如下所示 SUBSTITUTE(text,old_text,new_text,instance_num) 字段…...

Redis的应用场景及类型
目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下,我们就可以把 Mys…...

【图像处理】不智能的目标识别
目录 目标识别的划分 识别入门 概念学习 滤波 模版 阈值化 形态学操作 开运算 闭运算 编程语言 示例 大家有没有想过在没有人工智能或者说没有机器学习的的时候,计算机是怎么做目标识别的? 计算机视觉时至今日也是急需人才的领域&…...

《500 Lines or Less》(5)异步爬虫
https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源,而是打开许多缓慢的连接,解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…...

Transformer!自注意力机制的高层级理解Attention Is All You Need!
背景 最近在不断深入学习LLM的相关内容,那么transformer就是一个绕不开的话题。然而对于一个NLP门外汉来说,论文看得是真头疼,总览全网,我们似乎缺少一个至高而下的高层级理解。所以本文就来弥补此方面的缺失~ 本文并不讲解有关…...

关于使用Postman在请求https网址没有响应,但是用浏览器有响应的问题解决
一、问题描述 使用postman调用正式环境的公共接口,无需鉴权,但是产生了返回状态码200,但是data中却无数据,如下 {"code": "200","message": "操作成功","data": {"qr_c…...

【React 】开发环境搭建详细指南
文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中,React 是一个非常流行的框架,用…...

结构体笔记
结构体 C语言中的数据类型: 基本数据类型:char/int/short/double/float/long 构造数据类型:数组,指针,结构体,共用体,枚举 概念: 结构体是用户自定义的一种数据类型,…...

Elasticsearch:Golang ECS 日志记录 - zerolog
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。在本教程中,我将详述如何 编码器以 JSON 格式记录日志,并以 ECS 错误格式处理错误字段的记录。 默认情况下,会添加以下字段&…...

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用
文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…...

研发管理革命:探索顶尖的工时系统选择
国内外主流的10款研发工时管理系统对比:PingCode、Worktile、无鱼项目工时系统、Toggl Track、泽众ALM、Asana、Jira、GitHub、Trello、TrackingTime。 在研发团队中,工时管理常常成为效率瓶颈,尤其是在资源分配和项目进度跟踪方面。选择合适…...

微服务-MybatisPlus下
微服务-MybatisPlus下 文章目录 微服务-MybatisPlus下1 MybatisPlus扩展功能1.1 代码生成1.2 静态工具1.3 逻辑删除1.4 枚举处理器1.5 JSON处理器**1.5.1.定义实体****1.5.2.使用类型处理器** **1.6 配置加密(选学)**1.6.1.生成秘钥**1.6.2.修改配置****…...

【python_将一个列表中的几个字典改成二维列表,并删除不需要的列】
def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键,保持顺序ordered_keys []# 遍历data中的每个字典,添加其键到ordered_keys,如果该键还未被添加for d in original_list:for …...

IDEA的pom.xml显示ignored 的解决办法
问题: idea中创建Maven module时,pom.xml出现ignored。 原因: 相同名称的module在之前被创建删除过,IDEA会误以为新的同名文件是之前删除掉的,将这个新的module的pom.xml文件忽略掉显示ignored. 解决: 在…...

2. 卷积神经网络无法绕开的神——LeNet
卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层,2个卷积层,3个全连接层.核心权重层:卷积层、全连接层、循环层ÿ…...

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
审核看清楚了 ! 这是以太坊测试网络!用于学习的测试网络!!! 有关web3 和区块链的内容为什么要给我审核不通过? 别人凭什么可以发! 目标成果: 实现功能分析: 显示账户信…...

关于珞石机器人二次开发SDK的posture函数的算法RX RY RZ纠正 C#
在珞石SDK二次开发的函数钟,获取当前机器人位姿的函数posture函数在输出时会发现数据不正确,与示教器数据不一致。 其中第一个数据正确 第二三各数据为相反 第四五六各数据为弧度制 转换方法为(弧度/PI)*180度 然后发现第四个数据还要加上180度 第五…...

【Three.js基础学习】17.imported-models
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 课程回顾: 如何在three.js 中引入不同的模型? 1. 格式 (不同的格式) https://en.wikipedia.org/wiki/List_of_file_form…...

Spring Bean - xml 配置文件创建对象
类型: 1、值类型 2、null (标签) 3、特殊符号 (< -> < ) 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…...

uniapp map组件自定义markers标记点
需求是根据后端返回数据在地图上显示标记点,并且根据数据状态控制标记点颜色,标记点背景通过两张图片实现控制 <mapstyle"width: 100vw; height: 100vh;":markers"markers":longitude"locaInfo.longitude":latitude&…...

Windows:批处理脚本学习
目录 一、第一个批处理文件 1. &&和 | | 2. | 和 & 二、变量 1.传参变量%name 2.初始化变量set命令 3.变量的使用 4.局部变量与全局变量 5.使用环境变量 6.扩充变量语法 三、注释REM和 :: 四:函数 1.定义函数 2.…...

Dav_笔记10:Using SQL Plan Management之4
SQL管理库 SQL管理库(SMB)是驻留在SYSAUX表空间中的数据字典的一部分。它存储语句日志,计划历史记录,SQL计划基准和SQL配置文件。为了允许每周清除未使用的计划和日志,SMB使用自动空间管理。 您还可以手动将计划添加到SMB以获取一组SQL语句。从Oracle Database 11g之前的…...