@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出
今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出,debug时发现是这样:

导出效果

这里我把能查到的方法都汇总了,如果你也遇到这个异常,可以去逐步排查
1.先看库里有没有数据
2.看字段名是否对齐
3.所需要导出的字段是否正确加上@Excel注解
4.检查注解内部是不是被加注了type = Excel.Type.IMPORT
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@TableField(value = "create_time", fill = FieldFill.INSERT)@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.IMPORT)private Date createTime;
因为这个type是控制数据通道的,通过详细代码可以看到这是控制此字段仅允许被导入

5.检查xml里面的SQL是否对应,因为涉及到关联表的时候,这个通用字段大家都有,如果需要查询就必须要指定是查哪个表
/** 创建时间 */@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@TableField(value = "create_time", fill = FieldFill.INSERT)@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT)private Date createTime;
到这里一般就可以解决了,但如果到这里还不行可以试试我下面这个方法,通过反射去获取导出的实体类的父类的带@Excel注解的字段,再把子类的值赋值上来,进行导出
这里补充一下各个用法:
| 属性 | 类型 | 用途 | 示例 |
| name | String | 定义Excel列的名称,用于Excel表头。 | @Excel(name = "学生姓名") |
| width | double | 定义列宽度,单位为字符。 | @Excel(width = 20) |
| height | double | 定义行高,单位为磅。仅对导出有效。 | @Excel(height = 10) |
| orderNum | String | 定义列的显示顺序。 | @Excel(orderNum = "1") |
| needMerge | boolean | 表示是否需要合并单元格。 | @Excel(needMerge = true) |
| mergeVertical | boolean | 表示是否纵向合并单元格。 | @Excel(mergeVertical = true) |
| mergeRely | int[] | 指定合并单元格时依赖的列,数组中的数字为列的索引。 | @Excel(mergeRely = {1}) |
| isImportField | String | 定义是否为导入字段,“true"或"false”。 | @Excel(isImportField = "true") |
| isWrap | boolean | 定义是否自动换行。 | @Excel(isWrap = true) |
| exportFormat | String | 定义导出时的格式化模式,如日期格式。 | @Excel(exportFormat = "yyyy-MM-dd") |
| importFormat | String | 定义导入时的格式化模式。 | @Excel(importFormat = "yyyy-MM-dd") |
| imageType | int | 定义图片类型(如1表示从文件导入,2表示从数据库导入)。 | @Excel(imageType = 1) |
| suffix | String | 定义文本后缀,如在文本后添加特定的后缀。 | @Excel(suffix = "%") |
| type | int | 定义字段类型(如1表示文本,2表示图片)。 | @Excel(type = 1) |
| enumExportField | String | 定义枚举导出时,调用枚举字段的哪个方法获取实际的值。 | @Excel(enumExportField = "getText") |
| savePath | String | 定义图片保存路径,仅对导入有效。 | @Excel(savePath = "/tmp") |
| dateFormat | String | 简化的日期格式设置,简化的exportFormat/importFormat。 | @Excel(dateFormat = "yyyy-MM-dd") |
| use1904windowing | boolean | 定义是否使用1904年日期窗口。 | @Excel(use1904windowing = true) |
| fixedIndex | int | 指定Excel列的索引,从0开始,用于导入时准确匹配列位置。 | @Excel(fixedIndex = 0) |
| groupName | String | 用于分组导出/导入时定义的组名。 | @Excel(groupName = "group1") |
| dict | String | 用于指定数据字典,将数据转换为对应的文本值。 | @Excel(dict = "sex=1_男,2_女") |
| replace | String[] | 定义要替换的值,用于导出时将字段值替换为指定的文本值。 | @Excel(replace = {"男_1", "女_2"}) |
| statistics | boolean | 定义是否进行统计,用于对数字字段进行求和统计。 | @Excel(statistics = true) |
6.用代码,里面有判定继承关系的方法、利用类的反射,获取类的注解、获取类的父类、字段名等方法可以参考
/*** 对list数据源将其里面的数据导入到excel表单* * @param response 返回数据* @param list 导出数据集合* @param sheetName 工作表的名称* @return 结果*/public void exportExcel(HttpServletResponse response, List<T> list, String sheetName){
// if(list.size()>0){
// //获取父类带Excel注解的字段
// List<String> elementList=getSuperClasseExcel(list.get(0).getClass());
// for (String s : elementList) {
// list=setBusinessBaseEntity(list,s);
// }exportExcel(response, list, sheetName, StringUtils.EMPTY);
// }}//把业务实体父类的指定属性赋值到子类private List<T> setBusinessBaseEntity(List<T> list,String element) {for (T t : list) {try {// 获取 T 的 createTime 字段Field createTimeField = getDeclaredFieldIncludingSuperclasses(t.getClass(), element);if (createTimeField != null) {createTimeField.setAccessible(true);// 获取父类的 createTime 字段值Object parentValue = getFieldValueIncludingSuperclasses(t, element);// 如果父类有 createTime 字段值,则赋值给当前对象if (parentValue != null) {createTimeField.set(t, parentValue);}}} catch ( IllegalAccessException e) {e.printStackTrace();}}return list;}private static Field getDeclaredFieldIncludingSuperclasses(Class<?> clazz, String fieldName) {while (clazz != null) {try {return clazz.getDeclaredField(fieldName);} catch (NoSuchFieldException e) {// 继续查找父类clazz = clazz.getSuperclass();}}return null;}private static Object getFieldValueIncludingSuperclasses(Object obj, String fieldName) throws IllegalAccessException {Class<?> clazz = obj.getClass();while (clazz != null) {try {Field field = clazz.getDeclaredField(fieldName);field.setAccessible(true);return field.get(obj);} catch (NoSuchFieldException e) {// 继续查找父类clazz = clazz.getSuperclass();}}return null;}//获取父类带Excel注解的字段
// private List<String> getSuperClasseExcel(Object object) {
// //先判断是否继承自BusinessBaseEntity
// List<String> elementList = new ArrayList<>();
// //再把BusinessBaseEntity中有@Excel注解的字段收集起来
//
// // 获取父类
// Class<Object> clazz = object;
//
// // 获取父类
// Class<?> superClass = clazz.getSuperclass();
//
// if (superClass != null) {
// System.out.println("有" + superClass.getSimpleName());
// } else {
// System.out.println("无");
// }
//
//
//
//
//if (object instanceof BusinessBaseEntity) {BusinessBaseEntity b = new BusinessBaseEntity() {};Class<?> clazz = b.getClass();
// while (clazz != null) {for (Field field : clazz.getDeclaredFields()) {if (field.isAnnotationPresent(Excel.class)) {elementList.add(field.getName());Excel excelAnnotation = field.getAnnotation(Excel.class);System.out.println("Field: " + field.getName()+ " has Excel annotation with value: " + excelAnnotation.name());}}
// }}
// return elementList;
// }
7.如果还是不能解决,可以排查一下是不是日期格式异常,这种情况一般会报错:org.apache.poi.ss.usermodel.Cell.setCellValue
可以建一个工具类DateFormatTransition(但注意需要alibaba导excel的包)
package com.ruoyi.common.convert;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.text.SimpleDateFormat;
import java.util.Date;/*** 日期格式转换 用于导出日期类异常* @fly 2024-11-01 16:41:55**/
public class DateFormatTransition implements Converter<Date> {private static final String PATTERN_YYYY_MM_DD = "yyyy-MM-dd";@Overridepublic Class<?> supportJavaTypeKey() {return Converter.super.supportJavaTypeKey();}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return Converter.super.supportExcelTypeKey();}@Overridepublic WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws Exception {SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);String dateValue = sdf.format(value);return new WriteCellData<>(dateValue);}
}
具体使用:
@ExcelProperty(value = "创建时间",converter = DateFormatTransition.class)
private Date createTime;
8.最后记得检查一下工具类是否含有get、set方法或者使用了lombok的情况下直接在类上加上@Data注解
因为子类的toString方法虽然已经重写,内部也有基于这些通用字段的get和set方法,这是将父类的字段继承过来再进行get和set操作的,但父类是没有这些通用字段的get和set方法,就不能在导出时正常赋值,从而导致导出的excel表列数据为空

