-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cellref.go
59 lines (51 loc) · 1.67 KB
/
cellref.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package formula
import (
"go.devnw.com/ooxml/spreadsheet/reference"
"go.devnw.com/ooxml/spreadsheet/update"
)
// CellRef is a reference to a single cell
type CellRef struct {
s string
}
// NewCellRef constructs a new cell reference.
func NewCellRef(v string) Expression {
return CellRef{v}
}
// Eval evaluates and returns the result of the cell reference.
func (c CellRef) Eval(ctx Context, ev Evaluator) Result {
return ctx.Cell(c.s, ev)
}
// Reference returns a string reference value to a cell.
func (c CellRef) Reference(ctx Context, ev Evaluator) Reference {
return Reference{Type: ReferenceTypeCell, Value: c.s}
}
// String returns a string representation of CellRef.
func (c CellRef) String() string {
return c.s
}
// Update makes a reference to point to one of the neighboring cells after removing a row/column with respect to the update type.
func (c CellRef) Update(q *update.UpdateQuery) Expression {
if q.UpdateCurrentSheet {
c.s = updateRefStr(c.s, q)
}
return c
}
// updateRefStr gets reference string representation like C1, parses it and makes a string representation of a new reference with respect to the update type (e.g. B1 if a column to the left of this reference was removed).
func updateRefStr(refStr string, q *update.UpdateQuery) string {
ref, err := reference.ParseCellReference(refStr)
if err != nil {
return "#REF!"
}
if q.UpdateType == update.UpdateActionRemoveColumn {
columnIdxToRemove := q.ColumnIdx
columnIdx := ref.ColumnIdx
if columnIdx < columnIdxToRemove {
return refStr
} else if columnIdx == columnIdxToRemove {
return "#REF!"
} else {
return ref.Update(update.UpdateActionRemoveColumn).String()
}
}
return refStr
}