From afb2d27c90130878b82a70b44ccb4e30344cc09e Mon Sep 17 00:00:00 2001 From: xuri Date: Mon, 23 May 2022 13:02:11 +0800 Subject: This fix formula calculation accuracy issue and panic when set pane - Fix `GROWTH` and `TREND` calculation accuracy issue - Fix panic when add pane on empty sheet views worksheet - New exported constants `MinFontSize` --- calc.go | 3 +-- calc_test.go | 6 +++--- errors.go | 8 ++++---- sheet.go | 3 +++ sheet_test.go | 6 ++++++ styles.go | 2 +- xmlDrawing.go | 1 + 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/calc.go b/calc.go index f71f3e8..8a80fb5 100644 --- a/calc.go +++ b/calc.go @@ -4579,8 +4579,7 @@ func newFormulaArgMatrix(numMtx [][]float64) (arg [][]formulaArg) { for r, row := range numMtx { arg = append(arg, make([]formulaArg, len(row))) for c, cell := range row { - decimal, _ := big.NewFloat(cell).SetPrec(15).Float64() - arg[r][c] = newNumberFormulaArg(decimal) + arg[r][c] = newNumberFormulaArg(cell) } } return diff --git a/calc_test.go b/calc_test.go index 205f329..2cbcc97 100644 --- a/calc_test.go +++ b/calc_test.go @@ -4518,17 +4518,17 @@ func TestCalcGROWTHandTREND(t *testing.T) { formulaList := map[string]string{ "=GROWTH(A2:B2)": "1", "=GROWTH(B2:B5,A2:A5,A8:A10)": "160", - "=GROWTH(B2:B5,A2:A5,A8:A10,FALSE)": "467.84375", + "=GROWTH(B2:B5,A2:A5,A8:A10,FALSE)": "467.842838114059", "=GROWTH(A4:A5,A2:B3,A8:A10,FALSE)": "", "=GROWTH(A3:A5,A2:B4,A2:B3)": "2", "=GROWTH(A4:A5,A2:B3)": "", "=GROWTH(A2:B2,A2:B3)": "", - "=GROWTH(A2:B2,A2:B3,A2:B3,FALSE)": "1.28399658203125", + "=GROWTH(A2:B2,A2:B3,A2:B3,FALSE)": "1.28402541668774", "=GROWTH(A2:B2,A4:B5,A4:B5,FALSE)": "1", "=GROWTH(A3:C3,A2:C3,A2:B3)": "2", "=TREND(A2:B2)": "1", "=TREND(B2:B5,A2:A5,A8:A10)": "95", - "=TREND(B2:B5,A2:A5,A8:A10,FALSE)": "81.66796875", + "=TREND(B2:B5,A2:A5,A8:A10,FALSE)": "81.6666666666667", "=TREND(A4:A5,A2:B3,A8:A10,FALSE)": "", "=TREND(A4:A5,A2:B3,A2:B3,FALSE)": "1.5", "=TREND(A3:A5,A2:B4,A2:B3)": "2", diff --git a/errors.go b/errors.go index 61a7456..9806293 100644 --- a/errors.go +++ b/errors.go @@ -102,7 +102,7 @@ var ( ErrMaxRows = errors.New("row number exceeds maximum limit") // ErrMaxRowHeight defined the error message on receive an invalid row // height. - ErrMaxRowHeight = errors.New("the height of the row must be smaller than or equal to 409 points") + ErrMaxRowHeight = fmt.Errorf("the height of the row must be smaller than or equal to %d points", MaxRowHeight) // ErrImgExt defined the error message on receive an unsupported image // extension. ErrImgExt = errors.New("unsupported image extension") @@ -145,9 +145,9 @@ var ( ErrCustomNumFmt = errors.New("custom number format can not be empty") // ErrFontLength defined the error message on the length of the font // family name overflow. - ErrFontLength = errors.New("the length of the font family name must be smaller than or equal to 31") + ErrFontLength = fmt.Errorf("the length of the font family name must be smaller than or equal to %d", MaxFontFamilyLength) // ErrFontSize defined the error message on the size of the font is invalid. - ErrFontSize = errors.New("font size must be between 1 and 409 points") + ErrFontSize = fmt.Errorf("font size must be between %d and %d points", MinFontSize, MaxFontSize) // ErrSheetIdx defined the error message on receive the invalid worksheet // index. ErrSheetIdx = errors.New("invalid worksheet index") @@ -161,7 +161,7 @@ var ( ErrGroupSheets = errors.New("group worksheet must contain an active worksheet") // ErrDataValidationFormulaLength defined the error message for receiving a // data validation formula length that exceeds the limit. - ErrDataValidationFormulaLength = errors.New("data validation must be 0-255 characters") + ErrDataValidationFormulaLength = fmt.Errorf("data validation must be 0-%d characters", MaxFieldLength) // ErrDataValidationRange defined the error message on set decimal range // exceeds limit. ErrDataValidationRange = errors.New("data validation range exceeds limit") diff --git a/sheet.go b/sheet.go index 4665fd9..1c17f78 100644 --- a/sheet.go +++ b/sheet.go @@ -773,6 +773,9 @@ func (f *File) SetPanes(sheet, panes string) error { if fs.Freeze { p.State = "frozen" } + if ws.SheetViews == nil { + ws.SheetViews = &xlsxSheetViews{SheetView: []xlsxSheetView{{}}} + } ws.SheetViews.SheetView[len(ws.SheetViews.SheetView)-1].Pane = p if !(fs.Freeze) && !(fs.Split) { if len(ws.SheetViews.SheetView) > 0 { diff --git a/sheet_test.go b/sheet_test.go index db36417..3ad0e75 100644 --- a/sheet_test.go +++ b/sheet_test.go @@ -104,6 +104,12 @@ func TestSetPane(t *testing.T) { assert.NoError(t, f.SetPanes("Panes 4", "")) assert.EqualError(t, f.SetPanes("SheetN", ""), "sheet SheetN is not exist") assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetPane.xlsx"))) + // Test add pane on empty sheet views worksheet + f = NewFile() + f.checked = nil + f.Sheet.Delete("xl/worksheets/sheet1.xml") + f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(``)) + assert.NoError(t, f.SetPanes("Sheet1", `{"freeze":true,"split":false,"x_split":1,"y_split":0,"top_left_cell":"B1","active_pane":"topRight","panes":[{"sqref":"K16","active_cell":"K16","pane":"topRight"}]}`)) } func TestPageLayoutOption(t *testing.T) { diff --git a/styles.go b/styles.go index 4b5c772..f8f4030 100644 --- a/styles.go +++ b/styles.go @@ -2042,7 +2042,7 @@ func (f *File) getFontID(styleSheet *xlsxStyleSheet, style *Style) (fontID int) // settings. func (f *File) newFont(style *Style) *xlsxFont { fontUnderlineType := map[string]string{"single": "single", "double": "double"} - if style.Font.Size < 1 { + if style.Font.Size < MinFontSize { style.Font.Size = 11 } if style.Font.Color == "" { diff --git a/xmlDrawing.go b/xmlDrawing.go index db5d750..4808685 100644 --- a/xmlDrawing.go +++ b/xmlDrawing.go @@ -107,6 +107,7 @@ const ( MaxFieldLength = 255 MaxColumnWidth = 255 MaxRowHeight = 409 + MinFontSize = 1 TotalRows = 1048576 TotalColumns = 16384 TotalSheetHyperlinks = 65529 -- cgit v1.2.1