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

使用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

相关文章:

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

文章目录 一、背景二、实现1、写法一2、写法二 三、遇到的问题四、参考 一、背景 近期开发的一个新功能需要导出和前端展示样式一致的统计表格&#xff0c;而前端使用的elementui的table组件&#xff0c;show-summary属性选择后可以自动计算。后端导出时其他单元格与返回前端展…...

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…...

Python入门学习篇(十四)——模块文件操作

1 模块 1.1 理解 包: python中带有__init__.py文件的文件夹 模块: 文件名(不包含.py后缀),如python官方的time.py中time就是模块1.2 示例代码 import datetime# 调用datetime模块中的datetime类的now()方法 t datetime.datetime.now() # 格式化输出日期和时间 strftime(&qu…...

【数据结构】排序之交换排序(冒泡 | 快排)

交换目录 1. 前言2. 交换排序3. 冒泡排序3.1 分析3.2 代码实现 4. 快速排序4.1 hoare版本4.1.1 分析4.1.2 hoare版本代码 4.2 挖坑法4.2.1 分析4.2.2 挖坑法代码实现 4.3 前后指针版本4.3.1 分析4.3.2 前后指针版本代码实现 1. 前言 在之前的博客中介绍了插入排序&#xff0c;…...

AI电商时代开始:阿里能否反杀拼多多

“AI电商时代刚刚开始&#xff0c;对谁都是机会&#xff0c;也是挑战。” 针对阿里员工对于拼多多财报和电商等的讨论&#xff0c;马云在阿里内网罕见地参与了谈论并发言。 阿里巴巴一向雷厉风行&#xff0c;已打响了AI电商的“第一炮”。 根据《晚点LatePost》报道&#xff…...

STC8H系列单片机入门教程之NVC系列语音播报模块(九)

一、模块简述 ● 模组支持3.3V和5V单片机供电系统 ● 标准2.54MM间距排针与外部连接 ● 支持喇叭0.5W/8欧 ● 适合用于超声波距离、电子秤重量、时钟时间、温度、球赛比分等语音播报 二、引脚说明 序号 名称 说明 1 VCC 电源正&#xff08;3.3V-5V&#…...

认识计算机网络——计算机网络的组成

计算机网络是由多个计算机和网络设备组成的系统&#xff0c;通过通信协议实现数据传输和信息交换。它是现代社会信息技术的重要支撑&#xff0c;广泛应用于各个领域。本文将介绍计算机网络的主要组成部分&#xff0c;包括硬件设备、软件协议和网络服务。 一、硬件设备 计算机网…...

数据的复制

基本概念 数据的复制指的是通过网络链接的多台机器保留相同的副本 为什么要进行数据的复制 使得用户和数据在地理上比较接近&#xff0c;因为大数据要求我们将计算安排在数据存放的位置和我们基本的内存模型不是很一样 &#xff0c;比如磁盘调入内存之类的。即使系统的一部分…...

【辐射场】3D Gaussian Splatting

三维高斯…喷喷 \, 3D Gaussian Splatting&#xff0c;下文简称3DGS&#xff0c;是好一段时间以来在三维内容创作和三维重建领域比较有热度的一项技术。 它属于基于图像的三维重建方法&#xff0c;意思就是你对现实物体或者场景拍照片&#xff0c;就能给你训练成一个场景模型&a…...

冒泡排序--------(C每日一题)

冒泡排序&#xff1a; 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论&#xff1a; n个数要进行n-1轮比较&#xff0c;第j轮要进行n-j次两两比较 循环体代码&#xff1a; int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…...

每日一练:LeeCode-347. 前 K 个高频元素(中) - 【优先级队列】

本文是力扣LeeCode-347. 前 K 个高频元素 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输…...

<蓝桥杯软件赛>零基础备赛20周--第11周--贪心

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上答疑&#x…...

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…...

将“渴望“乐谱写入AT24C02并读出播放

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…...

Vue独立组件开发-动态组件

文章目录 一、前言二、实现三、优化四、总结五、最后 一、前言 在开发中&#xff0c;你经常会遇到这么一种情况&#xff1a;根据条件动态地切换某个组件&#xff0c;或动态地选择渲染某个组件。 Vue 提供了另外一个内置的组件 <component> 和 is 特性&#xff0c;可以更…...

前端八股文(HTML篇)

目录 1.什么是DOCTYPE,有何用呢&#xff1f; 2.说说对html语义化的理解 3.src和href的区别&#xff1f; 4.title与h1的区别&#xff0c;b与strong的区别&#xff0c;i与em的区别&#xff1f; 5.什么是严格模式与混杂模式&#xff1f; 6.前端页面有哪三层构成&#xff0c;分…...

RivaGAN 水印项目

git地址 https://github.com/DAI-Lab/RivaGAN Dockerfile (/tools下文件为git下的文件) ############################################### # 使用 NVIDIA CUDA 10.0 开发环境作为基础镜像 FROM kaldiasr/kaldi:gpu-ubuntu18.04-cuda10.0 # 设置非交互式安装模式以避免某些命…...

Games101作业5

1.实现Renderer.cpp 中的 Render()&#xff1a;为每个像素生成光线 这里你需要为每个像素生成一条对应的光 线&#xff0c;然后调用函数 castRay() 来得到颜色&#xff0c;最后将颜色存储在帧缓冲区的相 应像素中。 我们要做的就是将屏幕空间下的坐标最后转换到世界空间的坐标…...

