Skip to content

Commit 52dd99a

Browse files
authored
This closes qax-os#2259, add value check for prevent using invalid fill type when create styles (qax-os#2260)
- Add new exported 5 error variables ErrFillType, ErrFillGradientColor, ErrFillGradientShading, ErrFillPatternColor and ErrFillPattern - Update unit tests
1 parent 4917cff commit 52dd99a

File tree

4 files changed

+62
-20
lines changed

4 files changed

+62
-20
lines changed

errors.go

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ var (
3838
// ErrCoordinates defined the error message on invalid coordinates tuples
3939
// length.
4040
ErrCoordinates = errors.New("coordinates length must be 4")
41-
// ErrCustomNumFmt defined the error message on receive the empty custom number format.
41+
// ErrCustomNumFmt defined the error message on receive the empty custom
42+
// number format.
4243
ErrCustomNumFmt = errors.New("custom number format can not be empty")
4344
// ErrDataValidationFormulaLength defined the error message for receiving a
4445
// data validation formula length that exceeds the limit.
@@ -54,8 +55,23 @@ var (
5455
ErrDefinedNameScope = errors.New("no defined name on the scope")
5556
// ErrExistsSheet defined the error message on given sheet already exists.
5657
ErrExistsSheet = errors.New("the same name sheet already exists")
57-
// ErrExistsTableName defined the error message on given table already exists.
58+
// ErrExistsTableName defined the error message on given table already
59+
// exists.
5860
ErrExistsTableName = errors.New("the same name table already exists")
61+
// ErrFillType defined the error message on receive an invalid fill type.
62+
ErrFillType = errors.New("fill type value must be one of 'gradient' or 'pattern'")
63+
// ErrFillGradientColor defined the error message on receive an invalid fill
64+
// color for 'gradient' type.
65+
ErrFillGradientColor = errors.New("fill color value must be an array of two colors for 'gradient' type")
66+
// ErrFillGradientShading defined the error message on receive an invalid
67+
// fill shading for 'gradient' type.
68+
ErrFillGradientShading = errors.New("fill shading value must be between 0 and 16 for 'gradient' type")
69+
// ErrFillPatternColor defined the error message on receive an invalid fill
70+
// color for 'pattern' type.
71+
ErrFillPatternColor = errors.New("fill color value must be empty or an array of one color for 'pattern' type")
72+
// ErrFillPattern defined the error message on receive an invalid fill
73+
// pattern.
74+
ErrFillPattern = errors.New("fill pattern value must be between 0 and 18")
5975
// ErrFontLength defined the error message on the length of the font
6076
// family name overflow.
6177
ErrFontLength = fmt.Errorf("the length of the font family name must be less than or equal to %d", MaxFontFamilyLength)
@@ -78,7 +94,8 @@ var (
7894
// ErrMaxRowHeight defined the error message on receive an invalid row
7995
// height.
8096
ErrMaxRowHeight = fmt.Errorf("the height of the row must be less than or equal to %d points", MaxRowHeight)
81-
// ErrMaxRows defined the error message on receive a row number exceeds maximum limit.
97+
// ErrMaxRows defined the error message on receive a row number exceeds
98+
// maximum limit.
8299
ErrMaxRows = errors.New("row number exceeds maximum limit")
83100
// ErrNameLength defined the error message on receiving the defined name or
84101
// table name length exceeds the limit.
@@ -169,8 +186,8 @@ var (
169186
// ErrUnsupportedHashAlgorithm defined the error message on unsupported
170187
// hash algorithm.
171188
ErrUnsupportedHashAlgorithm = errors.New("unsupported hash algorithm")
172-
// ErrUnsupportedNumberFormat defined the error message on unsupported number format
173-
// expression.
189+
// ErrUnsupportedNumberFormat defined the error message on unsupported
190+
// number format expression.
174191
ErrUnsupportedNumberFormat = errors.New("unsupported number format token")
175192
// ErrWorkbookFileFormat defined the error message on receive an
176193
// unsupported workbook file format.

excelize_test.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -970,18 +970,10 @@ func TestSetCellStyleFill(t *testing.T) {
970970
assert.NoError(t, err)
971971
assert.NoError(t, f.SetCellStyle("Sheet1", "O23", "O23", style))
972972

973-
style, err = f.NewStyle(&Style{Fill: Fill{Type: "gradient", Color: []string{"FFFFFF"}, Shading: 1}})
974-
assert.NoError(t, err)
975-
assert.NoError(t, f.SetCellStyle("Sheet1", "O23", "O23", style))
976-
977973
style, err = f.NewStyle(&Style{Fill: Fill{Type: "pattern", Color: []string{}, Shading: 1}})
978974
assert.NoError(t, err)
979975
assert.NoError(t, f.SetCellStyle("Sheet1", "O23", "O23", style))
980976

981-
style, err = f.NewStyle(&Style{Fill: Fill{Type: "pattern", Color: []string{"E0EBF5"}, Pattern: 19}})
982-
assert.NoError(t, err)
983-
assert.NoError(t, f.SetCellStyle("Sheet1", "O23", "O23", style))
984-
985977
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellStyleFill.xlsx")))
986978
}
987979

styles.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,25 @@ func parseFormatStyleSet(style *Style) (*Style, error) {
134134
return style, ErrFontSize
135135
}
136136
}
137+
switch style.Fill.Type {
138+
case "gradient":
139+
if len(style.Fill.Color) != 2 {
140+
return style, ErrFillGradientColor
141+
}
142+
if style.Fill.Shading < 0 || style.Fill.Shading > 16 {
143+
return style, ErrFillGradientShading
144+
}
145+
case "pattern":
146+
if len(style.Fill.Color) > 1 {
147+
return style, ErrFillPatternColor
148+
}
149+
if style.Fill.Pattern < 0 || style.Fill.Pattern > 18 {
150+
return style, ErrFillPattern
151+
}
152+
case "":
153+
default:
154+
return style, ErrFillType
155+
}
137156
if style.CustomNumFmt != nil && len(*style.CustomNumFmt) == 0 {
138157
err = ErrCustomNumFmt
139158
}
@@ -2054,9 +2073,6 @@ func newFills(style *Style, fg bool) *xlsxFill {
20542073
var fill xlsxFill
20552074
switch style.Fill.Type {
20562075
case "gradient":
2057-
if len(style.Fill.Color) != 2 || style.Fill.Shading < 0 || style.Fill.Shading > 16 {
2058-
break
2059-
}
20602076
gradient := styleFillVariants()[style.Fill.Shading]
20612077
gradient.Stop[0].Color.RGB = getPaletteColor(style.Fill.Color[0])
20622078
gradient.Stop[1].Color.RGB = getPaletteColor(style.Fill.Color[1])
@@ -2065,9 +2081,6 @@ func newFills(style *Style, fg bool) *xlsxFill {
20652081
}
20662082
fill.GradientFill = &gradient
20672083
case "pattern":
2068-
if style.Fill.Pattern > 18 || style.Fill.Pattern < 0 {
2069-
break
2070-
}
20712084
var pattern xlsxPatternFill
20722085
pattern.PatternType = styleFillPatterns[style.Fill.Pattern]
20732086
if len(style.Fill.Color) < 1 {

styles_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,12 +408,32 @@ func TestUnsetConditionalFormat(t *testing.T) {
408408

409409
func TestNewStyle(t *testing.T) {
410410
f := NewFile()
411-
for i := range 18 {
411+
for i := range 16 {
412412
_, err := f.NewStyle(&Style{
413413
Fill: Fill{Type: "gradient", Color: []string{"FFFFFF", "4E71BE"}, Shading: i},
414414
})
415415
assert.NoError(t, err)
416416
}
417+
_, err := f.NewStyle(&Style{
418+
Fill: Fill{Type: "solid"},
419+
})
420+
assert.Equal(t, ErrFillType, err)
421+
_, err = f.NewStyle(&Style{
422+
Fill: Fill{Type: "gradient", Color: []string{"FFFFFF"}, Shading: 0},
423+
})
424+
assert.Equal(t, ErrFillGradientColor, err)
425+
_, err = f.NewStyle(&Style{
426+
Fill: Fill{Type: "gradient", Color: []string{"FFFFFF", "4E71BE"}, Shading: 17},
427+
})
428+
assert.Equal(t, ErrFillGradientShading, err)
429+
_, err = f.NewStyle(&Style{
430+
Fill: Fill{Type: "pattern", Color: []string{"FFFFFF", "4E71BE"}, Shading: 0},
431+
})
432+
assert.Equal(t, ErrFillPatternColor, err)
433+
_, err = f.NewStyle(&Style{
434+
Fill: Fill{Type: "pattern", Pattern: 19},
435+
})
436+
assert.Equal(t, ErrFillPattern, err)
417437
f = NewFile()
418438
styleID, err := f.NewStyle(&Style{Font: &Font{Bold: true, Italic: true, Family: "Times New Roman", Size: 36, Color: "777777"}})
419439
assert.NoError(t, err)

0 commit comments

Comments
 (0)