使用easyexcel对导出表格添加合计行

文章目录

    • 一、背景
    • 二、实现
      • 1、写法一
      • 2、写法二
    • 三、遇到的问题
    • 四、参考

一、背景

近期开发的一个新功能需要导出和前端展示样式一致的统计表格,而前端使用的elementui的table组件,show-summary属性选择后可以自动计算。后端导出时其他单元格与返回前端展示时一致,但最后一行的合计行需要后端计算并填充。

二、实现

1、写法一

可以参考issue中填充模板形式,代码略。

2、写法二

由于表头和行数量是动态的,我是采取构造dataList和header的方式,未读取模板文件。部分逻辑为伪代码。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.data.FormulaData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.google.common.collect.Lists;
import org.apache.poi.ss.usermodel.Workbook;import java.util.List;public class ExcelTest {public void download() {try {ExcelWriter excelWriter = EasyExcel.write("需要生成的文件名.xlsx").inMemory(true).build();WriteSheet mainSheet = EasyExcel.writerSheet(0, "需要写入的sheet名").head(buildHeadTitles("123")).build();excelWriter.write(buildData("123"), mainSheet);Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();workbook.setForceFormulaRecalculation(true);workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();excelWriter.finish();// 传给前端的相关逻辑} catch (Exception e) {// 异常处理}}private List<List<String>> buildHeadTitles(String targetId) {// 构建动态表头,相邻两个同名表头会默认合并// 这里的Lists是com.google.guava下的 com.google.common.collect.ListsList<List<String>> headTitles = Lists.newArrayList();// 第一列headTitles.add(Lists.newArrayList("团队统计", "姓名", "姓名"));headTitles.add(Lists.newArrayList("团队统计", "机构名称", "机构名称"));// 查询并类似上面格式添加动态列headTitles.add(Lists.newArrayList("团队统计", "分类1", "动态列1"));return headTitles;}private List<List<Object>> buildData(String targetId) {ListList<Object>> dataList = Lists.newArrayList();// 循环塞数据行 =========== 循环开始// 最后一行塞数据的其中一个单元格公式示例如下// 在前面构造的公式字符串List<Object> list = new ArrayList<>():// 先塞其他数据list.add("syz");list.add("顶级机构");list.add("1");String formulaStr = "SUM(VALUE(D4),VALUE(E4),VALUE(F4))";WriteCellData<String> formula = new WriteCellData<>();FormulaData formulaData = new FormulaData();formula.setFormulaData(formulaData);formulaData.setFormulaValue(formulaStr);list.add(formula);dataList.add(list)// ============= 循环结束return dataList;}
}

三、遇到的问题

  • 需要注意的是只有3.0.0+版本,才包含WriteCellData类,以及对应的formulaData的内部类,workbook相关的计算属性才会被调用,否则不会生效。此前2.0.0+的版本,找了半天设置未生效原因,翻了下workbook设置源码和相关issue才发现。
  • 计算序号与字母转换时可以善用hutool工具包的ExcelUtil,已提供了序号到字母的转换,从0开始,如0-A,1-B。。。26-AA。。。等等,便于公式计算行和列。

四、参考

https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write
https://github.com/alibaba/easyexcel/issues/3242
https://github.com/alibaba/easyexcel/issues/1464

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

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

相关文章

华为数通方向HCIP-DataCom H12-831题库(多选题:241-249)

第241题 (NEW) 以下哪些操作可能会影响客户网络的正常运行? A、从设备上下载日志 B、软件升级 C、路由协议配置变更 D、debug核心交换机上转发的所有IP报文 答案:ABCD 解析: 第242题 对于防火墙的默认安全区 Trust 和 Untrust 的说法,正确的有 A、从 Trust 区域访问 Untr…

Vue在页面上添加水印

第一步&#xff1a;在自己的项目里创建一个js文件&#xff1b;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …

【MYSQL】MYSQL 的学习教程(六)之 SQL 语句执行流程

1. 一条 SQL 查询语句是如何被执行的 MySQL 的基本架构示意图如下所示&#xff1a; MYSQL 线程处理请求流程&#xff1a; SQL 接口&#xff1a;MySQL 中处理请求的线程在获取到请求以后获取 SQL 语句去交给 SQL 接口去处理查询解析器&#xff1a;解析器会将 SQL 接口传递过来…

mysql高级查询

当涉及到"高级查询"时&#xff0c;通常指的是使用SQL语言进行复杂的数据查询&#xff0c;包括多表连接、聚合函数、子查询、联合查询和条件筛选等。 多表连接查询&#xff1a; SELECT customers.customer_name, orders.order_number FROM customers JOIN orders ON…

操作系统期末复习知识点二计算与应用

1.理解银行家算法判断死锁的定理并能计算相关的参数。 2.能利用LRU、FIFO算法求缺页率。 3.纯页式管理中&#xff0c;求逻辑地址对应的物理地址&#xff0c;页号、页内地址长度&#xff0c;画出逻辑地址的格式&#xff0c;在引入块表时&#xff0c;求出有效访问时间。 4.可变分…

【Java】SpringBoot快速整合Kafka

目录 1.什么是Kafka&#xff1f; 主要特点和概念&#xff1a; 主要组成部分&#xff1a; 2.Kafka可以用来做什么&#xff1f; 3.SpringBoot整合Kafka步骤&#xff1a; 1. 添加依赖: 2. 配置 Kafka: 3. 创建 Kafka 生产者: 4. 创建 Kafka 消费者: 5. 发布消息: 6. 使…

【MySQL学习笔记007】约束

1、概述 &#xff08;1&#xff09;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 &#xff08;2&#xff09;目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 &#xff08;3&#xff09;分类 约束 描述 关键字 …

【各种**问题系列】Java 数组集合之间的相互转换

&#x1f4cc; 问题点&#xff1a; 在 Coding 过程中经常会遇到数组、List、Set、Map 之间的相互转换......这里记录一下转换的几种方式。&#x1f636;&#x1f636;&#x1f636; 目录 &#x1f4cc; 集合转换 1.数组 转 List&#xff1a; 2.List 转 数组&#xff1a; 3…

如何将本地websocket发布至公网并实现远程访问服务端

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

YUM和编译安装

一、安装Linux 1.编译安装&#xff0c;灵活性高&#xff0c;难度较大&#xff0c;可以安装较新的版本 2.rpm安装&#xff08;redhat&#xff09; linux包安装 rpm 软件名 3.yum yum是rpm升级版本&#xff0c;解决了rpm的弊端 2和3用的都是红帽打包好的软件包&#xff0c;能…

cad安装路径显示灰色选择不了怎么办?

cad安装路径显示灰色选择不了怎么办呢&#xff1f;今天教给大家。 灰色是因为之前下载过一次&#xff0c;没有删干净&#xff0c;注册表里还有cad&#xff0c;它认为你的电脑中有cad&#xff0c;所以安装路径是灰色的&#xff0c;不能安装。先同时按下【xinR】键&#xff0c;打…

ip addr和ifconfig

ip addr可以显示更多信息&#xff0c;包括为启动的网络驱动如wlan&#xff0c;而ifocnfig只显示在线的驱动。若wlan是down的&#xff0c;则ip addr会显示信息&#xff0c;ifconfig不会显示信息。 ip addr: ifconfig:

机器学习之数据扩充

为什么要进行数据扩充 数据扩充在机器学习中扮演着重要的角色,原因如下: 1. 解决数据稀缺问题: 数据量不足: 在实际应用中,获取大量高质量标记数据可能很困难或昂贵。数据扩充能帮助充分利用有限数据集,增加训练数据数量,减少模型过拟合风险。2. 提高模型泛化能力: 增…

视频号视频怎么保存到手机相册?

在微信视频号中看到喜欢的视频&#xff0c;想要缓存下载到手机&#xff0c;却怎么也找不到办法。很多朋友会选择去录屏&#xff0c;但保存下来的视频实在是不美观&#xff0c;而且费时费力&#xff01;着实没必要&#xff01;下面给大家推荐一款亲测有效的微信视频号视频下载方…

【excel密码】Excel工作表不能复制或移动

为什么excel文件打开之后&#xff0c;工作表里是可以编辑的&#xff0c;但是想要移动工作表或者复制、重命名等操作&#xff0c;这是什么原因&#xff1f;其实这是因为设置了工作簿保护&#xff0c;设置了保护的工作簿无法对整张工作表进行操作。 想要取消这种保护&#xff0c;…

算法——哈希表

哈希表简介 **是什么&#xff1a;**存储数据的容器有什么用&#xff1a;快速查找某个元素&#xff0c;时间复杂度O(1)&#xff0c;空间复杂度O(n)**什么时候使用哈希表&#xff1a;**频繁查找某一个数&#xff08;这里不要忘了之前的二分&#xff0c;时间复杂度O(logN)&#x…

opencv入门到精通——图像平滑

目录 目标 2D卷积&#xff08;图像过滤&#xff09; 图像模糊&#xff08;图像平滑&#xff09; 1.平均 2.高斯模糊 3.中位模糊 4.双边滤波 目标 学会&#xff1a; 使用各种低通滤镜模糊图像 将定制的滤镜应用于图像&#xff08;2D卷积&#xff09; 2D卷积&#xff0…

Unity网格篇Mesh(一)

Unity网格篇Mesh&#xff08;一&#xff09; 本文的目标1.渲染仔细看下面的图你会发现&#xff0c;锯齿状 2.创建网格顶点4 x 2网格网格的顶点 3.创建网格网格只在Play模式下显示逆时针和顺时针三角形第一个三角面一个四边形由两个三角面组成第一个四边形填充剩余网格 接下一篇…

【论文阅读笔记】SegVol: Universal and Interactive Volumetric Medical Image Segmentation

Du Y, Bai F, Huang T, et al. SegVol: Universal and Interactive Volumetric Medical Image Segmentation[J]. arXiv preprint arXiv:2311.13385, 2023.[代码开源] 【论文概述】 本文思路借鉴于自然图像分割领域的SAM&#xff0c;介绍了一种名为SegVol的先进医学图像分割模型…