Skip to content

Commit 3650e5c

Browse files
Avoid looking up absent cells in rangeResolver (qax-os#2111)
1 parent 91d36cc commit 3650e5c

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

calc.go

+22-7
Original file line numberDiff line numberDiff line change
@@ -1690,16 +1690,31 @@ func (f *File) rangeResolver(ctx *calcContext, cellRefs, cellRanges *list.List)
16901690
// extract value from ranges
16911691
if cellRanges.Len() > 0 {
16921692
arg.Type = ArgMatrix
1693+
1694+
var ws *xlsxWorksheet
1695+
ws, err = f.workSheetReader(sheet)
1696+
if err != nil {
1697+
return
1698+
}
1699+
16931700
for row := valueRange[0]; row <= valueRange[1]; row++ {
1701+
colMax := 0
1702+
if row <= len(ws.SheetData.Row) {
1703+
rowData := &ws.SheetData.Row[row-1]
1704+
colMax = min(valueRange[3], len(rowData.C))
1705+
}
1706+
16941707
var matrixRow []formulaArg
16951708
for col := valueRange[2]; col <= valueRange[3]; col++ {
1696-
var cell string
1697-
var value formulaArg
1698-
if cell, err = CoordinatesToCellName(col, row); err != nil {
1699-
return
1700-
}
1701-
if value, err = f.cellResolver(ctx, sheet, cell); err != nil {
1702-
return
1709+
value := newEmptyFormulaArg()
1710+
if col <= colMax {
1711+
var cell string
1712+
if cell, err = CoordinatesToCellName(col, row); err != nil {
1713+
return
1714+
}
1715+
if value, err = f.cellResolver(ctx, sheet, cell); err != nil {
1716+
return
1717+
}
17031718
}
17041719
matrixRow = append(matrixRow, value)
17051720
}

calc_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -6303,6 +6303,43 @@ func TestCalcBetainvProbIterator(t *testing.T) {
63036303
assert.Equal(t, 1.0, betainvProbIterator(1, 1, 1, 1, 1, 1, 1, 1, 1))
63046304
}
63056305

6306+
func TestCalcRangeResolver(t *testing.T) {
6307+
f := NewFile()
6308+
assert.NoError(t, f.SetCellFormula("Sheet1", "A1", "=SUM(Sheet1!B:B)"))
6309+
cellRefs := list.New()
6310+
cellRanges := list.New()
6311+
// Test extract value from ranges on invalid ranges
6312+
cellRanges.PushBack(cellRange{
6313+
From: cellRef{Col: 1, Row: 1, Sheet: "SheetN"},
6314+
To: cellRef{Col: 1, Row: TotalRows, Sheet: "SheetN"},
6315+
})
6316+
_, err := f.rangeResolver(&calcContext{}, cellRefs, cellRanges)
6317+
assert.EqualError(t, err, "sheet SheetN does not exist")
6318+
6319+
ws, err := f.workSheetReader("Sheet1")
6320+
ws.SheetData.Row = make([]xlsxRow, TotalRows+1)
6321+
ws.SheetData.Row[TotalRows].C = make([]xlsxC, 3)
6322+
assert.NoError(t, err)
6323+
cellRanges.Init()
6324+
cellRanges.PushBack(cellRange{
6325+
From: cellRef{Col: 3, Row: TotalRows, Sheet: "Sheet1"},
6326+
To: cellRef{Col: 3, Row: TotalRows + 1, Sheet: "Sheet1"},
6327+
})
6328+
_, err = f.rangeResolver(&calcContext{}, cellRefs, cellRanges)
6329+
assert.Equal(t, ErrMaxRows, err)
6330+
6331+
// Test extract value from references with invalid references
6332+
cellRanges.Init()
6333+
cellRefs.PushBack(cellRef{Col: 1, Row: 1, Sheet: "SheetN"})
6334+
_, err = f.rangeResolver(&calcContext{}, cellRefs, cellRanges)
6335+
assert.EqualError(t, err, "sheet SheetN does not exist")
6336+
6337+
cellRefs.Init()
6338+
cellRefs.PushBack(cellRef{Col: 1, Row: TotalRows + 1, Sheet: "SheetN"})
6339+
_, err = f.rangeResolver(&calcContext{}, cellRefs, cellRanges)
6340+
assert.Equal(t, ErrMaxRows, err)
6341+
}
6342+
63066343
func TestNestedFunctionsWithOperators(t *testing.T) {
63076344
f := NewFile()
63086345
formulaList := map[string]string{

0 commit comments

Comments
 (0)