在做导出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 是限制位置用的