若依框架导出Excel,如何优雅地合并相同订单号的行?一个注解搞定

发布时间:2026/6/8 2:03:08

若依框架导出Excel,如何优雅地合并相同订单号的行?一个注解搞定 若依框架Excel导出进阶基于注解的智能行合并实战指南在订单管理、报表统计等业务场景中我们经常需要将数据库中的列表数据导出为Excel文件。当数据中存在相同订单号的多条记录时传统的导出方式会导致Excel中出现大量重复内容严重影响报表的可读性和专业性。本文将深入探讨如何利用若依框架的Excel注解通过简单的配置实现相同订单行的智能合并让您的报表输出更加优雅高效。1. 业务场景与痛点分析假设我们正在开发一个电商后台管理系统订单数据表结构如下CREATE TABLE order_detail ( id bigint NOT NULL, order_no varchar(32) COMMENT 订单编号, product_name varchar(100) COMMENT 商品名称, specification varchar(50) COMMENT 规格, price decimal(10,2) COMMENT 单价, quantity int COMMENT 数量, total_amount decimal(10,2) COMMENT 总金额 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;当导出包含多个订单项的数据时常规导出效果如下表所示订单编号商品名称规格单价数量总金额ORD20230001iPhone 14128G599915999ORD20230001AirPods Pro二代149922998ORD20230002MacBook ProM2 16G12999112999这种展示方式存在三个明显问题重复信息干扰相同订单号在多行重复显示影响阅读专注度数据关联性弱化难以直观看出哪些商品属于同一订单专业度不足不符合商业报表的常规呈现方式2. 若依框架的解决方案概览若依框架在其ruoyi-common模块中提供了强大的Excel工具类通过扩展Excel注解的mergeLine属性我们可以实现基于主键字段合并指定根据哪个字段如orderNo进行行合并多列联动合并主键列合并时其他指定列同步合并智能间隙处理自动识别不同订单间的分界点合并后的理想效果订单编号商品名称规格单价数量总金额ORD20230001iPhone 14128G599915999^AirPods Pro二代149922998ORD20230002MacBook ProM2 16G12999112999注^表示该单元格与上方合并3. 实现步骤详解3.1 环境准备确保项目使用的是若依前后端分离版本并包含以下依赖dependency groupIdcom.ruoyi/groupId artifactIdruoyi-common/artifactId version4.0.0/version /dependency3.2 实体类注解配置在订单实体类上添加Excel注解并配置mergeLine属性public class OrderDetail { Excel(name 订单编号, mergeLine 0,5) // 合并第0列(订单编号)和第5列(总金额) private String orderNo; Excel(name 商品名称) private String productName; Excel(name 规格) private String specification; Excel(name 单价) private BigDecimal price; Excel(name 数量) private Integer quantity; Excel(name 总金额) private BigDecimal totalAmount; // getters setters }关键参数说明参数类型必填说明mergeLineString否指定合并规则格式为主键列,合并列1,合并列2...^^^列索引从0开始计数^^^主键列必须是被合并行的相同字段3.3 控制器层实现在Controller中使用常规的导出方法即可无需特殊处理GetMapping(/export) public void export(HttpServletResponse response, OrderDetail orderDetail) { ListOrderDetail list orderService.selectOrderList(orderDetail); ExcelUtilOrderDetail util new ExcelUtil(OrderDetail.class); util.exportExcel(response, list, 订单数据); }3.4 核心合并逻辑解析若依框架通过ExcelUtilMerge类实现合并功能主要处理流程数据遍历比对逐行检查当前行与前一行的主键字段值合并区间标记记录需要合并的起始行号和结束行号单元格合并执行当检测到主键变化时对标记区间执行合并关键代码段// 在addCell方法中添加合并逻辑 if (value.equals(value_previous)) { if (this.mergeLine_start 0) { this.mergeLine_start thisLine - 1; } this.mergeLine_end thisLine; } else { if (this.mergeLine_start ! 0 this.mergeLine_end ! 0) { for (String ml : mergeLine) { CellRangeAddress region new CellRangeAddress( this.mergeLine_start, this.mergeLine_end, Integer.parseInt(ml), Integer.parseInt(ml)); sheet.addMergedRegion(region); } } this.mergeLine_start 0; this.mergeLine_end 0; }4. 高级应用与优化建议4.1 多级合并策略对于复杂的报表结构可以实现多级合并// 先按订单合并再按商品类别合并 Excel(name 订单编号, mergeLine 0,5) private String orderNo; Excel(name 商品类别, mergeLine 1,6) private String productCategory;4.2 样式优化技巧合并后的单元格可能需要特殊样式处理垂直居中确保合并后的内容在单元格中居中显示边框强化合并单元格的边框需要特殊处理避免断裂背景色区分不同订单间使用交替背景色增强可读性示例样式配置CellStyle mergedStyle wb.createCellStyle(); mergedStyle.setVerticalAlignment(VerticalAlignment.CENTER); mergedStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); mergedStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cell.setCellStyle(mergedStyle);4.3 性能优化方案当导出大量数据万行以上时建议分批处理将数据分页查询并分段合并缓存复用重复使用单元格样式对象异步导出对于超大数据量采用后台任务导出// 分批处理示例 int batchSize 5000; for (int i 0; i total; i batchSize) { ListOrderDetail batch list.subList(i, Math.min(i batchSize, total)); // 处理合并逻辑 }5. 常见问题排查Q1合并后单元格内容显示不全检查行高是否足够可通过注解的height属性调整Excel(name 订单编号, mergeLine 0,5, height 30)Q2部分合并未生效确认数据是否按主键字段排序检查mergeLine参数格式是否正确列索引从0开始验证主键字段值是否真正相同注意隐藏字符Q3导出速度慢减少不必要的样式操作增加JVM内存-Xmx1024m考虑使用SXSSFWorkbook的窗口模式// 使用流式窗口模式 Workbook wb new SXSSFWorkbook(100); // 保留100行在内存中在实际项目中我们曾遇到一个典型案例导出3万行订单数据时未优化的合并操作耗时约45秒通过采用分批处理每5000行一个批次和样式复用后时间缩短到12秒左右。

相关新闻