使用JXLS API生成Excel报表:如何实现先列后行的嵌套循环?
用JXLS实现按列循环外层对象、按行循环内层对象的嵌套报表需求
我来帮你搞定这个JXLS的嵌套循环需求!你要的是外层数组按列迭代,内层数组在对应列里按行迭代,核心就是利用JXLS的direction属性指定迭代方向,下面给你一步步拆解实现方法:
核心思路
JXLS默认的<jx:forEach>是按行迭代(direction="ROW"),要实现外层按列循环,只需要给外层的forEach加上direction="COL"属性,让它每迭代一个外层对象就跳到下一列;内层的forEach保持默认行方向,在当前列里向下迭代内层对象。
Excel模板写法示例
假设你的业务场景是:每一列对应一个Team(外层对象),列头显示团队名称,下面的行显示该团队的员工姓名、请假日期(内层对象属性),模板单元格内容如下(标注单元格位置方便你对应):
| 单元格 | 内容 |
|---|---|
| A1 | 团队名称 |
| B1 | <jx:forEach items="teams" var="team" direction="COL">${team.name}</jx:forEach> |
| A2 | 员工姓名 |
| B2 | <jx:forEach items="teams" var="team" direction="COL"><jx:forEach items="team.employees" var="employee">${employee.name}</jx:forEach></jx:forEach> |
| A3 | 请假日期 |
| B3 | <jx:forEach items="teams" var="team" direction="COL"><jx:forEach items="team.employees" var="employee">${employee.leaveDate}</jx:forEach></jx:forEach> |
代码里的数据准备示例(Java)
对应模板里的teams和employees,你需要准备好嵌套的数据结构:
import java.time.LocalDate; import java.util.Arrays; import java.util.List; // 外层对象:Team(对应你的OuterObject) class Team { private String name; private List<Employee> employees; public Team(String name, List<Employee> employees) { this.name = name; this.employees = employees; } // 必须提供getter,JXLS需要通过反射读取属性 public String getName() { return name; } public List<Employee> getEmployees() { return employees; } } // 内层对象:Employee(对应你的InternalObject) class Employee { private String name; private LocalDate leaveDate; public Employee(String name, LocalDate leaveDate) { this.name = name; this.leaveDate = leaveDate; } public String getName() { return name; } public LocalDate getLeaveDate() { return leaveDate; } } // 数据组装 public class ReportData { public static List<Team> getTeams() { return Arrays.asList( new Team("研发部", Arrays.asList( new Employee("张三", LocalDate.of(2024, 5, 10)), new Employee("李四", LocalDate.of(2024, 5, 15)) )), new Team("市场部", Arrays.asList( new Employee("王五", LocalDate.of(2024, 5, 12)), new Employee("赵六", LocalDate.of(2024, 5, 18)) )) ); } }
关键注意事项
- 外层必须加
direction="COL":这是实现列方向迭代的核心,没有这个属性的话,外层对象会默认按行排列,不符合你的需求。 - 内层forEach要嵌套在外层forEach的单元格内:确保每个列对应的外层对象,只会迭代自己的内层数组,不会串列。
- 模板样式保留:你可以提前给模板单元格设置字体、对齐方式、边框等样式,JXLS会自动将这些样式应用到生成的所有迭代单元格上。
- 属性访问要正确:确保你的实体类有对应的getter方法,JXLS依赖反射读取属性值,没有getter会导致数据无法填充。
生成效果预览
最终生成的Excel会是这样的结构:
| 团队名称 | 研发部 | 市场部 |
|---|---|---|
| 员工姓名 | 张三 | 王五 |
| 李四 | 赵六 | |
| 请假日期 | 2024-05-10 | 2024-05-12 |
| 2024-05-15 | 2024-05-18 |
内容的提问来源于stack exchange,提问作者Nevil
相关产品推荐
相关产品推荐

