forked from p30928647/excelize
This closes #994, fix LOOKUP function for Array form
This commit is contained in:
parent
a55f354eb3
commit
dca03c6230
18
calc.go
18
calc.go
|
@ -7263,7 +7263,11 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
|
|||
if lookupVector.Type != ArgMatrix && lookupVector.Type != ArgList {
|
||||
return newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires second argument of table array")
|
||||
}
|
||||
cols, matchIdx := lookupCol(lookupVector), -1
|
||||
arrayForm := lookupVector.Type == ArgMatrix
|
||||
if arrayForm && len(lookupVector.Matrix) == 0 {
|
||||
return newErrorFormulaArg(formulaErrorVALUE, "LOOKUP requires not empty range as second argument")
|
||||
}
|
||||
cols, matchIdx := lookupCol(lookupVector, 0), -1
|
||||
for idx, col := range cols {
|
||||
lhs := lookupValue
|
||||
switch col.Type {
|
||||
|
@ -7280,9 +7284,13 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
|
|||
break
|
||||
}
|
||||
}
|
||||
column := cols
|
||||
var column []formulaArg
|
||||
if argsList.Len() == 3 {
|
||||
column = lookupCol(argsList.Back().Value.(formulaArg))
|
||||
column = lookupCol(argsList.Back().Value.(formulaArg), 0)
|
||||
} else if arrayForm && len(lookupVector.Matrix[0]) > 1 {
|
||||
column = lookupCol(lookupVector, 1)
|
||||
} else {
|
||||
column = cols
|
||||
}
|
||||
if matchIdx < 0 || matchIdx >= len(column) {
|
||||
return newErrorFormulaArg(formulaErrorNA, "LOOKUP no result found")
|
||||
|
@ -7291,13 +7299,13 @@ func (fn *formulaFuncs) LOOKUP(argsList *list.List) formulaArg {
|
|||
}
|
||||
|
||||
// lookupCol extract columns for LOOKUP.
|
||||
func lookupCol(arr formulaArg) []formulaArg {
|
||||
func lookupCol(arr formulaArg, idx int) []formulaArg {
|
||||
col := arr.List
|
||||
if arr.Type == ArgMatrix {
|
||||
col = nil
|
||||
for _, r := range arr.Matrix {
|
||||
if len(r) > 0 {
|
||||
col = append(col, r[0])
|
||||
col = append(col, r[idx])
|
||||
continue
|
||||
}
|
||||
col = append(col, newEmptyFormulaArg())
|
||||
|
|
|
@ -1131,6 +1131,9 @@ func TestCalcCellValue(t *testing.T) {
|
|||
// LOOKUP
|
||||
"=LOOKUP(F8,F8:F9,F8:F9)": "32080",
|
||||
"=LOOKUP(F8,F8:F9,D8:D9)": "Feb",
|
||||
"=LOOKUP(E3,E2:E5,F2:F5)": "22100",
|
||||
"=LOOKUP(E3,E2:F5)": "22100",
|
||||
"=LOOKUP(1,MUNIT(1))": "1",
|
||||
"=LOOKUP(1,MUNIT(1),MUNIT(1))": "1",
|
||||
// ROW
|
||||
"=ROW()": "1",
|
||||
|
@ -2090,6 +2093,7 @@ func TestCalcCellValue(t *testing.T) {
|
|||
"=LOOKUP()": "LOOKUP requires at least 2 arguments",
|
||||
"=LOOKUP(D2,D1,D2)": "LOOKUP requires second argument of table array",
|
||||
"=LOOKUP(D2,D1,D2,FALSE)": "LOOKUP requires at most 3 arguments",
|
||||
"=LOOKUP(1,MUNIT(0))": "LOOKUP requires not empty range as second argument",
|
||||
"=LOOKUP(D1,MUNIT(1),MUNIT(1))": "LOOKUP no result found",
|
||||
// ROW
|
||||
"=ROW(1,2)": "ROW requires at most 1 argument",
|
||||
|
|
Loading…
Reference in New Issue