JXLS模板求助:重复ID行去重显示及报表样式定制
解决方案
1. 控制重复ID的name/id仅首次显示
利用JXLS的varStatus对象获取当前行索引,通过对比当前行与上一行的ID值,决定是否显示内容:
- 在ID单元格(如A3)写入表达式:
${status.index == 0 ? row.id : (rows[status.index - 1].id == row.id ? '' : row.id)} - 在name单元格(如B3)写入表达式:
${status.index == 0 ? row.name : (rows[status.index - 1].id == row.id ? '' : row.name)} - 数值列(如C3)直接绑定
${row.value}即可,无需判断。
说明:
status.index是当前循环的索引(从0开始),第一行直接显示ID和name;- 后续行对比上一行的ID,相同则留空,不同则显示当前行的ID和name。
2. 分组间插入黄色总计行
需要在jx:each循环内增加条件判断,当当前行是分组最后一行时,插入总计行并设置黄色背景:
步骤1:设计总计行模板
在模板的第4行(假设数据行是第3行)插入总计行,预先设置黄色背景样式,然后给该行添加jx:if指令:
- 总计行A4单元格写
总计,B4单元格留空,C4单元格写动态求和公式; - 给总计行添加指令:
jx:if( test="${status.index == rows.size() - 1 || rows[status.index + 1].name != row.name}" lastCell="C4" )
步骤2:动态计算分组求和范围
为了正确计算分组的求和区间,需在循环开始时记录分组起始行号:
- 在
jx:each指令外部定义变量:<jx:assign var="startRow" value="3" /> - 在数据行(A3)的指令中添加逻辑,当ID变化时更新起始行:
<jx:assign var="startRow" value="${status.index == 0 || rows[status.index - 1].id != row.id ? status.rowNum : startRow}" /> - 此时C4的求和公式可写为:
SUM(C${startRow}:C${status.rowNum})
3. ReportServer集成配置
- 将设计好的JXLS模板(.xlsx格式)上传到ReportServer资源库;
- 创建动态列表,关联目标SQL数据源,必须确保查询结果按
id和name排序(否则分组判断会失效); - 在动态列表的导出设置中,选择上传的JXLS模板作为导出格式,将数据源的结果集绑定到模板的
rows变量; - 测试导出,验证重复ID隐藏和分组总计行的显示效果。
完整模板指令示例
数据行(第3行)的指令:
jx:area(lastCell = "C3") jx:each( items="${rows}" var="row" lastCell="C3" varStatus="status" ) jx:assign var="startRow" value="${status.index == 0 || rows[status.index - 1].id != row.id ? status.rowNum : startRow}" />
总计行(第4行)的指令:
jx:if( test="${status.index == rows.size() - 1 || rows[status.index + 1].name != row.name}" lastCell="C4" )
内容的提问来源于stack exchange,提问作者zitot
相关产品推荐
相关产品推荐