Golang解决跨域问题【OPTIONS预处理请求】

Golang解决跨域问题 前置知识&#xff1a;跨域问题产生条件及原因 跨域是是因为浏览器的同源策略限制&#xff0c;是浏览器的一种安全机制&#xff0c;服务端之间是不存在跨域的。 所谓同源指的是两个页面具有相同的协议、主机和端口&#xff0c;三者有任一不相同即会产生跨域…...

复试 || 就业day05(2023.12.31)算法篇

文章目录 前言找不同最长回文串找到所有数组中消失的数字下一个更大元素 I键盘行 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;文章题目大多来自于 leetcode&#xff0c;当然也可能来自洛谷或其他刷题平台 &#x1f4ab…...

告别网络依赖:用这个开源工具+高德离线包,5步搞定前端地图离线展示

前端开发者的离线地图解决方案&#xff1a;5步实现高德地图本地化部署 在紧急演示、内网开发或网络不稳定的环境中&#xff0c;依赖在线地图服务往往成为前端开发的痛点。我曾参与过一个政府内网项目&#xff0c;现场演示时因网络权限问题导致地图无法加载&#xff0c;最后不得…...

从Safetensors到GGUF:利用llama.cpp解锁Ollama模型部署新路径

1. 为什么需要从Safetensors转换到GGUF格式 最近在魔塔社区下载了几个热门的大模型&#xff0c;发现都是safetensors格式的&#xff0c;但直接扔进Ollama里根本跑不起来。这个问题困扰了我好几天&#xff0c;直到发现了llama.cpp这个神器。safetensors其实是Hugging Face生态中…...

Mojo+Python混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)

第一章&#xff1a;MojoPython混合项目部署失败全记录&#xff08;含完整错误日志溯源与跨运行时调试手册&#xff09;在将 Mojo 模块嵌入 Python 3.11 环境的 CI/CD 流水线中&#xff0c;首次构建即触发运行时崩溃。核心现象为 mojo_runtime_init() 在 Python 进程内调用后立即…...

LSTM电池SOC估计最基本方法及全包代码:包含两个数据集、预处理代码、模型代码与估计结果

LSTM做电池SOC估计&#xff0c;最基本的方法&#xff0c;入门必学&#xff0c;包括两个数据集&#xff0c;及其介绍、预处理代码、模型代码、估计结果等&#xff0c;这是我见过最全的一个SOC估计代码包&#xff0c;总共文件大概有70个左右最近在折腾电池SOC估计&#xff0c;发现…...

提升开发效率:用快马一键生成快速排序多版本性能对比工具

今天在优化一个数据处理模块时&#xff0c;遇到了需要选择合适排序算法的问题。不同数据特征下&#xff0c;快速排序的各种变体表现差异很大&#xff0c;手动测试效率实在太低。于是我用InsCode(快马)平台快速搭建了一个性能对比工具&#xff0c;整个过程比想象中简单很多。 需…...

别再瞎猜了!YOLOv8 模型缩放(width_multiple)与通道计算(c1,c2)的完整逻辑

YOLOv8模型通道计算与宽度系数的工程化实践指南 在移动端部署YOLOv8模型时&#xff0c;许多工程师会遇到一个典型困境&#xff1a;明明按照官方文档调整了width_multiple参数&#xff0c;却发现模型要么计算量超出预期&#xff0c;要么精度断崖式下跌。这背后其实隐藏着YOLOv8通…...

Java 四种安全加载 P12 证书的方案

文章目录从文件绝对路径加载【最常用、最稳定】从 resources 目录加载从 byte [] 字节数组加载从 Base64 字符串加载如果文章对您有用&#xff0c;请关注点赞加收藏&#xff0c;博主会持续更新相关的专栏笔记&#x1fae1; 从文件绝对路径加载【最常用、最稳定】 适合&#xf…...

运维提效实战:用 Ansible+Cron 搞定日志自动清理,再也不用半夜爬起来删日志了

前言 作为常年和服务器打交道的运维人&#xff0c;估计没人没经历过半夜被磁盘爆满告警吵醒的崩溃 —— 远程登服务器、挨个找日志文件、手动删旧日志&#xff0c;一套操作下来人彻底清醒&#xff0c;回头还得担心误删关键文件。 其实这类重复又机械的运维活儿&#xff0c;完全…...

Windows上搭建PostgreSQL监控神器:Grafana+Prometheus+Postgres_Exporter保姆级干货教程

❓想要实时掌握 PostgreSQL 数据库的运行状态&#xff1f; &#x1f440;想知道复制延迟、锁等待这些核心指标&#xff1f; &#x1f192;这里是Moshow的「CSDN https://zhengkai.blog.csdn.net/」 &#x1f680;这篇文章带你从零开始&#xff0c;在 Windows 上搭建一套企业…...

从Address Editor入手:在Block Design中精准调整Bram存储深度的实战解析

1. 当Bram存储深度无法修改时&#xff0c;你该怎么做&#xff1f; 第一次在Vivado中使用Block Design搭建系统时&#xff0c;很多人都会遇到一个奇怪的现象&#xff1a;明明在Bram IP核的参数设置界面看到了"Depth"这个选项&#xff0c;但无论如何点击都无法修改。这…...