diff --git a/sheetpr.go b/sheetpr.go index 73fb5b02c3c..9b410e04c92 100644 --- a/sheetpr.go +++ b/sheetpr.go @@ -33,14 +33,42 @@ type ( Published bool // FitToPage is a SheetPrOption FitToPage bool - // TabColor is a SheetPrOption - TabColor string + // TabColorIndexed is a TabColor option, within SheetPrOption + TabColorIndexed int + // TabColorRGB is a TabColor option, within SheetPrOption + TabColorRGB string + // TabColorTheme is a TabColor option, within SheetPrOption + TabColorTheme int + // TabColorTint is a TabColor option, within SheetPrOption + TabColorTint float64 + // Equivalent to TabColorRGB, alias added for backwards compatibility + TabColor = TabColorRGB // AutoPageBreaks is a SheetPrOption AutoPageBreaks bool // OutlineSummaryBelow is an outlinePr, within SheetPr option OutlineSummaryBelow bool ) +const ( + TabColorThemeUnset int = iota - 1 + TabColorThemeLight1 // Inverted compared to the spec because that's how Excel maps them + TabColorThemeDark1 + TabColorThemeLight2 + TabColorThemeDark2 + TabColorThemeAccent1 + TabColorThemeAccent2 + TabColorThemeAccent3 + TabColorThemeAccent4 + TabColorThemeAccent5 + TabColorThemeAccent6 + TabColorThemeHyperlink + TabColorThemeFollowedHyperlink + + TabColorIndexedUnset int = -1 + + TabColorTintUnset float64 = -2.0 +) + // setSheetPrOption implements the SheetPrOption interface. func (o OutlineSummaryBelow) setSheetPrOption(pr *xlsxSheetPr) { if pr.OutlinePr == nil { @@ -129,9 +157,28 @@ func (o *FitToPage) getSheetPrOption(pr *xlsxSheetPr) { *o = FitToPage(pr.PageSetUpPr.FitToPage) } +// setSheetPrOption implements the SheetPrOption interface and sets the +// TabColor Indexed. +func (o TabColorIndexed) setSheetPrOption(pr *xlsxSheetPr) { + if pr.TabColor == nil { + pr.TabColor = new(xlsxTabColor) + } + pr.TabColor.Indexed = int(o) +} + +// getSheetPrOption implements the SheetPrOptionPtr interface and gets the +// TabColor Indexed. Defaults to -1 if no theme has been set. +func (o *TabColorIndexed) getSheetPrOption(pr *xlsxSheetPr) { + if pr == nil || pr.TabColor == nil { + *o = TabColorIndexed(TabColorIndexedUnset) + return + } + *o = TabColorIndexed(pr.TabColor.Indexed) +} + // setSheetPrOption implements the SheetPrOption interface and specifies a // stable name of the sheet. -func (o TabColor) setSheetPrOption(pr *xlsxSheetPr) { +func (o TabColorRGB) setSheetPrOption(pr *xlsxSheetPr) { if pr.TabColor == nil { if string(o) == "" { return @@ -143,12 +190,50 @@ func (o TabColor) setSheetPrOption(pr *xlsxSheetPr) { // getSheetPrOption implements the SheetPrOptionPtr interface and get the // stable name of the sheet. -func (o *TabColor) getSheetPrOption(pr *xlsxSheetPr) { +func (o *TabColorRGB) getSheetPrOption(pr *xlsxSheetPr) { if pr == nil || pr.TabColor == nil { *o = "" return } - *o = TabColor(strings.TrimPrefix(pr.TabColor.RGB, "FF")) + *o = TabColorRGB(strings.TrimPrefix(pr.TabColor.RGB, "FF")) +} + +// setSheetPrOption implements the SheetPrOption interface and sets the +// TabColor Theme. Warning: it does not create a clrScheme! +func (o TabColorTheme) setSheetPrOption(pr *xlsxSheetPr) { + if pr.TabColor == nil { + pr.TabColor = new(xlsxTabColor) + } + pr.TabColor.Theme = int(o) +} + +// getSheetPrOption implements the SheetPrOptionPtr interface and gets the +// TabColor Theme. Defaults to -1 if no theme has been set. +func (o *TabColorTheme) getSheetPrOption(pr *xlsxSheetPr) { + if pr == nil || pr.TabColor == nil { + *o = TabColorTheme(TabColorThemeUnset) + return + } + *o = TabColorTheme(pr.TabColor.Theme) +} + +// setSheetPrOption implements the SheetPrOption interface and sets the +// TabColor Tint. +func (o TabColorTint) setSheetPrOption(pr *xlsxSheetPr) { + if pr.TabColor == nil { + pr.TabColor = new(xlsxTabColor) + } + pr.TabColor.Tint = float64(o) +} + +// getSheetPrOption implements the SheetPrOptionPtr interface and gets the +// TabColor Tint. Defaults to -2.0 if no theme has been set. +func (o *TabColorTint) getSheetPrOption(pr *xlsxSheetPr) { + if pr == nil || pr.TabColor == nil { + *o = TabColorTint(TabColorTintUnset) + return + } + *o = TabColorTint(pr.TabColor.Tint) } // setSheetPrOption implements the SheetPrOption interface. diff --git a/sheetpr_test.go b/sheetpr_test.go index 91685d88377..51d0debb238 100644 --- a/sheetpr_test.go +++ b/sheetpr_test.go @@ -13,7 +13,10 @@ var _ = []SheetPrOption{ EnableFormatConditionsCalculation(false), Published(false), FitToPage(true), - TabColor("#FFFF00"), + TabColorIndexed(42), + TabColorRGB("#FFFF00"), + TabColorTheme(TabColorThemeLight2), + TabColorTint(0.5), AutoPageBreaks(true), OutlineSummaryBelow(true), } @@ -23,7 +26,10 @@ var _ = []SheetPrOptionPtr{ (*EnableFormatConditionsCalculation)(nil), (*Published)(nil), (*FitToPage)(nil), - (*TabColor)(nil), + (*TabColorIndexed)(nil), + (*TabColorRGB)(nil), + (*TabColorTheme)(nil), + (*TabColorTint)(nil), (*AutoPageBreaks)(nil), (*OutlineSummaryBelow)(nil), } @@ -37,7 +43,10 @@ func ExampleFile_SetSheetPrOptions() { EnableFormatConditionsCalculation(false), Published(false), FitToPage(true), - TabColor("#FFFF00"), + TabColorIndexed(42), + TabColorRGB("#FFFF00"), + TabColorTheme(TabColorThemeLight2), + TabColorTint(0.5), AutoPageBreaks(true), OutlineSummaryBelow(false), ); err != nil { @@ -55,7 +64,10 @@ func ExampleFile_GetSheetPrOptions() { enableFormatConditionsCalculation EnableFormatConditionsCalculation published Published fitToPage FitToPage - tabColor TabColor + tabColorIndexed TabColorIndexed + tabColorRGB TabColorRGB + tabColorTheme TabColorTheme + tabColorTint TabColorTint autoPageBreaks AutoPageBreaks outlineSummaryBelow OutlineSummaryBelow ) @@ -65,7 +77,10 @@ func ExampleFile_GetSheetPrOptions() { &enableFormatConditionsCalculation, &published, &fitToPage, - &tabColor, + &tabColorIndexed, + &tabColorRGB, + &tabColorTheme, + &tabColorTint, &autoPageBreaks, &outlineSummaryBelow, ); err != nil { @@ -76,7 +91,10 @@ func ExampleFile_GetSheetPrOptions() { fmt.Println("- enableFormatConditionsCalculation:", enableFormatConditionsCalculation) fmt.Println("- published:", published) fmt.Println("- fitToPage:", fitToPage) - fmt.Printf("- tabColor: %q\n", tabColor) + fmt.Printf("- tabColorIndexed: %d\n", tabColorIndexed) + fmt.Printf("- tabColorRGB: %q\n", tabColorRGB) + fmt.Printf("- tabColorTheme: %d\n", tabColorTheme) + fmt.Printf("- tabColorTint: %f\n", tabColorTint) fmt.Println("- autoPageBreaks:", autoPageBreaks) fmt.Println("- outlineSummaryBelow:", outlineSummaryBelow) // Output: @@ -85,7 +103,10 @@ func ExampleFile_GetSheetPrOptions() { // - enableFormatConditionsCalculation: true // - published: true // - fitToPage: false - // - tabColor: "" + // - tabColorIndexed: -1 + // - tabColorRGB: "" + // - tabColorTheme: -1 + // - tabColorTint: -2.000000 // - autoPageBreaks: false // - outlineSummaryBelow: true } @@ -101,7 +122,10 @@ func TestSheetPrOptions(t *testing.T) { {new(EnableFormatConditionsCalculation), EnableFormatConditionsCalculation(false)}, {new(Published), Published(false)}, {new(FitToPage), FitToPage(true)}, - {new(TabColor), TabColor("FFFF00")}, + {new(TabColorIndexed), TabColorIndexed(42)}, + {new(TabColorRGB), TabColorRGB("FFFF00")}, + {new(TabColorTheme), TabColorTheme(TabColorThemeLight2)}, + {new(TabColorTint), TabColorTint(0.5)}, {new(AutoPageBreaks), AutoPageBreaks(true)}, {new(OutlineSummaryBelow), OutlineSummaryBelow(false)}, } @@ -154,7 +178,7 @@ func TestSheetPrOptions(t *testing.T) { func TestSetSheetPrOptions(t *testing.T) { f := NewFile() - assert.NoError(t, f.SetSheetPrOptions("Sheet1", TabColor(""))) + assert.NoError(t, f.SetSheetPrOptions("Sheet1", TabColorRGB(""))) // Test SetSheetPrOptions on not exists worksheet. assert.EqualError(t, f.SetSheetPrOptions("SheetN"), "sheet SheetN is not exist") }