@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";

   @Override
   public Class<?> supportJavaTypeKey() {
      return Converter.super.supportJavaTypeKey();
   }

   @Override
   public CellDataTypeEnum supportExcelTypeKey() {
      return Converter.super.supportExcelTypeKey();
   }

   @Override
   public 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表列数据为空

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云数据中心基础环境-详细设计方案(364页WORD)

文档介绍&#xff1a; 随着云计算技术的飞速发展&#xff0c;云数据中心已成为企业数字化转型的核心基础设施&#xff0c;承载着数据存储、处理、分析和应用的重任。本设计方案旨在构建一个高性能、高可用、高安全性的云数据中心基础环境&#xff0c;以满足企业日益增长的业务需…

在 CSS 中,gap 是 布局容器(flex 或 grid)的属性。它用于设置容器内子元素之间的间距。

在 CSS 中&#xff0c;gap 是 布局容器&#xff08;flex 或 grid&#xff09;的属性。它用于设置容器内子元素之间的间距。以下是 gap 属性在不同布局中的应用&#xff1a; 1. 在 CSS Grid 布局中 gap 定义了网格行和列之间的间距。可以分别使用 row-gap 和 column-gap 设置行…

Python练习9

Python日常练习 题目&#xff1a; 编程序计算形式如&#xff1a;sumaaaaaaaaaa…aaa…aaa的表达式的值。 说明&#xff1a; 补充完整函数fun()&#xff0c;其中a为小于10的自然数&#xff0c;n为项数&#xff0c;给定 变量result作为函数返回值&#xff0c;变量ts作为…

浙江深大智能科技有限公司管控平台服务端存在任意文件上传漏洞

漏洞描述 智游宝是连接景区与分销商(OTA、旅行社)的公正、权威、可信的第三方服务平台。作为国内智慧景区第三方技术服务支撑平台&#xff0c;智游宝为景区提供了可控制分销商的管理环境&#xff0c;安全、便捷、高效地实现了电子票的生产、发送、检票、退换票以及票款回收等技…

Pr 视频过渡:沉浸式视频 - VR 默比乌斯缩放

效果面板/视频过渡/沉浸式视频/VR 默比乌斯缩放 Video Transitions/Immersive Video/VR Mobius Zoom VR 默比乌斯缩放 VR Mobius Zoom用于 VR 视频中的缩放式场景切换&#xff0c;通过缩小或放大的渐变效果在两个场景之间平滑过渡。 自动 VR 属性 Auto VR Properties 默认勾选…

Hive操作库、操作表及数据仓库的简单介绍

数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库)&#xff0c;叫联机事务处理OLTP&#xff08;On-Line Transaction Processing&#xff09;&#xff0c;也可以称面向用户交易的处理系统&#xff0c;它是针对具体业务…

ssm063基于SSM框架的德云社票务系统的设计与实现+vue(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 题 目&#xff1a; 基于SSM框架的德云社票务系统 专 题&#xff1a; 学 院&#xff1a; 班 级&#xff1a; …

基于vue框架的的民宿网站30lx7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,客房类型,民宿信息,民宿预订,民宿退订,续租信息,换房信息 开题报告内容 开题报告 题目&#xff1a;基于Vue框架的民宿网站开发 一、立论依据 选题背景与意义 随着旅游业的快速发展&#xff0c;民宿作为一种独特的住宿方式&…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一&#xff0c;什么是pod1.1pod在k8s中使用方法&#xff08;1&#xff09;使用方法一&#xff08;2&#xff09;使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理&#xff08;1&#xff09;pause容器的作用 1.4 Pod分类&#xff1a;&#xff08;1&#xff09;自主式…

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器&#xff08;需要不被服务商限制发件收件的&#xff0c;也就是端口25、110、143、465、587、993、995不被限制&#xff09;&#xff0c;如有防火墙或安全组需要把这些端口开放 2. 一个域名&#xff0c;最好是com cn org的一级域名 3. 域名备案&am…

【论文翻译】TKDE 2024 | ST-MAN:用于交通预测的时空记忆增强的多级注意力网络

论文题目Spatio-Temporal Memory Augmented Multi-Level Attention Network for Traffic Prediction论文链接https://ieeexplore.ieee.org/document/10285880发表期刊/年份TKDE 2024关键词城市计算、时空预测、交通预测、记忆网络、注意力网络 摘要 交通预测是城市计算中一个重…

【每日一题】2009考研数据结构 - 求倒数第k个数的值

已知一个带有表头结点的单链表&#xff0c;结点结构为 data 和 link。假设该链表只给出了头指针 list。在不改变链表的前提下&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找链表中倒数第 k 个位置上的结点&#xff08;k 为正整数&#xff09;。 要求&#xff1a; 若…

ELF加载,进程地址空间与可执行程序的关系

1&#xff0c;可执行程序的格式 粗略概况 操作系统要如何认识可执行程序&#xff1f;我们的可执行程序是有格式的&#xff1a; 用指令size 加可执行程序名&#xff1a; 其中test就是代码块&#xff0c;data就是数据块&#xff0c;不仅可执行程序有格式&#xff0c;动态库&am…

超实惠的租借服务器训练深度学习方法

1. 必备软件 1.1 Xftp和Xshell 通过百度网盘分享的文件&#xff1a;Niha 链接&#xff1a;https://pan.baidu.com/s/1uHLme7H9SL2C-ZhFr107gA?pwdnadb 提取码&#xff1a;nadb xftp用于连接服务器, 传输本地文件到服务器上面去。 xshell用于连接服务器进行命令操作 2 恒源…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree&#xff1f;1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

【Android】时区规则库tzdata更新

1 背景&#xff1a; 最近我遇到墨西哥城时区&#xff0c;会出现夏令时&#xff0c;而墨西哥城在2022年底都已经取消夏令时了。 看起来是要更新RK3588上的时区库&#xff0c;我的还是2021a&#xff0c;而现在都已经2024年了 这样能看版本号&#xff1a; cat /system/usr/sha…

网络初始:TCP/IP 五层协议模型 网络通信基本流程

目录 1. 名词解释 1.1 局域网 1.2 广域网 1.3 交换机 1.4 IP 地址 1.5 端口号 2. 协议 2.1 认识协议 2.2 五元组 3. 协议分层 3.1 分层的作用 3.2 OSI 七层网络模型 & TCP/IP 五层(四层)协议模型 4. TCP/IP 五层(四层)网络模型 4.1 物理层 4.2 数据链路层 4…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

安利一款超6K+ star的可拖放响应式灵活的网格布局Gridstack.js

Gridstack.js是一个现代JavaScript&#xff08;或Typescript&#xff09;库&#xff0c;旨在帮助开发人员快速构建交互式和响应式的布局。以下是对Gridstack.js的详细介绍&#xff1a; 一、主要特点 灵活的网格布局&#xff1a;Gridstack.js允许开发者轻松地创建和管理网格布局…