Mercurial > gemma
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 }