EasyExcel模板导出与公式计算(上)

2024-09-04 07:04

本文主要是介绍EasyExcel模板导出与公式计算(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

环境要求

功能预览

需求分析

源码跟踪

自定义数据处理器

​总结


最近做项目时遇到这样一个需求,将数据库表的含有公式的信息导出为Excel文件并且需要计算其结果,由于上网查询资料后未能完美解决,故将此踩坑过程记录下来以供参考。本文将以若依项目演示,并且将分为两部分,第一部分为使用若依的@Excel注解进行导出并计算公式,适合于不要求自定义模板导出而第二部分将使用EasyExcel实现以自定义模板导出并自动计算公式方式来实现。

环境要求

若依Cloud 3.6.3

此处也可使用若依分离版,本文主要涉及内容为@Excel注解。

功能预览

方便起见,本文以若依用户管理的导出功能为示例,做一个简单的公式计算的验证,大家可根据自己需求修改相应代码。

首先本地启动若依微服务版本,登录后台,依次选择系统管理 —> 用户管理菜单,进入如下页面

点击该页面的导出按钮

获取如下导出文件

现在如果我们想要在第四行计算第二和第三行用户编号的和,可以直接在B4单元格输入"=A2+A3"这样的公式来实现,可以注意到此时B4单元格中的公式颜色已经发生变化,并且自动选中了A2和A3单元格,但实际上我们的需求为从数据库表中导出的单元格实现自动计算结果,接下来将通过若依前端页面来实现该功能验证。

需求分析

利用用户管理页面新增用户功能,可以添加如下用户信息来模拟公式计算结果导出(此处填写=A2+A3原因是A1为表头)。

添加完毕后再次点击导出结果如下图,但是B4并没有计算导出结果,而是变成了普通字符串,选中后也没有颜色变化,可以猜测需要从后端代码入手解决问题。

源码跟踪

通过F12下的网络可以找到当前导出接口位于/system/user/export下

后端Controller层如下,可以看出整个导出使用了三行代码,第一行为查询用户信息,第二行创建ExcelUtil实例,第三行调用该实例的exportExcel方法进行导出。

需要注意的是,第一行查询的SysUser对象中对导出列的属性添加了@Excel注解,用于标识导出的表头,并且可以对导出数据格式进行设置。

自定义数据处理器

结合官方文档 后台手册 | RuoYi 提到的自定义数据处理器,我们可以对导出单元格属性进行调整,通过文档可知@Excel注解具有一个Handler属性,该属性允许我们自定义一个数据处理器来处理数据,官方文档中所提示的为修改单元格颜色,同理我们可以通过该方法实现公式的设置。默认的Handler的为 ExcelHandlerAdapter 接口,我们需要实现该接口的format方法。在此之前请检查你的项目中该接口下的format方法是否如下图所示包含了4个参数

若不是请升级若依版本,或参考该文件的提交记录修改 ExcelHandlerAdapter ExcelUtil 下的相关代码。 登录 - Gitee.com

新建ExcelFormulaHandler类并实现ExcelHandlerAdapter接口的format方法

public class ExcelFormulaHandler implements ExcelHandlerAdapter{@Overridepublic Object format(Object value, String[] args, Cell cell, Workbook wb) {// 判断是否是公式,例如以 "=" 开头if (value != null && value.toString().startsWith("=")) {cell.setCellFormula(value.toString());}return value;}
}

在SysUser对象的userName属性上的@Excel中添加自定义的Handler类

再次点击导出即可发现公式已经可以自动计算。

通过跟踪源码可以发现,我们自定义的公式处理类从util实例对象调用 exportExcel 方法后将进入ExcelUtil工具类中,通过对传入的查询对象筛选,最终获取到每个类对象属性上的@Excel参数,并判断是否具有handler属性,最终进入ExcelUtildataFormatHandlerAdapter方法中,在这里通过反射获取到我们重写后的类对象进而调用其format方法,从而实现数据格式化。

总结

若导出时不需要使用模板填充,则可直接使用@Excel注解进行导出,对于公式计算可通过实现ExcelHandlerAdapter接口的format方法,设置单元格属性为formula,并将对应的字段上@Excel注解的Handler属性设置为自定义的类即可,下一篇文章将介绍如使用EasyExcel实现自定义模板并自动进行公式计算。

这篇关于EasyExcel模板导出与公式计算(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135330

相关文章

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相