// themeWriter provides a function to save xl/theme/theme1.xml after serialize
// structure.
func (f *File) themeWriter() {
+ newColor := func(c *decodeCTColor) xlsxCTColor {
+ return xlsxCTColor{
+ ScrgbClr: c.ScrgbClr,
+ SrgbClr: c.SrgbClr,
+ HslClr: c.HslClr,
+ SysClr: c.SysClr,
+ SchemeClr: c.SchemeClr,
+ PrstClr: c.PrstClr,
+ }
+ }
+ newFontScheme := func(c *decodeFontCollection) xlsxFontCollection {
+ return xlsxFontCollection{
+ Latin: c.Latin,
+ Ea: c.Ea,
+ Cs: c.Cs,
+ Font: c.Font,
+ ExtLst: c.ExtLst,
+ }
+ }
if f.Theme != nil {
- output, _ := xml.Marshal(f.Theme)
+ output, _ := xml.Marshal(xlsxTheme{
+ XMLNSa: NameSpaceDrawingML.Value,
+ XMLNSr: SourceRelationship.Value,
+ Name: f.Theme.Name,
+ ThemeElements: xlsxBaseStyles{
+ ClrScheme: xlsxColorScheme{
+ Name: f.Theme.ThemeElements.ClrScheme.Name,
+ Dk1: newColor(&f.Theme.ThemeElements.ClrScheme.Dk1),
+ Lt1: newColor(&f.Theme.ThemeElements.ClrScheme.Lt1),
+ Dk2: newColor(&f.Theme.ThemeElements.ClrScheme.Dk2),
+ Lt2: newColor(&f.Theme.ThemeElements.ClrScheme.Lt2),
+ Accent1: newColor(&f.Theme.ThemeElements.ClrScheme.Accent1),
+ Accent2: newColor(&f.Theme.ThemeElements.ClrScheme.Accent2),
+ Accent3: newColor(&f.Theme.ThemeElements.ClrScheme.Accent3),
+ Accent4: newColor(&f.Theme.ThemeElements.ClrScheme.Accent4),
+ Accent5: newColor(&f.Theme.ThemeElements.ClrScheme.Accent5),
+ Accent6: newColor(&f.Theme.ThemeElements.ClrScheme.Accent6),
+ Hlink: newColor(&f.Theme.ThemeElements.ClrScheme.Hlink),
+ FolHlink: newColor(&f.Theme.ThemeElements.ClrScheme.FolHlink),
+ ExtLst: f.Theme.ThemeElements.ClrScheme.ExtLst,
+ },
+ FontScheme: xlsxFontScheme{
+ Name: f.Theme.ThemeElements.FontScheme.Name,
+ MajorFont: newFontScheme(&f.Theme.ThemeElements.FontScheme.MajorFont),
+ MinorFont: newFontScheme(&f.Theme.ThemeElements.FontScheme.MinorFont),
+ ExtLst: f.Theme.ThemeElements.FontScheme.ExtLst,
+ },
+ FmtScheme: xlsxStyleMatrix{
+ Name: f.Theme.ThemeElements.FmtScheme.Name,
+ FillStyleLst: f.Theme.ThemeElements.FmtScheme.FillStyleLst,
+ LnStyleLst: f.Theme.ThemeElements.FmtScheme.LnStyleLst,
+ EffectStyleLst: f.Theme.ThemeElements.FmtScheme.EffectStyleLst,
+ BgFillStyleLst: f.Theme.ThemeElements.FmtScheme.BgFillStyleLst,
+ },
+ ExtLst: f.Theme.ThemeElements.ExtLst,
+ },
+ ObjectDefaults: f.Theme.ObjectDefaults,
+ ExtraClrSchemeLst: f.Theme.ExtraClrSchemeLst,
+ CustClrLst: f.Theme.CustClrLst,
+ ExtLst: f.Theme.ExtLst,
+ })
f.saveFileList(defaultXMLPathTheme, f.replaceNameSpaceBytes(defaultXMLPathTheme, output))
}
}
if fl.PatternFill != nil {
fill.Type = "pattern"
fill.Pattern = inStrSlice(styleFillPatterns, fl.PatternFill.PatternType, false)
+ if fl.PatternFill.BgColor != nil {
+ fill.Color = []string{f.getThemeColor(fl.PatternFill.BgColor)}
+ }
if fl.PatternFill.FgColor != nil {
fill.Color = []string{f.getThemeColor(fl.PatternFill.FgColor)}
}
}
style = &Style{}
xf := s.Dxfs.Dxfs[idx]
+ // The default pattern fill type of conditional format style is solid
+ if xf.Fill != nil && xf.Fill.PatternFill != nil && xf.Fill.PatternFill.PatternType == "" {
+ xf.Fill.PatternFill.PatternType = "solid"
+ }
f.extractFills(xf.Fill, s, style)
f.extractBorders(xf.Border, s, style)
f.extractFont(xf.Font, s, style)
// themeReader provides a function to get the pointer to the xl/theme/theme1.xml
// structure after deserialization.
-func (f *File) themeReader() (*xlsxTheme, error) {
+func (f *File) themeReader() (*decodeTheme, error) {
if _, ok := f.Pkg.Load(defaultXMLPathTheme); !ok {
return nil, nil
}
- theme := xlsxTheme{XMLNSa: NameSpaceDrawingML.Value, XMLNSr: SourceRelationship.Value}
+ theme := decodeTheme{}
if err := f.xmlNewDecoder(bytes.NewReader(namespaceStrictToTransitional(f.readXML(defaultXMLPathTheme)))).
Decode(&theme); err != nil && err != io.EOF {
return &theme, err
// xlsxTheme directly maps the theme element in the namespace
// http://schemas.openxmlformats.org/drawingml/2006/main
type xlsxTheme struct {
- XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main theme"`
+ XMLName xml.Name `xml:"a:theme"`
XMLNSa string `xml:"xmlns:a,attr"`
XMLNSr string `xml:"xmlns:r,attr"`
Name string `xml:"name,attr"`
- ThemeElements xlsxBaseStyles `xml:"themeElements"`
- ObjectDefaults xlsxObjectDefaults `xml:"objectDefaults"`
- ExtraClrSchemeLst xlsxExtraClrSchemeLst `xml:"extraClrSchemeLst"`
- CustClrLst *xlsxInnerXML `xml:"custClrLst"`
- ExtLst *xlsxExtLst `xml:"extLst"`
+ ThemeElements xlsxBaseStyles `xml:"a:themeElements"`
+ ObjectDefaults xlsxObjectDefaults `xml:"a:objectDefaults"`
+ ExtraClrSchemeLst xlsxExtraClrSchemeLst `xml:"a:extraClrSchemeLst"`
+ CustClrLst *xlsxInnerXML `xml:"a:custClrLst"`
+ ExtLst *xlsxExtLst `xml:"a:extLst"`
}
// xlsxBaseStyles defines the theme elements for a theme, and is the workhorse
// scheme, a font scheme, and a style matrix (format scheme) that defines
// different formatting options for different pieces of a document.
type xlsxBaseStyles struct {
- ClrScheme xlsxColorScheme `xml:"clrScheme"`
- FontScheme xlsxFontScheme `xml:"fontScheme"`
- FmtScheme xlsxStyleMatrix `xml:"fmtScheme"`
- ExtLst *xlsxExtLst `xml:"extLst"`
+ ClrScheme xlsxColorScheme `xml:"a:clrScheme"`
+ FontScheme xlsxFontScheme `xml:"a:fontScheme"`
+ FmtScheme xlsxStyleMatrix `xml:"a:fmtScheme"`
+ ExtLst *xlsxExtLst `xml:"a:extLst"`
}
// xlsxCTColor holds the actual color values that are to be applied to a given
// diagram and how those colors are to be applied.
type xlsxCTColor struct {
- ScrgbClr *xlsxInnerXML `xml:"scrgbClr"`
- SrgbClr *attrValString `xml:"srgbClr"`
- HslClr *xlsxInnerXML `xml:"hslClr"`
- SysClr *xlsxSysClr `xml:"sysClr"`
- SchemeClr *xlsxInnerXML `xml:"schemeClr"`
- PrstClr *xlsxInnerXML `xml:"prstClr"`
+ ScrgbClr *xlsxInnerXML `xml:"a:scrgbClr"`
+ SrgbClr *attrValString `xml:"a:srgbClr"`
+ HslClr *xlsxInnerXML `xml:"a:hslClr"`
+ SysClr *xlsxSysClr `xml:"a:sysClr"`
+ SchemeClr *xlsxInnerXML `xml:"a:schemeClr"`
+ PrstClr *xlsxInnerXML `xml:"a:prstClr"`
}
// xlsxColorScheme defines a set of colors for the theme. The set of colors
// consists of twelve color slots that can each hold a color of choice.
type xlsxColorScheme struct {
Name string `xml:"name,attr"`
- Dk1 xlsxCTColor `xml:"dk1"`
- Lt1 xlsxCTColor `xml:"lt1"`
- Dk2 xlsxCTColor `xml:"dk2"`
- Lt2 xlsxCTColor `xml:"lt2"`
- Accent1 xlsxCTColor `xml:"accent1"`
- Accent2 xlsxCTColor `xml:"accent2"`
- Accent3 xlsxCTColor `xml:"accent3"`
- Accent4 xlsxCTColor `xml:"accent4"`
- Accent5 xlsxCTColor `xml:"accent5"`
- Accent6 xlsxCTColor `xml:"accent6"`
- Hlink xlsxCTColor `xml:"hlink"`
- FolHlink xlsxCTColor `xml:"folHlink"`
- ExtLst *xlsxExtLst `xml:"extLst"`
+ Dk1 xlsxCTColor `xml:"a:dk1"`
+ Lt1 xlsxCTColor `xml:"a:lt1"`
+ Dk2 xlsxCTColor `xml:"a:dk2"`
+ Lt2 xlsxCTColor `xml:"a:lt2"`
+ Accent1 xlsxCTColor `xml:"a:accent1"`
+ Accent2 xlsxCTColor `xml:"a:accent2"`
+ Accent3 xlsxCTColor `xml:"a:accent3"`
+ Accent4 xlsxCTColor `xml:"a:accent4"`
+ Accent5 xlsxCTColor `xml:"a:accent5"`
+ Accent6 xlsxCTColor `xml:"a:accent6"`
+ Hlink xlsxCTColor `xml:"a:hlink"`
+ FolHlink xlsxCTColor `xml:"a:folHlink"`
+ ExtLst *xlsxExtLst `xml:"a:extLst"`
}
// objectDefaults element allows for the definition of default shape, line,
// Asian, and complex script. On top of these three definitions, one can also
// define a font for use in a specific language or languages.
type xlsxFontCollection struct {
- Latin *xlsxCTTextFont `xml:"latin"`
- Ea *xlsxCTTextFont `xml:"ea"`
- Cs *xlsxCTTextFont `xml:"cs"`
- Font []xlsxCTSupplementalFont `xml:"font"`
- ExtLst *xlsxExtLst `xml:"extLst"`
+ Latin *xlsxCTTextFont `xml:"a:latin"`
+ Ea *xlsxCTTextFont `xml:"a:ea"`
+ Cs *xlsxCTTextFont `xml:"a:cs"`
+ Font []xlsxCTSupplementalFont `xml:"a:font"`
+ ExtLst *xlsxExtLst `xml:"a:extLst"`
}
// xlsxFontScheme element defines the font scheme within the theme. The font
// paragraph areas.
type xlsxFontScheme struct {
Name string `xml:"name,attr"`
- MajorFont xlsxFontCollection `xml:"majorFont"`
- MinorFont xlsxFontCollection `xml:"minorFont"`
- ExtLst *xlsxExtLst `xml:"extLst"`
+ MajorFont xlsxFontCollection `xml:"a:majorFont"`
+ MinorFont xlsxFontCollection `xml:"a:minorFont"`
+ ExtLst *xlsxExtLst `xml:"a:extLst"`
}
// xlsxStyleMatrix defines a set of formatting options, which can be referenced
// change when the theme is changed.
type xlsxStyleMatrix struct {
Name string `xml:"name,attr,omitempty"`
- FillStyleLst xlsxFillStyleLst `xml:"fillStyleLst"`
- LnStyleLst xlsxLnStyleLst `xml:"lnStyleLst"`
- EffectStyleLst xlsxEffectStyleLst `xml:"effectStyleLst"`
- BgFillStyleLst xlsxBgFillStyleLst `xml:"bgFillStyleLst"`
+ FillStyleLst xlsxFillStyleLst `xml:"a:fillStyleLst"`
+ LnStyleLst xlsxLnStyleLst `xml:"a:lnStyleLst"`
+ EffectStyleLst xlsxEffectStyleLst `xml:"a:effectStyleLst"`
+ BgFillStyleLst xlsxBgFillStyleLst `xml:"a:bgFillStyleLst"`
}
// xlsxFillStyleLst element defines a set of three fill styles that are used
Val string `xml:"val,attr"`
LastClr string `xml:"lastClr,attr"`
}
+
+// decodeTheme defines the structure used to parse the a:theme element for the
+// theme.
+type decodeTheme struct {
+ XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main theme"`
+ Name string `xml:"name,attr"`
+ ThemeElements decodeBaseStyles `xml:"themeElements"`
+ ObjectDefaults xlsxObjectDefaults `xml:"objectDefaults"`
+ ExtraClrSchemeLst xlsxExtraClrSchemeLst `xml:"extraClrSchemeLst"`
+ CustClrLst *xlsxInnerXML `xml:"custClrLst"`
+ ExtLst *xlsxExtLst `xml:"extLst"`
+}
+
+// decodeBaseStyles defines the structure used to parse the theme elements for a
+// theme, and is the workhorse of the theme.
+type decodeBaseStyles struct {
+ ClrScheme decodeColorScheme `xml:"clrScheme"`
+ FontScheme decodeFontScheme `xml:"fontScheme"`
+ FmtScheme decodeStyleMatrix `xml:"fmtScheme"`
+ ExtLst *xlsxExtLst `xml:"extLst"`
+}
+
+// decodeColorScheme defines the structure used to parse a set of colors for the
+// theme.
+type decodeColorScheme struct {
+ Name string `xml:"name,attr"`
+ Dk1 decodeCTColor `xml:"dk1"`
+ Lt1 decodeCTColor `xml:"lt1"`
+ Dk2 decodeCTColor `xml:"dk2"`
+ Lt2 decodeCTColor `xml:"lt2"`
+ Accent1 decodeCTColor `xml:"accent1"`
+ Accent2 decodeCTColor `xml:"accent2"`
+ Accent3 decodeCTColor `xml:"accent3"`
+ Accent4 decodeCTColor `xml:"accent4"`
+ Accent5 decodeCTColor `xml:"accent5"`
+ Accent6 decodeCTColor `xml:"accent6"`
+ Hlink decodeCTColor `xml:"hlink"`
+ FolHlink decodeCTColor `xml:"folHlink"`
+ ExtLst *xlsxExtLst `xml:"extLst"`
+}
+
+// decodeFontScheme defines the structure used to parse font scheme within the
+// theme.
+type decodeFontScheme struct {
+ Name string `xml:"name,attr"`
+ MajorFont decodeFontCollection `xml:"majorFont"`
+ MinorFont decodeFontCollection `xml:"minorFont"`
+ ExtLst *xlsxExtLst `xml:"extLst"`
+}
+
+// decodeFontCollection defines the structure used to parse a major and minor
+// font which is used in the font scheme.
+type decodeFontCollection struct {
+ Latin *xlsxCTTextFont `xml:"latin"`
+ Ea *xlsxCTTextFont `xml:"ea"`
+ Cs *xlsxCTTextFont `xml:"cs"`
+ Font []xlsxCTSupplementalFont `xml:"font"`
+ ExtLst *xlsxExtLst `xml:"extLst"`
+}
+
+// decodeCTColor defines the structure used to parse the actual color values
+// that are to be applied to a given diagram and how those colors are to be
+// applied.
+type decodeCTColor struct {
+ ScrgbClr *xlsxInnerXML `xml:"scrgbClr"`
+ SrgbClr *attrValString `xml:"srgbClr"`
+ HslClr *xlsxInnerXML `xml:"hslClr"`
+ SysClr *xlsxSysClr `xml:"sysClr"`
+ SchemeClr *xlsxInnerXML `xml:"schemeClr"`
+ PrstClr *xlsxInnerXML `xml:"prstClr"`
+}
+
+// decodeStyleMatrix defines the structure used to parse a set of formatting
+// options, which can be referenced by documents that apply a certain style to
+// a given part of an object.
+type decodeStyleMatrix struct {
+ Name string `xml:"name,attr,omitempty"`
+ FillStyleLst xlsxFillStyleLst `xml:"fillStyleLst"`
+ LnStyleLst xlsxLnStyleLst `xml:"lnStyleLst"`
+ EffectStyleLst xlsxEffectStyleLst `xml:"effectStyleLst"`
+ BgFillStyleLst xlsxBgFillStyleLst `xml:"bgFillStyleLst"`
+}