Spreadsheet: Wie kann ich die Werte von Spalten addieren, mit Komma als Dezimaltrenner?

Sie können mehrere Spaltenwerte mit Freemarker addieren, subtrahieren, multiplizieren usw. Um Freemarker Syntax zu verwenden, nutzen Sie bitte das "Wert " Feld in einer beliebigen Spalte. Klicken Sie auf das um aus allen vorhandenen Spalten ein oder mehrere Spalten dem „Wert“ Feld hinzuzufügen. Fügen Sie nun einen beliebigen Rechenoperator zwischen die beiden Ausdrücke (z.B. ein +). Das Resultat sieht in etwa so aus:

Freemarker-Code

${SPALTENNAME_A?number + SPALTENNAME_B?number}

Dezimaltrenner

Wichtig ist, Rechenoperationen funktionieren nur mit einem Punkt als Dezimaltrenner (z.B. 19.99). Falls dies bei Ihnen schon der Fall ist, lesen Sie weiter.

Fallstrick

Es ist wichtig, dass bei Rechenoperationen die Formel innerhalb der geschweiften Klammern steht. Ansonsten würden einfach nur beide Werte ausgegeben werden.

Richtig:

${SPALTENNAME_A?number + SPALTENNAME_B?number}

Falsch:

${SPALTENNAME_A?number} + ${SPALTENNAME_B?number}

Komma durch Punkt ersetzen

Dies erreichen Sie mit der Freemarker Funktion ?replace(). Zwischen die Klammern kommt zum einen das Zeichen welches ersetzt werden soll (in diesem Fall „,“) gefolgt von einem Komma und danach den Wert der dafür eingesetzt werden soll (in diesem Fall ein Punkt „.“). In diesem Fall würde sich folgendes Resultat ergeben:

${SPALTENNAME_A?replace(",",".")?number + SPALTENNAME_B?replace(",",".")?number}

Beliebig viele Spalten addieren, aber einige Spalten können leer sein

Ein weiteres - leicht komplexeres - Beispiel ist, dass man beliebig viele Werte addieren möchte, aber auch wenn nicht alle Werte gefüllt sind.

Dazu zeigen wir hier zwei Beispiele. Das erste Beispiel ist etwas einfacher, dafür länger. Das zweite Beispiel zeigt einen sehr generischen kürzeren Ansatz:

Beispiel 1

Es sollen die Spalten A, B, C addiert werden, aber nicht immer ist jede Spalte gefüllt. D.h. damit man keinen Fehler bekommt, muss man eine Prüfung auf einen leeren Wert einbauen.

<#assign ergebnis = 0 />
<#if spalteA! != ""><#assign ergebnis += spalteA!?number /></#if>
<#if spalteB! != ""><#assign ergebnis += spalteB!?number /></#if>
<#if spalteC! != ""><#assign ergebnis += spalteC!?number /></#if>
${ergebnis!}

Hier wird mit <#assign eine Variable ergebnis mit 0 initialisiert und immer wenn einer der Spaltenwerte nicht leer ist, wird der jeweilige Spaltenwert auf ergebnis hinzu addiert.

Beispiel 2

Etwas kürzer und generischer geht es, wenn man die Spalten-Filter Template-Funktion (erreichbar über das Schraubenschlüsselsymbol / Template Funktionen) benutzt:

<#assign ergebnis = 0 />
<#list row.getCols().filter("spalteA,spalteB,spalteC","INCLUDE_NOT_EMPTY") as col>
   <#assign ergebnis += col!?number />
</#list>
${ergebnis!}

Der interessante Teil des Scripts ist:
row.getCols().filter("spalteA,spalteB,spalteC","INCLUDE_NOT_EMPTY")

Damit holt man sich aus der aktuellen Zeile (row), alle Spalten (getCols()) und holt sich dann die entsprechenden Spalten anhand des Namens heraus (filter(„spalteA,spalteB,spalteC“…). Durch INCLUDE_NOT_EMPTY sagt man, dass man nur nicht-leere Werte haben möchte.
Mit der <#list> Anweisung iteriert man dann durch alle Spalten (col) und addiert mit <#assign ergebnis += col!?number /> wieder den jeweiligen Spaltenwert auf die zuvor mit 0 initialisierte ergebnis Variable hinzu.

Wildcards für Spaltennamen

Die filter() - Funktion unterstützt auch sog. Wildcards d.h. man kann durch Verwendung des * Zeichens (Stern) mehrere Spalten selektieren.

row.getCols().filter("price*, spalteB, *image*","INCLUDE_NOT_EMPTY")

D.h. der Filterausdruck „price, spalteB, image*“* selektiert

  • alle Spalten die mit „price“ beginnen
  • die „spalteB
  • und alle Spalten, die das Wort „image“ enthalten

Das ist sehr praktisch, da man auf diese Weise mit wenig Tipparbeit die entsprechenden Spalten selektieren kann, um z.B. diese zu addieren oder anderweitig zu verarbeiten.

Hinweis: Zeilenumbrüche entfernen

Es empfiehlt sich in den Spalten, auf die Sie obige Funktionen anwenden, noch zusätzlich die Zeilenumbrüche mit der Textfunktion zu entfernen. Das ist notwendig, da Freemarker automatisch die Zeilenumbrüche erhält, die Sie eingeben. Das kann dann aber unter Umständen zu Folgefehlern führen, wenn Sie mit dem Wert weiterarbeiten, aber die Zeilenumbrüche im Folgeschritt zu Problemen / Fehlern führen.

Zeichenkette in eine Zahl umwandeln

Freemarker behandelt jeden Spaltenwert als eine Zeichenkette. Um eine Rechenoperation durchzuführen bedarf es jedoch selbstverständlich Zahlen. Um die Zeichenkette in eine Zahl umzuwandeln wird die Freemarker Funktion ?number benötigt. Diese Funktion hängen sie einfach am Ende ihrer Variablen an und schon erkennt Freemarker die Werte als Zahlen.

Das finale Resultat für eine Addition von zwei Spalten sieht demnach wie folgt aus (falls keine Kommas ersetzt werden mussten,können die replace(…)" Anweisungen ignoriert werden):

${SPALTENNAME_A?replace(",",".")?number} + ${SPALTENNAME_B?replace(",",".")?number}