相关文章:
@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出
今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出,debug时发现是这样: 导出效果 这里我把能查到的方法都汇总了,如果你也遇到这个异常,可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…...
虚拟机 Email 恢复专用工具:Virtual Machine Email Recovery
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 天津鸿萌科贸发展有限公司是 SysTools 系列数据恢复、取证及…...
代理人工智能如何应对现代威胁的速度和数量
Seven AI首席执行官 Lior Div 讨论了代理 AI 的概念及其在网络安全中的应用。他解释了代理 AI 与传统自动化安全系统的区别,即代理 AI 具有更大的自主性和决策能力。 Div 强调,通过实时处理大量警报,代理 AI 特别适合对抗现代 AI 驱动的威胁…...
element-plus版本过老,自写选项弹框增删功能
title: element-plus版本过老,自写选项弹框增删功能 date: 2024-10-31 10:53:18 tags: element-plus 1.情景 发现代码怎么都用不了el-select的#footer插槽从而实现不了相关的操作,发现el-select自带的管理相关数据的属性popper-class用不了。 2.原因与…...
Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…...
计算机后台服务-更新下载,重启————未来之窗行业应用跨平台架构
一在教育中应用 1. 提高效率:能够快速收集大量学生的卷子,节省了传统人工收集和整理的时间。 2. 准确性:减少了人工收卷过程中可能出现的错漏和混乱,确保每份卷子都能准确无误地被收集和记录。 3. 即时性:可以实时接收…...
springcloud通过MDC实现分布式链路追踪
在DDD领域驱动设计中,我们使用SpringCloud来去实现,但排查错误的时候,通常会想到Skywalking,但是引入一个新的服务,增加了系统消耗和管理学习成本,对于大型项目比较适合,但是小的项目显得太过臃…...
logback日志级别动态切换四种方案
生产环境中经常有需要动态修改日志级别。 现在就介绍几种方案 方案一:开启logback的自动扫描更新 配置如下 <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"60 seconds" debug…...
AI视频管理平台中使用目标检测模型中的NMS参数原理及设置原则
目标检测模型中的NMS参数原理及设置原则 在目标检测模型中,非极大值抑制(Non-Maximum Suppression,简称NMS)是一种常用的后处理技术,用于筛选和保留最佳的检测框。本文将详细介绍NMS的原理、参数设置原则以及实际应用…...
从零开始点亮一个LED灯 —— keil下载、新建工程、版本烧录、面包板使用、实例代码
一、keil下载 参考视频:Keil5安装教程视频 (全套资料51和32皆可用Keil5编译设置)_哔哩哔哩_bilibili 视频内容包括下载链接、安装教程、库导入,非常详细! 二、新建工程 2.1.使用stm32CubeMX新建工程 10. 使用STM32CubeMX新建工程 — [野…...
[pdf,epub]105页《分析模式》漫谈合集01
105页的《分析模式》漫谈合集第1集的pdf、epub文件,已上传到本账号的CSDN资源。 如果无法下载,也可以访问umlchina.com/url/ap.html 已排版成适合手机阅读,pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》? ★[缝合故…...
计算机网络5层模型
应用层常见协议 DNS协议 作用:用于实现网络设备名字到IP地址映射的网络服务 特点:DNS是因特网使用的命名系统,它将人们易于记忆的主机名(如www.example.com)转换为机器可识别的IP地址。 FTP协议 作用:用于实现交互式文件传输功能。 特点:FTP支持Standard(主动…...
Python毕业设计选题:基于Python的无人超市管理系统-flask+vue
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 超市商品详情 购物车 我的订单 管理员登录界面 管理员功能界面 用户界面 员…...
WindowsDocker安装到D盘,C盘太占用空间了。
Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…...
Java面试经典 150 题.P80. 删除有序数组中的重复项 II(004)
本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int removeDuplicates(int[] nums)…...
【Three.js】SpriteMaterial 加载图片泛白,和原图片不一致
解决方法 如上图所示,整体泛白了,解决方法如下,添加 material.map.colorSpace srgb const imgTexture new THREE.TextureLoader().load(imgSrc)const material new THREE.SpriteMaterial({ map: imgTexture, transparent: true, opacity:…...
了解神经网络中的激活函数
一、激活函数的特征 非线性,激活函数必须是非线性函数。可微性,训练网络模型时,基于梯度的模型最优化方法要求激活函数必须是可导的。单调性,单调递增或单调递减,单调函数保证模型的简单。隐藏层一般需要使用激活函数…...
配置BGP与IGP交互和路由自动聚合示例
组网需求 如图所示,用户将网络划分为AS65008和AS65009,在AS65009内,使用IGP协议来计算路由(该例使用OSPF做为IGP协议)。要求实现两个AS之间的互相通信。 配置思路 采用如下的思路配置BGP与IGP交互: 在AR…...
代码随想录算法训练营第三十三天 | 62.不同路径 63.不同路径
LeetCode 62.不同路径: 文章链接 题目链接:62.不同路径 思路: 动态规划 使用二维数组保存递推结果 ① dp数组及下标含义 dp[i][j]:表明从(0, 0)到下标为(i, j)的点有多少条不同的路径 ② 递推式: 机器人只能向下或向…...
使用Flask构建RESTful API
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Flask构建RESTful API Flask简介 环境搭建 安装Flask 项目结构 创建应用 路由定义 请求处理 获取查询参数 获取请求体 响应…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
