From 40ed1d1b81b4d30165bb73e9406e59ddbdb76fe2 Mon Sep 17 00:00:00 2001 From: xuri Date: Sat, 16 Jul 2022 12:50:13 +0800 Subject: Fix potential file corrupted when changing cell value or the col/row - Remove shared formula subsequent cell when setting the cell values - Support adjust table range when removing and inserting column/row --- cell.go | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'cell.go') diff --git a/cell.go b/cell.go index 286085b..97425c5 100644 --- a/cell.go +++ b/cell.go @@ -169,6 +169,21 @@ func (c *xlsxC) hasValue() bool { return c.S != 0 || c.V != "" || c.F != nil || c.T != "" } +// removeFormula delete formula for the cell. +func (c *xlsxC) removeFormula(ws *xlsxWorksheet) { + if c.F != nil && c.F.T == STCellFormulaTypeShared && c.F.Ref != "" { + si := c.F.Si + for r, row := range ws.SheetData.Row { + for col, cell := range row.C { + if cell.F != nil && cell.F.Si != nil && *cell.F.Si == *si { + ws.SheetData.Row[r].C[col].F = nil + } + } + } + } + c.F = nil +} + // setCellIntFunc is a wrapper of SetCellInt. func (f *File) setCellIntFunc(sheet, axis string, value interface{}) error { var err error @@ -266,7 +281,8 @@ func (f *File) SetCellInt(sheet, axis string, value int) error { defer ws.Unlock() cellData.S = f.prepareCellStyle(ws, col, row, cellData.S) cellData.T, cellData.V = setCellInt(value) - cellData.F, cellData.IS = nil, nil + cellData.removeFormula(ws) + cellData.IS = nil return err } @@ -292,7 +308,8 @@ func (f *File) SetCellBool(sheet, axis string, value bool) error { defer ws.Unlock() cellData.S = f.prepareCellStyle(ws, col, row, cellData.S) cellData.T, cellData.V = setCellBool(value) - cellData.F, cellData.IS = nil, nil + cellData.removeFormula(ws) + cellData.IS = nil return err } @@ -330,7 +347,8 @@ func (f *File) SetCellFloat(sheet, axis string, value float64, precision, bitSiz defer ws.Unlock() cellData.S = f.prepareCellStyle(ws, col, row, cellData.S) cellData.T, cellData.V = setCellFloat(value, precision, bitSize) - cellData.F, cellData.IS = nil, nil + cellData.removeFormula(ws) + cellData.IS = nil return err } @@ -356,7 +374,8 @@ func (f *File) SetCellStr(sheet, axis, value string) error { defer ws.Unlock() cellData.S = f.prepareCellStyle(ws, col, row, cellData.S) cellData.T, cellData.V, err = f.setCellString(value) - cellData.F, cellData.IS = nil, nil + cellData.removeFormula(ws) + cellData.IS = nil return err } @@ -455,7 +474,8 @@ func (f *File) SetCellDefault(sheet, axis, value string) error { defer ws.Unlock() cellData.S = f.prepareCellStyle(ws, col, row, cellData.S) cellData.T, cellData.V = setCellDefault(value) - cellData.F, cellData.IS = nil, nil + cellData.removeFormula(ws) + cellData.IS = nil return err } -- cgit v1.2.1