JSON (aus HTMLTextWriter) Einträge limitieren

Hi zusammen,

ich baue mir in einem TextHTMLWriter ein JSON aus einem Spreadsheet:

[
<#list spreadsheet@SpreadsheetMapper_13.getRows() as row>
    ${toJSON(
        newMap({
            "ItemID": row.val("ItemID"),
            "VAT": row.val("VAT"),
            "Price": row.val("Price"),
            "Name": row.val("ItemTextsName3"),
            "Image": row.val("Image")
        }
    ),{'removeEmpty': true, 'pretty': true})}<#sep>,</#sep>
</#list>
]

Und kippe das in einen StringToFile um die Datei dann irgendwo hoch zu laden.

Nun würde ich gerne die Einträge in der JSON auf 10 beschränken. Das Spreadsheet aus dem ich mich speise, hat mehrere zehntausend Einträge.

Ich kann nun wohl eine Zählvariable drum basteln:

klick
[
<#assign i = 0 />
<#list spreadsheet@SpreadsheetMapper_13.getRows() as row>
    <#if (i < 10)>
    ${toJSON(
        newMap({
            "ItemID": row.val("ItemID"),
            "VAT": row.val("VAT"),
            "Price": row.val("Price"),
            "Name": row.val("ItemTextsName3"),
            "Image": row.val("Image")
        }
    ),{'removeEmpty': true, 'pretty': true})}<#sep>,</#sep>
    <#assign i = i + 1/>
    </#if>
</#list>
]

…aber so wirklich performant ist das ja wahrscheinlich nicht, es durchläuft ja trotzdem noch alle Zeilen, schreibt sie dann halt nur nicht ins JSON.

Übersehe ich einen besseren Weg? Im Prinzip möchte ich erreichen, dass das Input-Spreadsheet schon nur zehn Zeilen hat. Der Rest geht ja dann von allein.

Irgend ne Idee, oder ist das schon best-practice so wie ich das mache?

Danke, Daniel

Hallo Daniel,

am einfachsten sollte das mit .getRows(10) funktionieren. Dann werden max. 10 Zeilen aus dem Spreadsheet verwendet:

<#list spreadsheet@SpreadsheetMapper_13.getRows(10) as row>


Alternativ könntest du auch den Ansatz mit der Zählvariable verwenden und `i >= 10` ein `<#break>` hinzufügen. Siehe https://freemarker.apache.org/docs/ref_directive_list.html#ref_list_break

Zusätzlich gibt es auch noch ein ?index Freemarker built-in für die Schleifenvariable. Die Funktion könntest du auch als Alternative für deine Zählvariable (i) verwenden, z.B.

<#if (row?index >= 10)>
<#break>
</#if>

VG Torsten

1 Like

Yeah, super, danke!

Das hatte ich gesucht :ok_hand: