对于Freemaker的list嵌套list失败的解决方案

在做导出excel,word等操作时,使用的是freemaker模板引擎。

但是最近遇到一个问题。对json数据做xml的映射时,出现了遍历list之后还要在内部再遍历一遍list的情景。

例如:

json:

{
    "outter": [{
            "q": "q1",
            "w": "w1",
            "e": "e1",
            "inner": [{"a":"a1","b":"b1","c":"c1"}, {}, {}]
        },

        {},

        {}
    ]

}

<#list  outter  as item>

     <#assign  inner = ${item.data}/>

     <#list  inner as  inneritem>

            ${inneritem.a}    //  a是内部的一个字段名。

     </#list>

</#list>

好。看到这篇文章的人肯定这么尝试过了。结果是不行。不会遍历出结果。

那么我们换一种思路。如上的json可以看做是List<Map<String,Object>>

List就是我们的outter,Map就是我们outter  jsonArray中的一个{},而inner就是map的一个字段名。inner所代表的list就是泛型object

此时我们需要在遍历outter时将outter的每个元素转成map,然后用  map[key]来取到value值,再进行遍历。就会得到答案。亲测有效。

代码大致如下:

<#list  outter  as  xmap>

      <#assign  realkeys = xmap?keys/>   //这个是将xmap的key暴露出来

     <#list  realkeys  as key>

      <#if  key=="inner">    //锁定需要嵌套遍历的key

      <#list  xmap[key]   as   res>

           ${res.a}   //此时输出的就是二次遍历的值了。

      </#list>

      </#if>

     </#list>

</#list>

 

好了。如上已经完全可以解决list里面的变量还有list的情况了。  换了一种思路而已。

还有个小细节(坑)。如果转Excel,写了formula 会覆盖掉传进来的值。

坑2:xml可能在之前会写死样式和table的长度。

ss:ExpandedColumnCount  和   ss:ExpandedRowCount  这两个属性是table的限制。不设大的话,数据一多就gg了

<Table ss:ExpandedColumnCount="9999" ss:ExpandedRowCount="9999" x:FullColumns="1"

x:FullRows="1" ss:DefaultColumnWidth="53" ss:DefaultRowHeight="15">    

还有这个<Column ss:Index="5" ss:Width="66" ss:Span="1"/>   index 是限制位置用的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值