在jxls操作excel文件一文中,提到可以使用<jx:forEach>进行迭代处理,JXLS中还有另一种循环方式,且看如下示例。
Excel模板如下所示:
现有类Staff,内容如下所示:
/** * */ package com.geloin.jxls.beans; /** * @author Geloin * */ public class Staff { public Staff(String name, Double payment, Double bonus) { super(); this.name = name; this.payment = payment; this.bonus = bonus; } /** * 名称 */ private String name; /** * 薪资 */ private Double payment; /** * 年终奖 */ private Double bonus; public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPayment() { return payment; } public void setPayment(Double payment) { this.payment = payment; } public Double getBonus() { return bonus; } public void setBonus(Double bonus) { this.bonus = bonus; } }
/** * */ package com.geloin.jxls.beans; import java.util.List; /** * @author Geloin * */ public class Department { /** * 名称 */ private String name; /** * 职员 */ private List<Staff> staffs; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Staff> getStaffs() { return staffs; } public void setStaffs(List<Staff> staffs) { this.staffs = staffs; } }
/** * */ package com.geloin.jxls.main; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.jxls.transformer.XLSTransformer; import com.geloin.jxls.beans.Department; import com.geloin.jxls.beans.Staff; /** * @author Geloin * */ public class DepartmentTest { /** * @param args */ public static void main(String[] args) throws Exception { String tplPath = "d:/work/proTmp/jxls/部门信息表模板.xlsx"; String destPath = "d:/work/proTmp/jxls/部门信息表.xlsx"; Department dept1 = new Department(); dept1.setName("信息部"); List<Staff> staffs = new ArrayList<Staff>(); staffs.add(new Staff("张三", 5000D, 2000D)); staffs.add(new Staff("李四", 6000D, 3000D)); dept1.setStaffs(staffs); Department dept2 = new Department(); dept2.setName("信息部"); List<Staff> staffs2 = new ArrayList<Staff>(); staffs2.add(new Staff("王五", 7000D, 4000D)); staffs2.add(new Staff("何六", 8000D, 5000D)); dept2.setStaffs(staffs2); Map<String, Department> beanParams = new HashMap<String, Department>(); beanParams.put("dept", dept1); XLSTransformer former = new XLSTransformer(); former.transformXLS(tplPath, beanParams, destPath); } }
如上文中所描述,通过${dept.staffs.name},我们取到了dept对象中,每个员工的名称,显然,通过dept.staffs.proName,我们迭代了Department中的staffs对象。
模板中还有一个特殊的地方——$[sum(C2:E2)]//dept.staffs,我们已经知道,$[sum(c2:e2)]计算的是第2行C至E列的和,而//dept.staffs可以理解为per dept's staffs,也就是说,$[sum(C2:E2)]//dept.staffs表示的是“统计部门的每个staffs对象的从C到E列的和”。