【问题标题】:Freemarker: creating a table with a list in a listFreemarker:使用列表中的列表创建表
【发布时间】:2017-03-13 07:18:08
【问题描述】:

我目前有以下结构:

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> 

将导致一个集群的条目在一行中,而下一个集群在下一行。我想要这个,但有列

【问题讨论】:

    标签: java markdown freemarker


    【解决方案1】:

    如果我理解得很好,那么给定这个输入(使用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        |
    

    嗯,它不会很漂亮,因为您想在模板中旋转表格。但是,想法是外部循环通过实体索引,内部循环通过集群。 (顶部还有两个异常行,显示集群名称和标题分隔线。)

    |<#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>
    

    然后你有&lt;#list 0 ..&lt; maxListItemSize(clusters) as entityIndex&gt;

    【讨论】:

    • 再次感谢您的帮助。格式现在与我试图实现的完全一样。但是,此输出具有 java 对象 ID。我想访问例如:c[entityIndex].id!在您的解决方案的第 4 行。可悲的是,我收到了:FreeMarker 模板错误:以下已评估为 null 或缺失:==> c[entityIndex] [在第 4 行第 26 列的模板“template.ftl”中]
    • 在这种情况下你可以写(c[entityIndex].id)!。有点奇怪的语法,但是……它就是这样工作的。
    • 嗯,这花了两秒钟,解决了我之前一小时的努力。非常感谢您的大力帮助!
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多