@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注解的字段,再把子类的值赋值上来,进行导出

这里补充一下各个用法:

属性类型用途示例
nameString定义Excel列的名称,用于Excel表头。@Excel(name = "学生姓名")
widthdouble定义列宽度,单位为字符。@Excel(width = 20)
heightdouble定义行高,单位为磅。仅对导出有效。@Excel(height = 10)
orderNumString定义列的显示顺序。@Excel(orderNum = "1")
needMergeboolean表示是否需要合并单元格。@Excel(needMerge = true)
mergeVerticalboolean表示是否纵向合并单元格。@Excel(mergeVertical = true)
mergeRelyint[]指定合并单元格时依赖的列,数组中的数字为列的索引。@Excel(mergeRely = {1})
isImportFieldString定义是否为导入字段,“true"或"false”。@Excel(isImportField = "true")
isWrapboolean定义是否自动换行。@Excel(isWrap = true)
exportFormatString定义导出时的格式化模式,如日期格式。@Excel(exportFormat = "yyyy-MM-dd")
importFormatString定义导入时的格式化模式。@Excel(importFormat = "yyyy-MM-dd")
imageTypeint定义图片类型(如1表示从文件导入,2表示从数据库导入)。@Excel(imageType = 1)
suffixString定义文本后缀,如在文本后添加特定的后缀。@Excel(suffix = "%")
typeint定义字段类型(如1表示文本,2表示图片)。@Excel(type = 1)
enumExportFieldString定义枚举导出时,调用枚举字段的哪个方法获取实际的值。@Excel(enumExportField = "getText")
savePathString定义图片保存路径,仅对导入有效。@Excel(savePath = "/tmp")
dateFormatString简化的日期格式设置,简化的exportFormat/importFormat。@Excel(dateFormat = "yyyy-MM-dd")
use1904windowingboolean定义是否使用1904年日期窗口。@Excel(use1904windowing = true)
fixedIndexint指定Excel列的索引,从0开始,用于导入时准确匹配列位置。@Excel(fixedIndex = 0)
groupNameString用于分组导出/导入时定义的组名。@Excel(groupName = "group1")
dictString用于指定数据字典,将数据转换为对应的文本值。@Excel(dict = "sex=1_男,2_女")
replaceString[]定义要替换的值,用于导出时将字段值替换为指定的文本值。@Excel(replace = {"男_1", "女_2"})
statisticsboolean定义是否进行统计,用于对数字字段进行求和统计。@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表列数据为空

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

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

相关文章

Flink系列之:学习理解通过状态快照实现容错

Flink系列之&#xff1a;学习理解通过状态快照实现容错 状态后端检查点存储状态快照状态快照如何工作&#xff1f;确保精确一次&#xff08;exactly once&#xff09;端到端精确一次 状态后端 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state…

大数据之文件服务器方案

大数据文件服务器方案 一&#xff0c;文件服务器常用框架 二&#xff0c;文件服务器常用框架的实现技术 文件服务器常用框架 文件服务器是一种专门用于存储、管理和共享文件的服务器&#xff0c;其常用框架的实现技术涉及多个方面&#xff0c;以下是一些主要的实现技术及其详…

车载总线系列 --- CAN FD简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

Oracle与SQL Server的语法区别

1&#xff09;日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

在培训班学网络安全有用吗

在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;成为了企业和个人关注的焦点。随着对网络安全人才需求的不断增长&#xff0c;各种网络安全培训班也如雨后春笋般涌现。然而&#xff0c;在培训班学网络安全真的有用吗? 一、网络安全的重要性与挑战 1. 信息时代的…

【C++、数据结构】哈希表——散列表(一)(概念/总结)

「前言」 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C / STL使用以及模拟实现 &#x1f308;数据结构专栏&#xff1a; 数据结构 / 十大排序算法 &#x1f308;Linux专栏&#xff1a; Linux系统编…

求逻辑地址的页号和物理地址

逻辑地址空间按字编址 -->逻辑地址长度为&#xff1a;log2(逻辑地址空间&#xff09; 页的大小 --> 页内偏移量占log(页的大小) 逻辑页号页内偏移量逻辑地址长度 因此假如一个逻辑地址空间为64kb,页的大小为1kb&#xff0c;逻辑地址为17CAH&#xff0c;求逻辑地址页号…

