freemarker模板复杂Excel内容填充部分解读

下图是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>

这是freemarker常见语法链接地址
这是之前多sheet页导出的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值