下图是Excel的内容和要求:
单位独占一行;
部门根据内容向下进行合并;
办公室要根据岗位名称进行像有合并;
岗位根据其下的人员数量向右合并;
有缺岗的展示空白列即可。
每行展示22个人员信息(客户要求不做任何操作点击打印预览即可展示全部单元格数据 然后打印)
数据结构
代码详解
<!-- 这里判断数据是否为空 -->
<#if resultData??>
<!-- 不为空则开始循环 取单位名称 -->
<#list resultData as unit>
<!-- 这里的row是上面表格中单位名称的一行 -->
<Row ss:StyleID="s178" ss:Height="53">
<Cell ss:StyleID="s271"/>
<!-- ss:MergeAcross="1"这是向右合并一个 -->
<Cell ss:StyleID="s359" ss:MergeAcross="1">
<!-- 这里是单位名称的单元格 -->
<Data ss:Type="String">${unit.shortName}</Data>
</Cell>
<Cell ss:StyleID="s360" ss:MergeAcross="21"/>
</Row>
<!-- 这里判断部门信息是否为空 -->
<#if unit.children??>
<!-- 遍历部门数据 -->
<#list 0..(unit.children!?size-1) as i>
<Row ss:Height="44">
<!-- ${(unit.children[i].resultData?size *5)-1} 计算序号单元格向下合并几个单元格; -->
<!-- 部门对应的完整数据是 办公室名称-岗位名称(本身是向下合并一个单元格,计算时要按照2进行计算)-人名-其他信息 -->
<!-- 注意,序号和部门名称、办公室名称其实是在一行,那么计算向下合并的时候要把这一行减掉 -->
<Cell ss:StyleID="s363" ss:MergeDown="${(unit.children[i].resultData?size *5)-1}">
<Data ss:Type="String">${i+1}</Data>
</Cell>
<!-- 这里是部门名称和人员的数量等信息,向下合并同序号一列是相同的 -->
<Cell ss:StyleID="s370" ss:MergeAcross="1" ss:MergeDown="${(unit.children[i].resultData?size *5)-1}">
<Data ss:Type="String">${unit.children[i].deptName}(${unit.children[i].actual}/${unit.children[i].amount})</Data>
</Cell>
<!-- 这里开始循环填充办公室名称,这里只能渲染每个办部门中第一行的办公室信息,因为这个单元格和前面的部门序号都在同一行ROW 这个标签内,如果不取第0条填充,则将全部办公室信息渲染在一行内 -->
<#list 0..(unit.children[i].resultData!?size-1) as b>
<#if b == 0>
<!-- 这里判断是为了让下标不是0的不进行数据填充 -->
<#list unit.children[i].resultData[0] as officeInfo>
<!-- ss:MergeAcross="${officeInfo.userSize-1} 这里向右合并的单元格数需要进行计算,就是这个办公室下面的人员数量 以为人员数据只占用一个单元格-->
<Cell ss:StyleID="s361" ss:MergeAcross="${officeInfo.userSize-1}">
<Data ss:Type="String">${officeInfo.officeName}</Data>
</Cell>
<#else >
<Cell ss:StyleID="s361" ss:MergeAcross="21">
<Data ss:Type="String"></Data>
</Cell>
</#list>
</#if>
</#list>
</Row>
<!-- 这里开始渲染第二行 岗位数据 -->
<#list 0..(unit.children[i].resultData?size-1) as j>
<#if j!=0>
<!-- 这里是第一行办公室信息长度到达22的时候进行换行 渲染第二个完整信息的办公室信息一行-->
<Row ss:Height="27">
<#list unit.children[i].resultData[j] as officeInfo>
<!-- 这里需要进行下标计算,我的表格中办公室起始位置是 D 列,下标是4 要根据人数进行计算下一个办公室的起始位置 不计算 则会把先填充的数据覆盖掉-->
<Cell ss:Index="${officeInfo.cellIndex}" ss:StyleID="s361" ss:MergeAcross="${officeInfo.userSize-1}">
<Data ss:Type="String">${officeInfo.officeName}</Data>
</Cell>
</#list>
</Row>
</#if>
<!-- 这个row是 岗位信息一行的-->
<Row ss:Height="27">
<#list unit.children[i].resultData[j] as officeInfo>
<#list officeInfo.basicVoList as postInfo>
<!-- 同样也需要计算起始位置 和 合并单元格的数量(其下人员数量减1即可)-->
<Cell ss:Index="${postInfo.postIndex}" ss:StyleID="s368" ss:MergeAcross="${postInfo.cellNum}" ss:MergeDown="1">
<Data ss:Type="String">${postInfo.postName}</Data>
</Cell>
</#list>
</#list>
</Row>
<Row/>
<!-- 这里是人员的信息 表格起始位置还是需要进行计算-->
<Row ss:Height="44">
<#list unit.children[i].resultData[j] as officeInfo>
<#list officeInfo.basicVoList as postInfo>
<#list postInfo.empBasicVoList as emp>
<Cell ss:Index="${emp.cellIndex}" ss:StyleID="s278">
<#if emp.name??>
<Data ss:Type="String">${emp.name}</Data>
<#else >
<Data ss:Type="String"></Data>
</#if>
</Cell>
</#list>
</#list>
</#list>
</Row>
<!-- 这里是其他信息的填充 -->
<Row ss:Height="44">
<#list unit.children[i].resultData[j] as officeInfo>
<#list officeInfo.basicVoList as postInfo>
<#list postInfo.empBasicVoList as emp>
<Cell ss:Index="${emp.cellIndex}" ss:StyleID="s282">
<#if emp.label??>
<!--这里是用到了模板语法中的 ?index_of("xx") 用于判断是否包含字符串xx 该方法会返回一个整数,表示子字符串在父字符串中首次出现的位置(如果未找到,则返回 -1) -->
<#if emp.label?index_of("XX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}起${(emp.employTime!"")?string("yyyy-MM-dd")}</Data>
<#elseif emp.label?index_of("XXX") != -1 || emp.label?index_of("XXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${(emp.retireDate!"")?string("yyyy-MM-dd")}</Data>
<#elseif emp.label?index_of("XXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${(emp.retireDate!"")?string("yyyy-MM-dd")}</Data>
<#elseif emp.label?index_of("XXXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}起${emp.clerkDate!""}</Data>
<#elseif emp.label?index_of("XXXXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${emp.endDate!""}</Data>
<#elseif emp.label?index_of("XXXXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${emp.endDate!""}</Data>
<#elseif emp.label?index_of("XXXXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${emp.endDate!""}</Data>
<#elseif emp.label?index_of("XXXXXXXX") != -1>
<Data ss:Type="String">${emp.age?default("")};${emp.label}至${emp.endDate!""}</Data>
</#if>
<#else >
<Data ss:Type="String"></Data>
</#if>
</Cell>
</#list>
</#list>
</#list>
</Row>
</#list>
</#list>
</#if>
</#list>
</#if>