Freemarker:用列表中的列表创建 table
Freemarker: creating a table with a list in a list
我目前有以下结构:
List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>();
//fill clusters and the list in clusters
input.put("clusters", clusters);
clusters 描述了我的集群,cluster.get(i) 包含一个集群中的所有元素。对于一份报告,我想用 freemarker 将这个结果输出到一个 .md 文件中目标是拥有与集群一样多的列,并且在每一行中都有一个对应集群的条目。
我面临的问题是,我必须从外部列表开始,这意味着集群:
|<#list clusters as c> Cluster ${c_index} | </#list>
|<#list clusters as c>-----|</#list>
这是我使页眉在一行中的解决方案。如果我这样做:
|<#list clusters as c> Cluster ${c_index} |
</#list>
我的输出将是每个集群的单独行 ${c_index}
现在每个集群名称都有一列,但是如何填写相应行中的条目?我需要每个不同集群的条目在其相应的单独列中,但我不知道如何使用 freemarker 实现这一点,如下代码:
<#list clusters as c>
<#list c as entry>| ${entry.id} |</#list>
</#list>
将导致一个簇的条目在一行中,下一个簇在下一行中。我想要这个但是有列
如果我理解得很好,那么给出这个输入(使用 http://freemarker-online.kenshoo.com/ 语法):
clusters=[["a1", "b1", "c1"], ["a2"], ["a3", "b3"], ["a4", "b4", "c4"]]
maxEntities=3
你想要这个输出(我用填充使它更好一些......如果你需要它,使用 ?right_pad(n)
):
| Cluster 1 | Cluster 2 | Cluster 3 | Cluster 4 |
|--- |--- |--- |--- |
| a1 | a2 | a3 | a4 |
| b1 | | b3 | b4 |
| c1 | | | c4 |
嗯,它不会很漂亮,因为你想在模板中旋转 table。但是,想法是外循环遍历实体索引,内循环遍历集群。 (顶部还有两行异常,显示集群名称和 header 分隔线。)
|<#list clusters as c> Cluster ${c?counter} <#sep>|</#list>|
|<#list clusters as c>--- <#sep>|</#list>|
<#list 0 ..< maxEntities as entityIndex>
|<#list clusters as c> ${c[entityIndex]!} <#sep>|</#list>|
</#list>
顺便说一句,maxEntities
可以在模板中计算出来,如果这样更好:
<#function maxListItemSize items>
<#local max = 0>
<#list items as item>
<#local size = item?size>
<#if max < size>
<#local max = size>
</#if>
</#list>
<#return max>
</#function>
然后你有 <#list 0 ..< maxListItemSize(clusters) as entityIndex>
.
我目前有以下结构:
List<List<ClusterEntry>> clusters = new ArrayList<List<ClusterEntry>>();
//fill clusters and the list in clusters
input.put("clusters", clusters);
clusters 描述了我的集群,cluster.get(i) 包含一个集群中的所有元素。对于一份报告,我想用 freemarker 将这个结果输出到一个 .md 文件中目标是拥有与集群一样多的列,并且在每一行中都有一个对应集群的条目。 我面临的问题是,我必须从外部列表开始,这意味着集群:
|<#list clusters as c> Cluster ${c_index} | </#list>
|<#list clusters as c>-----|</#list>
这是我使页眉在一行中的解决方案。如果我这样做:
|<#list clusters as c> Cluster ${c_index} |
</#list>
我的输出将是每个集群的单独行 ${c_index}
现在每个集群名称都有一列,但是如何填写相应行中的条目?我需要每个不同集群的条目在其相应的单独列中,但我不知道如何使用 freemarker 实现这一点,如下代码:
<#list clusters as c>
<#list c as entry>| ${entry.id} |</#list>
</#list>
将导致一个簇的条目在一行中,下一个簇在下一行中。我想要这个但是有列
如果我理解得很好,那么给出这个输入(使用 http://freemarker-online.kenshoo.com/ 语法):
clusters=[["a1", "b1", "c1"], ["a2"], ["a3", "b3"], ["a4", "b4", "c4"]]
maxEntities=3
你想要这个输出(我用填充使它更好一些......如果你需要它,使用 ?right_pad(n)
):
| Cluster 1 | Cluster 2 | Cluster 3 | Cluster 4 |
|--- |--- |--- |--- |
| a1 | a2 | a3 | a4 |
| b1 | | b3 | b4 |
| c1 | | | c4 |
嗯,它不会很漂亮,因为你想在模板中旋转 table。但是,想法是外循环遍历实体索引,内循环遍历集群。 (顶部还有两行异常,显示集群名称和 header 分隔线。)
|<#list clusters as c> Cluster ${c?counter} <#sep>|</#list>|
|<#list clusters as c>--- <#sep>|</#list>|
<#list 0 ..< maxEntities as entityIndex>
|<#list clusters as c> ${c[entityIndex]!} <#sep>|</#list>|
</#list>
顺便说一句,maxEntities
可以在模板中计算出来,如果这样更好:
<#function maxListItemSize items>
<#local max = 0>
<#list items as item>
<#local size = item?size>
<#if max < size>
<#local max = size>
</#if>
</#list>
<#return max>
</#function>
然后你有 <#list 0 ..< maxListItemSize(clusters) as entityIndex>
.