You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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-102024-05-12
2024-05-152024-05-18

内容的提问来源于stack exchange,提问作者Nevil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:28:07