Ruoyi导出excel,导出对象的子列表

说明:此文章是对ruoyi分离版后台功能,导出excel文件,导出对象的子列表的补充

若依文档:

后台手册 | RuoYi

导出文件结果

:::color4
补充文档场景:

如上图所示,角色中的字段“角色编号”,“角色名称”,“角色字符”作为子集填充到用户中,改变角色子集的显示顺序,将子集放到“用户名称”和“邮箱”中间时,导出的文件为空

:::

在自定义注解 Excel 中添加字段

/*** 是否需要合并行  与 needMerge 以及 子列表不兼容*/
public boolean lineMerge() default false;/*** 合并行的依据的主键*/
public boolean lineMergeId() default false;

修改 ExcelUtil.fillExcelData方法

public void fillExcelData(int index, Row row) {int startNo = index * sheetSize;int endNo = Math.min(startNo + sheetSize, list.size());int rowNo = (1 + rownum) - startNo;String objIdValve = "";//注解中 lineMergeId 为true的value 合并单元格使用int mergeStartRow = 0;//合并单元格 起始行for (int i = startNo; i < endNo; i++) {rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo;row = sheet.createRow(rowNo);// 得到导出对象.T vo = (T) list.get(i);Collection<?> subList = null;if (isSubList()) {if (isSubListValue(vo)) {subList = getListCellValue(vo);subMergedLastRowNum = subMergedLastRowNum + subList.size();} else {subMergedFirstRowNum++;subMergedLastRowNum++;}}int column = 0;boolean mergeCells = false;//合并单元格 当前单元格是否需要合并for (Object[] os : fields) {Field field = (Field) os[0];Excel excel = (Excel) os[1];/*** 合并单元格判断条件处理*/if (excel.lineMergeId()) {try {Object value = getTargetValue(vo, field, excel);if (!objIdValve.equals(value.toString())) {objIdValve = value.toString();mergeCells = false;mergeStartRow = rowNo;} else {mergeCells = true;}} catch (Exception e) {log.error("合并单元格导出主键获取失败,导出Excel失败{}", e);}}if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) {boolean subFirst = false;for (Object obj : subList) {if (subFirst) {rowNo++;row = sheet.createRow(rowNo);}List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class);int subIndex = 0;for (Field subField : subFields) {if (subField.isAnnotationPresent(Excel.class)) {subField.setAccessible(true);Excel attr = subField.getAnnotation(Excel.class);this.addCell(attr, row, (T) obj, subField, column + subIndex);}subIndex++;}subFirst = true;}this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size();} else {this.addCell(excel, row, vo, field, column++);}/*** 合并单元格操作*/if (excel.lineMerge() && mergeCells) {if (rowNo - mergeStartRow > 1) {List<CellRangeAddress> cellList = new ArrayList<>(sheet.getMergedRegions());for (int i1 = 0; i1 < cellList.size(); i1++) {CellRangeAddress ca = cellList.get(i1);if (mergeStartRow == ca.getFirstRow() && rowNo - 1 == ca.getLastRow() && column - 1 == ca.getFirstColumn() && column - 1 == ca.getLastColumn()) {sheet.removeMergedRegion(i1);}}}sheet.addMergedRegion(new CellRangeAddress(mergeStartRow, rowNo, column - 1, column - 1));}}}}

具体使用方式

在用户编号 @Excel注解中添加 lineMergeId = true,合并单元格的行以此为合并依据,没有此标记则不会执行合并单元格

在需要合并的列中的@Excel注解中添加 lineMerge = true

注:自定义注解 Excel中原有 needMerge字段 以及 ExcelUtil中的子列表不兼容

@Data
public class SysUser{@Excel(name = "用户编号", lineMergeId = true, width = 20, lineMerge = true)private String userId;@Excel(name = "用户名称", width = 20, lineMerge = true)private String userName;@Excel(name = "邮箱", width = 20, lineMerge = true)private String email;@Excel(name = "角色编号")private String roleId;@Excel(name = "角色名称")private String roleName;@Excel(name = "角色字符")private String roleKey;
}    

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

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

相关文章

MBR40150FCT-ASEMI大功率肖特基MBR40150FCT

编辑&#xff1a;ll MBR40150FCT-ASEMI大功率肖特基MBR40150FCT 型号&#xff1a;MBR40150FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 正向电流&#xff1a;40A 反向电压&#xff1a;150V 正向压降&#xff1a;0.95V~1.90V 引线数量&#xff1a;3 芯片个数&am…

构建数字化诊断平台,助力服务商与企业共赢

在当今时代&#xff0c;全球信息化、网络化、智能化趋势日益明显&#xff0c;数字化转型已成为企业发展的必然选择。近年来&#xff0c;我国经济发展进入新常态&#xff0c;市场竞争愈发激烈&#xff0c;企业面临诸多挑战。因此&#xff0c;全国各地也在逐步且持续地推动和组织…

接口自动化测试框架搭建详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、基本目录的搭建 report&#xff1a;静态输出目录(报告或者日志) data&#xff1a;静态输入目录(可以存放Excel数据&#xff0c;被读取的一些数据) utils&…

找不到x3daudio1_7.dll无法继续执行代码怎么解决,共有七种方法

​在使用某些游戏或多媒体应用时&#xff0c;您可能会遇到“找不到X3DAudio1_7.dll”这样的错误提示。这个问题不仅会影响游戏的启动和音效质量&#xff0c;还可能引发其他系统性能问题。本文将全面解读X3DAudio1_7.dll丢失的原因、具体影响、解决方法以及预防措施&#xff0c;…

连接器上市企业观察:通讯利好,光储承压

【哔哥哔特导读】2024年已临近尾声&#xff0c;前三季度&#xff0c;29家连接器上市企业业绩如何?通讯、光伏、储能等器热门领域&#xff0c;连接器行业总体趋势相较上一年发生了什么变化&#xff1f; 10月份&#xff0c;连接器上市企业集中发布三季度业绩报告。《国际线缆与…

锂电池保护板行业分析与未来预测

锂电池保护板是对串联锂电池组的充放电保护&#xff1b;在充满电时能保证各单体电池之间的电压差异小于设定值&#xff08;一般20mV&#xff09;&#xff0c;实现电池组各单体电池的均充&#xff0c;有效地改善了串联充电方式下的充电效果&#xff1b;同时检测电池组中各个单体…

企业u盘管控丨企业禁止U盘使用的5个小妙招分享!你最看好哪一个?

在企业日常运营中&#xff0c;U盘因其便携性和易用性&#xff0c;成为了数据传输的重要工具。 然而&#xff0c;若不对U盘使用加以严格管控&#xff0c;便可能引发数据泄露、病毒感染、管理混乱和资源滥用等一系列问题。 接下来&#xff0c;我们将分享五个企业禁止U盘使用的小…

Linux中扫描网络的“nmap”工具使用方法

0-介绍 在Linux中进行网络管理的最强大工具之一首推nmap。如果您想要扫描您的网络&#xff0c;查看哪些端口是开放的以及正在运行的服务&#xff0c;nmap是您的理想选择。注意手机上termux 中的用法一致。 1-什么是nmap? nmap属于网络映射器h工具&#xff0c;是一个用于扫描…

NVR小程序接入平台EasyNVR多品牌NVR管理设备:GB28181协议摄像头如何接入到EasyNVR中?

随着视频监控技术的不断进步&#xff0c;摄像头拉流技术已经成为现代安防系统中的关键组成部分。在众多拉流协议中&#xff0c;GB28181协议凭借其高安全性和设备兼容性&#xff0c;在大规模、跨区域的视频监控系统中展现出显著优势。本文将详细介绍如何将GB28181协议摄像头接入…

通胀降温遇到波动,美联储降息或成更大争议焦点

近期美国的通胀数据继续呈现出不均衡的走低趋势。尽管10月份的消费价格同比上涨略有回升&#xff0c;通胀整体走势依然显示出降温的迹象。根据最新报告&#xff0c;虽然通胀没有完全消退&#xff0c;但依然无法阻止市场对美联储在12月份可能再次降息的预期。不过&#xff0c;这…

不锈钢高速肉馅斩拌机:

不锈钢高速肉馅斩拌机通过斩切作用提高产品的细密度和弹性&#xff0c;广泛应用于肉制品的深加工制作&#xff0c;如机制作肉丸、香肠等。其工作原理是利用斩刀高速旋转的斩切作用&#xff0c;将原料进行斩切和乳化处理&#xff0c;从而提高产品的细腻度和弹性。斩拌机具有以下…

1.0版-结构化(经典)软件开发方法: 需求分析阶段+设计阶段

结构化软件开发方法: 特点: 面向数据流, 以数据流为中心构建软件的分析/设计模型 结构化分析模型:数据流图 结构化设计模型:结构图, 模块的程序流程图 1.建立结构化分析模型: 数据流图--DFD图 功能建模, 规约加工流程 实体关系图-ER图 数据建模, 对实体对象的描述 状态转换图-S…

C++基础:Pimpl设计模式的实现

2024/11/14: 在实现C17的Any类时偶然接触到了嵌套类的实现方法以及Pimpl设计模式&#xff0c;遂记录。 PIMPL &#xff08; Private Implementation 或 Pointer to Implementation &#xff09;是通过一个私有的成员指针&#xff0c;将指针所指向的类的内部实现数据进行隐藏。 …

Intellij idea 报错:Error : java 不支持发行版本5

点击“Settings”-->“Bulid, Execution,Deployment”-->“Java Compiler”&#xff0c;Target bytecode version设为本地Java版本。&#xff08;可以在Default Settings中把Project bytecode version 一劳永逸地配置成本地Java版本&#xff09; Default Settings&#x…

物理验证Calibre LVS Stamping Conflict SoftConnect案例解析

最近有好几个星球会员问到物理验证Calibre LVS检查中的Stamping Conflict问题。小编今天给大家分享下Stamping冲突的相关topic。 Calibre PEX Hspice Netlist提取步骤&#xff08;数模芯片提取spice netlist流程&#xff09; Stamping Conflict概念 当不同的net对应的net sha…

TypeScript在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 引言 TypeScript 概述…

代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列

134. 加油站 题目链接&#xff1a;134. 加油站 思路&#xff1a; 由题意可得&#xff0c;需要能够走完所有的加油站&#xff0c;就需要保证车到达每一个加油站的时候有油&#xff0c;故先对gas和cost数组做差&#xff0c;得到每个加油站的油差&#xff0c;正代表着车在这里能加…

Burp Suite 专业版使用【Mac版本 m1处理器】

前言 Burp Suite 专业版(Professional)是需要付费使用的,但是社区版(Community)是免费的,下图第一个下拉框可以切换专业版和社区版本。 Burp Suite 专业版如果没有License key,是不能正常使用的,下边是在没有购买License key的情况下使用Burp Suite 专业版的方法。 本文是…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …

【热门主题】000044 大数据治理:开启数据时代新征程

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…