当前位置: 首页 > news >正文

EasyExcel 填充+写入

使用 EasyExcel 导出 Excel 时,有时会遇到如下情况:

  • 既要根据模板填充某些 sheet
  • 又要根据业务写入某些 sheet

EasyExcel 官方没有提供这样的示例,经过自己的研究和实验,得到了如下步骤:

  1. 定义导出文件名
String fileName = "测试.xlsx";
  1. 获取模板文件
InputStream templateFile = ResourceUtil.getResourceObj("templates/template.xlsx").getStream();

此时读取的模板文件默认为压缩文件,是不能在后续进行填充的,所以需要在 pom.xml 中进行配置:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><!-- 配置不需要压缩的文件 --><nonFilteredFileExtensions><nonFilteredFileExtension>xls</nonFilteredFileExtension><nonFilteredFileExtension>xlsx</nonFilteredFileExtension></nonFilteredFileExtensions></configuration></plugin></plugins>
</build>
  1. 定义填充页数据
@Data
public class FillData {private String name;private double number;
}
FillData fillData = new FillData();
fillData.setName("张三");
fillData.setNumber(5.2);
  1. 定义业务页数据
@Data
public class BusinessData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;
}
BusinessData businessData = new BusinessData();
businessData.setString("测试");
businessData.setDate(new Date());
businessData.setDoubleData(1.0);
List<BusinessData> businessDataList = Collections.singletonList(businessData);
  1. 定义写入器
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFile).build();
  1. 定义填充页 sheet
WriteSheet writeSheet0 = EasyExcel.writerSheet().registerWriteHandler(new CustomTemplateSheetStrategy("动态命名sheet")).build();

这里使用了 CustomTemplateSheetStrategy

之所以要使用该拦截器,是因为填充时默认是只能取模板定义的 sheet 名称作为填充页的 sheet 名称,但业务中往往是需要动态命名 sheet 的,所以使用拦截器进行拦截处理后命名。

CustomTemplateSheetStrategy代码如下:

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;/*** 自定义模板导出sheet拦截器* * @author 天航星* @date 2024-07-03 13:48*/
public class CustomTemplateSheetStrategy implements SheetWriteHandler {private Integer sheetNo;private String sheetName;public CustomTemplateSheetStrategy(String sheetName) {this.sheetName = sheetName;}public CustomTemplateSheetStrategy(Integer sheetNo, String sheetName) {this.sheetNo = sheetNo;this.sheetName = sheetName;}@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}/*** 功能:动态修改模板中sheet的名称* sheet创建完成后调用* @param writeWorkbookHolder* @param writeSheetHolder*/@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {if (sheetName == null) {return;}if (sheetNo == null) {sheetNo = 0;}writeWorkbookHolder.getCachedWorkbook().setSheetName(sheetNo, sheetName);}
}
  1. 定义业务页 sheet
WriteSheet writeSheet1 = EasyExcel.writerSheet("Sheet1").head(BusinessData.class).build();
  1. 填充数据
excelWriter.fill(fillData, writeSheet0);

注意:这里一定要传入对象,不能传入列表,否则填充的内容会变为空白。

  1. 写入数据
excelWriter.write(businessDataList, writeSheet1);
  1. 关闭写入器
excelWriter.finish();

注意:这里必须要关闭写入器,不然写入的文件为空。

根据以上步骤即可以填充+写入的方式导出 Excel,以下是完整代码:

import cn.hutool.core.io.resource.ResourceUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.sevnce.pop.customer.handler.CustomTemplateSheetStrategy;
import lombok.Data;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.util.Collections;
import java.util.Date;
import java.util.List;/*** 测试用例** @author 天航星* @date 2024-07-03 10:55*/
public class TestDemo {@Datapublic class FillData {/*** 名称*/private String name;/*** 数字*/private double number;}@Datapublic class BusinessData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;}@Testpublic void test() {// 定义导出文件名String fileName = "测试.xlsx";// 获取模板文件InputStream templateFile = ResourceUtil.getResourceObj("templates/template.xlsx").getStream();// 定义填充页数据FillData fillData = new FillData();fillData.setName("张三");fillData.setNumber(5.2);// 定义业务页数据BusinessData businessData = new BusinessData();businessData.setString("测试");businessData.setDate(new Date());businessData.setDoubleData(1.0);List<BusinessData> businessDataList = Collections.singletonList(businessData);// 定义写入器ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFile).build();// 定义填充页 sheetWriteSheet writeSheet0 = EasyExcel.writerSheet().registerWriteHandler(new CustomTemplateSheetStrategy("动态命名sheet")).build();// 定义业务页 sheetWriteSheet writeSheet1 = EasyExcel.writerSheet("Sheet1").head(BusinessData.class).build();// 填充数据excelWriter.fill(fillData, writeSheet0);// 写入数据excelWriter.write(businessDataList, writeSheet1);// 关闭写入器excelWriter.finish();}
}

环境:

  • JDK:1.8.0_202
  • SpringBoot:2.7.17
  • EasyExcel:3.3.2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 自然语言处理——英文文本预处理
  • 从一个(模型设计的)想法到完成模型验证的步骤
  • Java语言程序设计篇一
  • C++ 实现学生成绩管理系统
  • Go语言--复合类型之map、结构体
  • 高考志愿填报千万要注意这四点
  • Python的上下文管理器
  • vue2 webpack使用optimization.splitChunks分包,实现按需引入,进行首屏加载优化
  • 【Linux进阶】文件系统6——理解文件操作
  • 源代码层面分析Appium-inspector工作原理
  • puppeteer 爬虫初探
  • 学习ffmpeg时候遇到的一个死锁问题,六个队列互相等待造成的悲剧!
  • DDL:针对于数据库、数据表、数据字段的操作
  • 大华DSS user_toLoginPage.action命令执行漏洞
  • SecureCRT--使用sftp上传和下载文件
  • @jsonView过滤属性
  • 【剑指offer】让抽象问题具体化
  • Android 控件背景颜色处理
  • ES6核心特性
  • HTTP请求重发
  • HTTP--网络协议分层,http历史(二)
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • js正则,这点儿就够用了
  • node.js
  • swift基础之_对象 实例方法 对象方法。
  • Swoft 源码剖析 - 代码自动更新机制
  • vue中实现单选
  • 阿里云Kubernetes容器服务上体验Knative
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 如何合理的规划jvm性能调优
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度学习入门:10门免费线上课程推荐
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​Java基础复习笔记 第16章:网络编程
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #{}和${}的区别是什么 -- java面试
  • #职场发展#其他
  • (6)STL算法之转换
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (CPU/GPU)粒子继承贴图颜色发射
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (论文阅读11/100)Fast R-CNN
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (一)Linux+Windows下安装ffmpeg
  • (源码分析)springsecurity认证授权
  • (转)关于多人操作数据的处理策略
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net开发时的诡异问题,button的onclick事件无效