ETLCloud怎么样?深度解析其在数据管理中的表现

在BI或数据大屏等数据分析工具中&#xff0c;经常需要从多个业务系统中提取原始数据&#xff0c;然后对数据进行清洗、处理&#xff0c;以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用&#xff0c;从高质量的实现企业数据的价值变现。 然而&#xff0c;在…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据查询(超详细)

目录 一、单表查询 1. 简单的数据查询 &#xff08;1&#xff09;选择表中若干列 &#xff08;2&#xff09;选择表中若干行&#xff08;元祖&#xff09; 2. 聚合函数与分组查询 聚集函数 GROUP BY分组查询 二、联接查询 1、连接概述 2. 内联接&#xff08;INNER JO…

【Effective C++】阅读笔记3

1. 成员变量声明为Private 建议将成员变量声明为Private&#xff0c;然后再public中提供调用该数据的接口 设置成Private的原因分析 类内成员变量被声明为Private&#xff0c;那么就可以外部代码直接访问或者修改内部数据通过公共接口获取内部数据&#xff0c;这样可以减少对外…

我在命令行下学日语

同一个动作重复 300 遍&#xff0c;肌肉就会有记忆&#xff0c;重复 600 遍&#xff0c;脊柱就会有记忆&#xff0c;学完五十音图不熟练&#xff0c;经常遗忘或者要好几秒才想得起来一个怎么办&#xff1f;没关系&#xff0c;我做了个命令行下的小游戏 KanaQuiz 来帮助你记忆&a…

c++:vector

一、vector是什么&#xff1f; 1.1 vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是…

一键切换暗黑模式,这些代码片段你不可错过

文章目录 前言正文1.多主题切换2.使用 SASS 实现轻松深色模式3.动画切换浅色与深色模式4.纯 CSS 主题切换5.GitHub 风格的深色模式切换6.持久深色模式7.基本 Vue 响应式切换8.创意灯泡切换 总结 前言 如今&#xff0c;许多网站设计师都会为用户提供浅色和深色模式的选择。这不…

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年&#xff0c;求伯君用128万行代码编写出了WPS1.0&#xff0c;宣告了中国自主办公时代的开启。 那时候&#xff0c;雷军还在武汉大学深造&#xff0c;他早就把求伯君当成了自己的榜样&#xff0c;这一来二去的&#xff0c;雷军和WPS之间也就结下了不解之缘…

[MySQL#10] 索引底层(1) | Page | 页目录

目录 1. 初识索引 2. 认识磁盘 3. MySQL与磁盘交互基本单位 4. 索引的理解 1. 重谈Page 2. 为什么IO交互要用Page 3. 有主键的表插入数据时的排序 4. 单个Page与多个Page 4.1 单个Page 4.2 多个Page 目录 单Page目录 多Page目录 在看本文之前&#xff0c;可以回顾…

sklearn 实现随机森林分类器 - python 实现

python sklearn 实现随机森林分类器 from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 加载数据集 irisload_iris() x,yiris.data,iris.target print("x y shape:",x.shape,y.shape) # 创建并训练模型 model Random…

Altium Designer使用技巧(二)

一、创建类 1、按DC键&#xff0c;打开对象类。 2、右键添加一个类。命名为PWR。 3、将所有的电源类&#xff0c;全部添加到新创建的类中&#xff0c;从非成员类中点选到成员类中。 4、右下角点panes ,点PCB。 5、然后在左边单击PWR&#xff0c;点连接&#xff0c;可显示或…

<十六>Ceph mon 运维

Ceph 集群有故障了&#xff0c;你执行的第一个运维命令是什么&#xff1f; 我猜测是ceph -s 。无论执行的第一个命令是什么&#xff0c;都肯定是先检查Mon。 在开始之前我们有必要介绍下Paxos协议&#xff0c;毕竟Mon就是靠它来实现数据唯一性。 一&#xff1a; Paxos 协议 1…

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…

多处理机调度(李昂学长视频总结)25新增考点

多处理机定义&#xff1a;多处理机指的是某个计算机系统中有多个cpu&#xff0c;在多处理机调度中&#xff0c;多处理机一般指的是共享存储器处理机&#xff0c;其两个或更多的cpu全部共享一个公用的RAM。 根据系统中的处理机相同与否&#xff0c;可将多处理机系统分为如下两类…