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,而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个classWriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(SaleData.class).build();// 分页去数据库查询数据,这里可以去数据库查询每一页的数据excelWriter2.write(list, writeSheet);}}}

Java 读取 Excel

想要了解 Java 如何实现读取 Excel 的小伙伴可以看看这篇文章哈——EasyExcel 初使用—— Java 实现读取 Excel 功能_java easyexcel.read-CSDN博客。

在学习的过程中有任何问题都可以问我,如果你觉得还不错的话就给我点个赞吧。

开源项目

前一阵子,我开源了一个既好玩又能学到东西的项目,有兴趣的同学可以移步学习和体验哈——我终于有我的开源项目了!!!-CSDN博客。

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

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

相关文章

使用阿里云云主机通过nginx搭建文件服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备基础环境二、安装配置nginx三、阿里云安全组配置安全组配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4ee96f38312e4771938e40f463987…

React Router-v6.25.1

以下例子是根据vitereactts构建的&#xff0c;使用路由前先安装好这些环境&#xff01;&#xff01;&#xff01;&#xff01; 1、路由的简单使用 首先要创建一个浏览器路由器并配置我们的第一个路由。这将为我们的 Web 应用启用客户端路由。 该main.jsx文件是入口点。打开它…

数字看板:跨行业需求下的创新与升级

在当今这个数据驱动的时代&#xff0c;数字看板作为信息展示与决策支持的重要工具&#xff0c;正逐步渗透到各行各业之中。从智慧城市到智能制造&#xff0c;从金融分析到医疗健康&#xff0c;数字看板以其直观、动态、高效的特点&#xff0c;成为了连接数据与决策者的桥梁。本…

Linux系列--shell编程一

一、Linux系统结构 一、内核层 内核是Linux系统的核心部分&#xff0c;它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构&#xff0c;可以动态地加载和卸载内核模块&#xff0c;这使得内核可以兼容各种不同的硬件设备和…

基于联咏 NT98692芯片赋能边缘计算IP摄像机与XVR监控系统解决方案

联咏 NT98692 是一款新世代整合度极高的 SoC&#xff0c;具有高影像品质、低位元率、低功耗&#xff0c;针对 8Kp30 边缘运算 IP 摄影机与后端监控系统 XVR 应用。此 SoC 整合了 ARM Quad Cortex A73 CPU 核心、新一代 ISP 和 AI ISP、H.265/H.264 视讯压缩编解码器、DSP、高效…

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C primer plus 第16章string 类和标准模板库, 函数符概念 C primer plus 第16章string 类和标准模板库, 函数符概念 文章目录 C primer plus 第16章string 类和标准模板库, 函数符概念16.5.1 函数符概念程序清单16.15 functor.cpp 16.5.1 函数符概念 正如 STL定义了容器和迭代…

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

XSS攻击与CSRF攻击

XSS攻击 XSS&#xff08;Cross Site Scripting&#xff0c;跨站脚本攻击&#xff09;&#xff0c;是指攻击者利用站点的漏洞&#xff0c;在表单提交时&#xff0c;在表单内容中加入一些恶意脚本&#xff0c;当其他正常用户浏览页面&#xff0c;而页面中刚好出现攻击者的恶意脚…

ffmpeg更改视频的帧率

note 视频帧率调整 帧率(fps-frame per second) 例如&#xff1a;原来帧率为30&#xff0c;调整后为1 现象&#xff1a;原来是每秒有30张图像&#xff0c;调整后每秒1张图像&#xff0c;看着图像很慢 实现&#xff1a;在每秒的时间区间里&#xff0c;取一张图像…

【数据结构】手把手教你单链表(c语言)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.单链表的概念与结构 2.单链表的结构定义 3.单链表的实现 3.1 单链表的方法声明 3.2 单链表方法实现 3.2.1 打印链表 3.2.2 创建新…

四、GD32 MCU 常见外设介绍(8)SPI 模块介绍

串行外设接口&#xff08;Serial Peripheral Interface&#xff0c;缩写为 SPI&#xff09; 提供了基于SPI 协议的数据发送和接收功能&#xff0c; 可以工作于主机或从机模式。 SPI 接口支持具有硬件 CRC 计算和校验的全双工和单工模式。 8.1.SPI 基础知识 SPI 物理层 SPI接…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

qt--电子相册

一、项目要求 设计一个电子相册&#xff0c;点击上一张&#xff0c;切换到上一张图片&#xff0c;点击下一张&#xff0c;切换到下一张图片。 要求&#xff1a;图片的展示可以循环&#xff08;QList<QString>&#xff09; 要求&#xff1a;界面美观 二、项目代码 本质是通…

概率论--矩估计

目录 简介 矩估计法的基本步骤 延伸 矩估计法在大样本情况下的准确性和有效性如何评估&#xff1f; 在实际应用中&#xff0c;矩估计法的局限性有哪些具体例子&#xff1f; 如何处理矩估计法在某些情况下可能出现的不合理解或无法唯一确定参数的问题&#xff1f; …

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

gstreamer使用cairo实现视频OSD叠加

前言 gstreamer中视频叠加OSD有很多种方式&#xff0c;比如textoverlay添加文字&#xff0c;gdkpixbufoverlay添加图片&#xff0c;clockoverlay或timeoverlay插件显示时间&#xff0c;pango插件进行复杂文本渲染&#xff0c;使用cairo插件绘制图形或者文字。 今天使用最后一…

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式&#xff1f;2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块&#xff1f;2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS&#xff1f;2. styled-components的定义3. 基本示例…

ADS 使用教程(二十八)Working with FEM Mesh Field Data in ADS

ADS 使用教程&#xff08;二十七&#xff09;Getting Started with Full 3D FEM Simulation in ADS 在这一节中&#xff0c;我们来谈论一下在ADS中处理有限元法&#xff08;FEM&#xff09;网格和场数据的步骤。 在上一节中&#xff0c;我们进行了FEM仿真&#xff0c;并保存了…

在 MinIO 使用 SVE 将 ARM 带入人工智能数据基础设施领域

MinIO 性能如此之高的原因之一是&#xff0c;我们做了其他人不会或不能做的细粒度工作。从 SIMD 加速到 AVX-512 优化&#xff0c;我们已经完成了艰巨的任务。ARM CPU 架构的最新发展&#xff0c;特别是可扩展矢量扩展 &#xff08;SVE&#xff09;&#xff0c;为我们提供了比前…