Skip to content

Commit 9cbe3b6

Browse files
taitakingkewenof
andauthored
This closes #1807, calculation engine support date and formula type cell (#1810)
Co-authored-by: zhualong <[email protected]>
1 parent bba155e commit 9cbe3b6

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

.github/workflows/go.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ jobs:
3232

3333
- name: Codecov
3434
uses: codecov/codecov-action@v4
35+
env:
36+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
3537
with:
3638
file: coverage.txt
3739
flags: unittests

calc.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1632,8 +1632,20 @@ func (f *File) cellResolver(ctx *calcContext, sheet, cell string) (formulaArg, e
16321632
return arg.ToNumber(), err
16331633
case CellTypeInlineString, CellTypeSharedString:
16341634
return arg, err
1635-
default:
1635+
case CellTypeFormula:
1636+
if value != "" {
1637+
return arg, err
1638+
}
16361639
return newEmptyFormulaArg(), err
1640+
case CellTypeDate:
1641+
if value, err = f.GetCellValue(sheet, cell); err == nil {
1642+
if num := newStringFormulaArg(value).ToNumber(); num.Type == ArgNumber {
1643+
return num, err
1644+
}
1645+
}
1646+
return arg, err
1647+
default:
1648+
return newErrorFormulaArg(value, value), err
16371649
}
16381650
}
16391651

calc_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6379,6 +6379,35 @@ func TestCalcCellResolver(t *testing.T) {
63796379
assert.NoError(t, err)
63806380
assert.Equal(t, expected, result)
63816381
}
6382+
// Test calculates formula that reference date and error type cells
6383+
assert.NoError(t, f.SetCellValue("Sheet1", "C1", "20200208T080910.123"))
6384+
assert.NoError(t, f.SetCellValue("Sheet1", "C2", "2020-07-10 15:00:00.000"))
6385+
assert.NoError(t, f.SetCellValue("Sheet1", "C3", formulaErrorDIV))
6386+
ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml")
6387+
assert.True(t, ok)
6388+
ws.(*xlsxWorksheet).SheetData.Row[0].C[2].T = "d"
6389+
ws.(*xlsxWorksheet).SheetData.Row[0].C[2].V = "20200208T080910.123"
6390+
ws.(*xlsxWorksheet).SheetData.Row[1].C[2].T = "d"
6391+
ws.(*xlsxWorksheet).SheetData.Row[1].C[2].V = "2020-07-10 15:00:00.000"
6392+
ws.(*xlsxWorksheet).SheetData.Row[2].C[2].T = "e"
6393+
ws.(*xlsxWorksheet).SheetData.Row[2].C[2].V = formulaErrorDIV
6394+
for _, tbl := range [][]string{
6395+
{"D1", "=SUM(C1,1)", "43870.3397004977"},
6396+
{"D2", "=LEN(C2)", "23"},
6397+
{"D3", "=IFERROR(C3,TRUE)", "TRUE"},
6398+
} {
6399+
assert.NoError(t, f.SetCellFormula("Sheet1", tbl[0], tbl[1]))
6400+
result, err := f.CalcCellValue("Sheet1", tbl[0])
6401+
assert.NoError(t, err)
6402+
assert.Equal(t, tbl[2], result)
6403+
}
6404+
// Test calculates formula that reference invalid cell
6405+
assert.NoError(t, f.SetCellValue("Sheet1", "E1", "E1"))
6406+
assert.NoError(t, f.SetCellFormula("Sheet1", "F1", "=LEN(E1)"))
6407+
f.SharedStrings = nil
6408+
f.Pkg.Store(defaultXMLPathSharedStrings, MacintoshCyrillicCharset)
6409+
_, err := f.CalcCellValue("Sheet1", "F1")
6410+
assert.EqualError(t, err, "XML syntax error on line 1: invalid UTF-8")
63826411
}
63836412

63846413
func TestEvalInfixExp(t *testing.T) {

0 commit comments

Comments
 (0)