如何使用Jxls导出多sheet灵活表头的Excel文件

5,800 阅读2分钟

1.需求:

导出的Excel有多个sheet,且每个sheet中表格的格式都不尽相同

2.实现思路

1.将所有sheet的模板都写在第一个索引页上;

2.使用Jxls的jx:if批注,通过判断每个sheet对象中的某个变量决定加载哪片区域的脚本;

3.实践

A1处的命令如下:

jx:area(lastCell="R45")
jx:each(items="sheetList", var="sheet", lastCell="R45" multisheet="sheetNames")
jx:if(condition="sheet.sheetNum==1" lastCell="R17" areas=["A1:R17"])
jx:if(condition="sheet.sheetNum==2" lastCell="R29" areas=["A18:R29"])
jx:if(condition="sheet.sheetNum==3" lastCell="R41" areas=["A30:R41"])
jx:if(condition="sheet.sheetNum==4" lastCell="R45" areas=["A42:R45"])

命令解释:

1.jx:area确定jxls命令的最大作用范围为[A1:R45]区间;

2.jx:each遍历sheet集合中的单个sheet对象,该对象存储了一个sheet中的所有元素;

3.sheet.sheetNum即为 "实现思路" 中的 "某个变量" 其值的真实意义就是该区间的命令在Excel中的第几个sheet中执行加载,这里笔者一共规定了四个sheet模板命令的范围

A4、A9、A21等行遍历命令如下:

jx:each(items="sheet.context.disburseDetailsByHospitalLevel" var="record" lastCell="Z4")

jx:each(items="sheet.context.mechanismDisburseRankByHospitalLevel" var="record" lastCell="G9")

jx:each(items="sheet.context.mechanismDisburseGrowthRankByHospitalLevel" var="record" lastCell="G14")

仅需简单地使用jx:each遍历想要展示的对象即可;

4.结论:

仅须在A1单元格的批注中使用jx:if命令对sheet对象进行判断,划定加载各区域的边界即可;

5.注意事项:

1.jx:if中的lastCell和areas需要稍微留意下,如果设置不当可能会导致第二或更后面的sheet渲染完毕后 产生空行;

例如:

把
jx:if(condition="sheet.sheetNum==1" lastCell="R17" areas=["A1:R17"])
写成了
jx:if(condition="sheet.sheetNum==1" lastCell="R16" areas=["A1:R16"])
那么第二个sheet的第一行就会为空行,表格的渲染会从第二行开始
同理,如果写成了
jx:if(condition="sheet.sheetNum==1" lastCell="R15" areas=["A1:R15"])
那么就会空两行