@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.xdnf.cn/news/3335.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue组件在项目中的常用业务逻辑(2)

完成一个项目的模块总体分为四步&#xff1a; 一、先静态页面 静态组件拆分出来 二、发请求(API) 三、vuex三连环 1.导入api里的search模块请求 2.捞那个请求的数据 先用async和await 再传值给result&#xff0c;添加空对象&#xff0c;派发actions&#xff1a; 3.在mutatio…

气膜球幕展览馆:引领展示新风潮,震撼视界—轻空间

随着展览行业的不断发展&#xff0c;越来越多的创意场地应运而生&#xff0c;而气膜球幕展览馆凭借其独特的球形外观和创新的结构设计&#xff0c;迅速成为展览和活动行业中的新宠。无论是艺术展览、品牌展示&#xff0c;还是各种大型活动&#xff0c;气膜球幕展览馆都以其极具…

stm32 如何生成.bin文件-keil fromelf.exe使用

文章目录 一、fromelf.exe简介二、生成.bin文件设置工程&#xff1a;编译工程&#xff1a;配置fromelf.exe&#xff1a;重新编译&#xff1a; 三、fromelf.exe的其他功能四、使用注意事项五、总结 keil fromelf.exe使用 在Keil的开发流程中&#xff0c;fromelf.exe工具扮演了至…

【数据分析】如何构建指标体系?

有哪些指标体系搭建模型&#xff1f;五个步骤教你从0开始搭建指标体系 一、企业指标体系搭建存在什么问题 许多企业在搭建数据指标体系时遇到了诸多难题&#xff0c;如问题定位不准确、数据采集不完整、目标不一致、报表无序、指标覆盖不全面以及报表价值未充分利用等。 1、…

通过 ssh config 快速免密连接服务器

通过 ssh config 快速免密连接服务器 目录 通过 ssh config 快速免密连接服务器1. 创建ssh的私钥和公钥的话 &#xff08;如果已经做过可忽略&#xff09;2. 创建config文件&#xff0c;填写服务器配置3. 允许在远程服务器的授权密钥上安装 SSH 密钥 1. 创建ssh的私钥和公钥的话…

客户关系管理(CRM)是什么?CRM定义最全解读!

有企业就有业务&#xff0c;有业务就有客户&#xff0c;所以客户关系管理&#xff08;CRM&#xff09;系统是企业管理中不可或缺的一部分&#xff0c;它帮助企业有效管理与客户之间的关系&#xff0c;提升客户满意度和忠诚度。本文将重点探讨CRM的概念和不同的定义&#xff0c;…

lc 142 环形链表II

先判断存在环形链表&#xff0c;然后根据 x z&#xff0c;得到入口 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val x; * next null; * } * } */ public class Sol…

骑行,每天骑行多少最好?

热爱骑行的人都知道&#xff0c;每一次转动踏板都像是与风的对话&#xff0c;与大地的亲吻。我们校长骑行群的伙伴们&#xff0c;如同追逐自由的飞鸟&#xff0c;在骑行的道路上享受着速度与激情、宁静与思考。然而&#xff0c;一个看似简单却至关重要的问题常常萦绕在我们心头…

智能驾驶系列报告之一:高精度定位,智能驾驶的可靠辅助

城市导航辅助驾驶迅速落地&#xff0c;高精度定位迎来发展契机&#xff1a;首先&#xff0c;以城市 NOA为代表的 L3 级别功能正快速落地&#xff0c;智能驾驶已成各车企竞争的核心领域&#xff0c;搭载城市 NOA 功能的车型数量及渗透率快速提升。伴随电动化和智能化的提升&…

LeetCode136只出现一次的数字I

题目描述&#xff1a;给你一个非空整数数组nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 看到这个题第一想法应该是使用map记录数字及数字出现的次数&#xff0c;如果原数组长度为n&#xff0c;则map的记录条…

React 前端使用 Input 输入框的样式上传一个 Excel 文件并读取内容对象数组

本文讲解了关于如何在 React 前端使用 Input 输入框上传一个 Excel 文件&#xff0c;并读取文件内容转成 json 数据格式&#xff08;对象数组&#xff09;。 文章目录 1、Excel 文件展示2、完整代码3、数据结果展示4、前端样式展示5、使用 button 按钮的前端样式 1、Excel 文件…

Kubernetes:(五)Pod 基础概念

文章目录 一、Pod基础概念pod的状态容器&#xff08;Container&#xff09;生命周期pod创建容器的过程&#xff1a; 二、底层容器Pause三、初始化容器&#xff08;initcontainers&#xff09;四、Pod容器的分类五、镜像拉取策略&#xff08;image PullPolicy&#xff09;六、重…

【Vue 全家桶】2、Vue 组件化编程

目录 模块与组件、模块化与组件化 component模块组件 非单文件组件单文件组件 .vue 模块与组件、模块化与组件化 component 模块 组件 局部功能代码和资源的集合 非单文件组件 // 1、创建组件 const school Vue.extend({data(){return {}} }) const student Vue.extend(…

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性.pdf 链接: https://pan.baidu.com/s/1UreAzlB_P7tGH_WoFL2Ybg?pwd1234 提取码: 1234 https://share.weiyun.com/eQCyAPYh 通过网盘分享的文件&#xff1a;IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性…

el-input限制只能输入合法的数字

// 校验输入的数字是一个合法有效的数字 export function setValue(e) {return e.replace(/[^0-9.]/g, "") // 移除非法字符 .replace(/^0/, "0").replace(/^0(\d|\.$)/, "0$1") // 只保留一个开头的零&#xff08;如果存在&#xff09;&#x…

智能AI快速生成演示文

文多多AIPPT&#xff1a;智能AI快速生成演示文稿&#xff0c;仅需提供核心主题&#xff0c;1分钟内即可完成PPT创作&#xff01; 通过点击图片或链接进行注册&#xff0c;您将获得9次免费体验文多多AIPPT的机会。https://docmee.cn/?sourceiui 当谈到PPT&#xff0c;很多人的第…

google adsense广告费中国收款结算被银行拒解决办法

多年前搞了几个网站&#xff0c;挂了谷歌google adsense广告&#xff0c;不知道不觉到了100美金最低结算&#xff0c;谷歌给我打款&#xff0c;之前是绑定交银银行的。被银行镜内登陆谷歌不合法不合规给拒绝入账&#xff0c;把美金退回了&#xff0c;怎么办&#xff1f; googl…

小语言模型介绍与LLM的比较

小模型介绍 小语言模型&#xff08;SLM&#xff09;与大语言模型&#xff08;LLM&#xff09;相比&#xff0c;具有不同的特点和应用场景。大语言模型通常拥有大量的参数&#xff08;如 GPT-3 拥有 1750 亿个参数&#xff09;&#xff0c;能够处理复杂的自然语言任务&#xff…

哲学家就餐问题(Java实现信号量和PV操作)

哲学家就餐是经典的PV操作。 一个哲学家同时拿起左边的筷子和右边的筷子进行就餐&#xff0c;每一个哲学家都会等待右边的筷子&#xff0c;具备了死锁问题之一的循环等待。 基础的哲学家就餐问题代码 在Java中&#xff0c;Semaphore 是一个用于控制对某个资源的访问的同步工具…