changeset 5349:a352a695b69c extented-report

XLSX templater: Added column to coord conversions.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 21 Jun 2021 18:10:49 +0200
parents 45b03e8ca47e
children 59db9836e29a 6a94ab82eaaa
files pkg/xlsx/templater.go
diffstat 1 files changed, 67 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/xlsx/templater.go	Mon Jun 21 16:41:39 2021 +0200
+++ b/pkg/xlsx/templater.go	Mon Jun 21 18:10:49 2021 +0200
@@ -20,7 +20,9 @@
 	"errors"
 	"fmt"
 	"io"
+	"log"
 	"os"
+	"strconv"
 	"strings"
 
 	"github.com/360EntSecGroup-Skylar/excelize/v2"
@@ -472,11 +474,75 @@
 	return nil
 }
 
+func columnToNum(col interface{}) interface{} {
+	var name string
+	switch v := col.(type) {
+	case string:
+		name = v
+	default:
+		name = fmt.Sprintf("%v", col)
+	}
+	num, err := excelize.ColumnNameToNumber(name)
+	if err != nil {
+		log.Printf("error: invalid column name '%v'\n", col)
+		return 1
+	}
+	return num
+}
+
+func asInt(i interface{}) (int, error) {
+	switch v := i.(type) {
+	case int:
+		return v, nil
+	case int8:
+		return int(v), nil
+	case int16:
+		return int(v), nil
+	case int32:
+		return int(v), nil
+	case int64:
+		return int(v), nil
+	case float32:
+		return int(v), nil
+	case float64:
+		return int(v), nil
+	case string:
+		return strconv.Atoi(v)
+	default:
+		return 0, fmt.Errorf("invalid int '%v'", i)
+	}
+}
+
+func coord2cell(ix, iy interface{}) interface{} {
+	x, err := asInt(ix)
+	if err != nil {
+		log.Printf("error: invalid x value: %v\n", err)
+		return "A1"
+	}
+	y, err := asInt(iy)
+	if err != nil {
+		log.Printf("error: invalid y value: %v\n", err)
+		return "A1"
+	}
+
+	cell, err := excelize.CoordinatesToCellName(x, y)
+	if err != nil {
+		log.Printf("error: invalid cell coord (%d, %d)\n", x, y)
+		return "A1"
+	}
+	return cell
+}
+
+var templateLang = gval.Full(
+	gval.Function("column2num", columnToNum),
+	gval.Function("coord2cell", coord2cell),
+)
+
 func (e *executor) expr(x string) (gval.Evaluable, error) {
 	if f := e.expressions[x]; f != nil {
 		return f, nil
 	}
-	f, err := gval.Full().NewEvaluable(x)
+	f, err := templateLang.NewEvaluable(x)
 	if err != nil {
 		return nil, err
 	}