- Add a new field Fill in Chart, ChartPlotArea, and ChartMarker struct - Support set solid color or transparent fill for chart area, plot area, and maker
This commit is contained in:
parent
4eb3486682
commit
5399572353
|
@ -158,7 +158,12 @@ func TestAddChart(t *testing.T) {
|
||||||
{Name: "Sheet1!$A$34", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$34:$D$34"},
|
{Name: "Sheet1!$A$34", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$34:$D$34"},
|
||||||
{Name: "Sheet1!$A$35", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$35:$D$35"},
|
{Name: "Sheet1!$A$35", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$35:$D$35"},
|
||||||
{Name: "Sheet1!$A$36", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$36:$D$36"},
|
{Name: "Sheet1!$A$36", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$36:$D$36"},
|
||||||
{Name: "Sheet1!$A$37", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$37:$D$37"},
|
{
|
||||||
|
Name: "Sheet1!$A$37", Categories: "Sheet1!$B$29:$D$29", Values: "Sheet1!$B$37:$D$37",
|
||||||
|
Marker: ChartMarker{
|
||||||
|
Fill: Fill{Type: "pattern", Color: []string{"FFFF00"}, Pattern: 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
series2 := []ChartSeries{
|
series2 := []ChartSeries{
|
||||||
{
|
{
|
||||||
|
@ -203,14 +208,15 @@ func TestAddChart(t *testing.T) {
|
||||||
ShowPercent: true,
|
ShowPercent: true,
|
||||||
ShowSerName: true,
|
ShowSerName: true,
|
||||||
ShowVal: true,
|
ShowVal: true,
|
||||||
|
Fill: Fill{Type: "pattern", Pattern: 1},
|
||||||
}
|
}
|
||||||
for _, c := range []struct {
|
for _, c := range []struct {
|
||||||
sheetName, cell string
|
sheetName, cell string
|
||||||
opts *Chart
|
opts *Chart
|
||||||
}{
|
}{
|
||||||
{sheetName: "Sheet1", cell: "P1", opts: &Chart{Type: Col, Series: series, Format: format, Legend: ChartLegend{Position: "none", ShowLegendKey: true}, Title: []RichTextRun{{Text: "2D Column Chart"}}, PlotArea: plotArea, Border: ChartLine{Type: ChartLineNone}, ShowBlanksAs: "zero", XAxis: ChartAxis{Font: Font{Bold: true, Italic: true, Underline: "dbl", Color: "000000"}, Title: []RichTextRun{{Text: "Primary Horizontal Axis Title"}}}, YAxis: ChartAxis{Font: Font{Bold: false, Italic: false, Underline: "sng", Color: "777777"}, Title: []RichTextRun{{Text: "Primary Vertical Axis Title", Font: &Font{Color: "777777", Bold: true, Italic: true, Size: 12}}}}}},
|
{sheetName: "Sheet1", cell: "P1", opts: &Chart{Type: Col, Series: series, Format: format, Legend: ChartLegend{Position: "none", ShowLegendKey: true}, Title: []RichTextRun{{Text: "2D Column Chart"}}, PlotArea: plotArea, Border: ChartLine{Type: ChartLineNone}, ShowBlanksAs: "zero", XAxis: ChartAxis{Font: Font{Bold: true, Italic: true, Underline: "dbl", Color: "000000"}, Title: []RichTextRun{{Text: "Primary Horizontal Axis Title"}}}, YAxis: ChartAxis{Font: Font{Bold: false, Italic: false, Underline: "sng", Color: "777777"}, Title: []RichTextRun{{Text: "Primary Vertical Axis Title", Font: &Font{Color: "777777", Bold: true, Italic: true, Size: 12}}}}}},
|
||||||
{sheetName: "Sheet1", cell: "X1", opts: &Chart{Type: ColStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "2D Stacked Column Chart"}}, PlotArea: plotArea, Border: ChartLine{Type: ChartLineAutomatic}, ShowBlanksAs: "zero"}},
|
{sheetName: "Sheet1", cell: "X1", opts: &Chart{Type: ColStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "2D Stacked Column Chart"}}, PlotArea: plotArea, Fill: Fill{Type: "pattern", Pattern: 1}, Border: ChartLine{Type: ChartLineAutomatic}, ShowBlanksAs: "zero"}},
|
||||||
{sheetName: "Sheet1", cell: "P16", opts: &Chart{Type: ColPercentStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "100% Stacked Column Chart"}}, PlotArea: plotArea, Border: ChartLine{Type: ChartLineSolid, Width: 2}, ShowBlanksAs: "zero"}},
|
{sheetName: "Sheet1", cell: "P16", opts: &Chart{Type: ColPercentStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "100% Stacked Column Chart"}}, PlotArea: plotArea, Fill: Fill{Type: "pattern", Color: []string{"EEEEEE"}, Pattern: 1}, Border: ChartLine{Type: ChartLineSolid, Width: 2}, ShowBlanksAs: "zero"}},
|
||||||
{sheetName: "Sheet1", cell: "X16", opts: &Chart{Type: Col3DClustered, Series: series, Format: format, Legend: ChartLegend{Position: "bottom", ShowLegendKey: false}, Title: []RichTextRun{{Text: "3D Clustered Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
{sheetName: "Sheet1", cell: "X16", opts: &Chart{Type: Col3DClustered, Series: series, Format: format, Legend: ChartLegend{Position: "bottom", ShowLegendKey: false}, Title: []RichTextRun{{Text: "3D Clustered Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
||||||
{sheetName: "Sheet1", cell: "P30", opts: &Chart{Type: Col3DStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "3D Stacked Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
{sheetName: "Sheet1", cell: "P30", opts: &Chart{Type: Col3DStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "3D Stacked Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
||||||
{sheetName: "Sheet1", cell: "X30", opts: &Chart{Type: Col3DPercentStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "3D 100% Stacked Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
{sheetName: "Sheet1", cell: "X30", opts: &Chart{Type: Col3DPercentStacked, Series: series, Format: format, Legend: legend, Title: []RichTextRun{{Text: "3D 100% Stacked Column Chart"}}, PlotArea: plotArea, ShowBlanksAs: "zero"}},
|
||||||
|
|
43
drawing.go
43
drawing.go
|
@ -107,6 +107,7 @@ func (f *File) addChart(opts *Chart, comboCharts []*Chart) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
xlsxChartSpace.SpPr = f.drawShapeFill(opts.Fill, xlsxChartSpace.SpPr)
|
||||||
plotAreaFunc := map[ChartType]func(*Chart) *cPlotArea{
|
plotAreaFunc := map[ChartType]func(*Chart) *cPlotArea{
|
||||||
Area: f.drawBaseChart,
|
Area: f.drawBaseChart,
|
||||||
AreaStacked: f.drawBaseChart,
|
AreaStacked: f.drawBaseChart,
|
||||||
|
@ -167,6 +168,7 @@ func (f *File) addChart(opts *Chart, comboCharts []*Chart) {
|
||||||
if opts.Legend.Position == "none" {
|
if opts.Legend.Position == "none" {
|
||||||
xlsxChartSpace.Chart.Legend = nil
|
xlsxChartSpace.Chart.Legend = nil
|
||||||
}
|
}
|
||||||
|
xlsxChartSpace.Chart.PlotArea.SpPr = f.drawShapeFill(opts.PlotArea.Fill, xlsxChartSpace.Chart.PlotArea.SpPr)
|
||||||
addChart := func(c, p *cPlotArea) {
|
addChart := func(c, p *cPlotArea) {
|
||||||
immutable, mutable := reflect.ValueOf(c).Elem(), reflect.ValueOf(p).Elem()
|
immutable, mutable := reflect.ValueOf(c).Elem(), reflect.ValueOf(p).Elem()
|
||||||
for i := 0; i < mutable.NumField(); i++ {
|
for i := 0; i < mutable.NumField(); i++ {
|
||||||
|
@ -727,19 +729,28 @@ func (f *File) drawChartSeries(opts *Chart) *[]cSer {
|
||||||
return &ser
|
return &ser
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// drawShapeFill provides a function to draw the a:solidFill element by given
|
||||||
|
// fill format sets.
|
||||||
|
func (f *File) drawShapeFill(fill Fill, spPr *cSpPr) *cSpPr {
|
||||||
|
if fill.Type == "pattern" && fill.Pattern == 1 {
|
||||||
|
if spPr == nil {
|
||||||
|
spPr = &cSpPr{}
|
||||||
|
}
|
||||||
|
if len(fill.Color) == 1 {
|
||||||
|
spPr.SolidFill = &aSolidFill{SrgbClr: &attrValString{Val: stringPtr(strings.TrimPrefix(fill.Color[0], "#"))}}
|
||||||
|
return spPr
|
||||||
|
}
|
||||||
|
spPr.SolidFill = nil
|
||||||
|
spPr.NoFill = stringPtr("")
|
||||||
|
}
|
||||||
|
return spPr
|
||||||
|
}
|
||||||
|
|
||||||
// drawChartSeriesSpPr provides a function to draw the c:spPr element by given
|
// drawChartSeriesSpPr provides a function to draw the c:spPr element by given
|
||||||
// format sets.
|
// format sets.
|
||||||
func (f *File) drawChartSeriesSpPr(i int, opts *Chart) *cSpPr {
|
func (f *File) drawChartSeriesSpPr(i int, opts *Chart) *cSpPr {
|
||||||
var srgbClr *attrValString
|
spPr := &cSpPr{SolidFill: &aSolidFill{SchemeClr: &aSchemeClr{Val: "accent" + strconv.Itoa((opts.order+i)%6+1)}}}
|
||||||
var schemeClr *aSchemeClr
|
spPr = f.drawShapeFill(opts.Series[i].Fill, spPr)
|
||||||
|
|
||||||
if color := opts.Series[i].Fill.Color; len(color) == 1 {
|
|
||||||
srgbClr = &attrValString{Val: stringPtr(strings.TrimPrefix(color[0], "#"))}
|
|
||||||
} else {
|
|
||||||
schemeClr = &aSchemeClr{Val: "accent" + strconv.Itoa((opts.order+i)%6+1)}
|
|
||||||
}
|
|
||||||
|
|
||||||
spPr := &cSpPr{SolidFill: &aSolidFill{SchemeClr: schemeClr, SrgbClr: srgbClr}}
|
|
||||||
spPrScatter := &cSpPr{
|
spPrScatter := &cSpPr{
|
||||||
Ln: &aLn{
|
Ln: &aLn{
|
||||||
W: 25400,
|
W: 25400,
|
||||||
|
@ -748,12 +759,9 @@ func (f *File) drawChartSeriesSpPr(i int, opts *Chart) *cSpPr {
|
||||||
}
|
}
|
||||||
spPrLine := &cSpPr{
|
spPrLine := &cSpPr{
|
||||||
Ln: &aLn{
|
Ln: &aLn{
|
||||||
W: f.ptToEMUs(opts.Series[i].Line.Width),
|
W: f.ptToEMUs(opts.Series[i].Line.Width),
|
||||||
Cap: "rnd", // rnd, sq, flat
|
Cap: "rnd", // rnd, sq, flat
|
||||||
SolidFill: &aSolidFill{
|
SolidFill: spPr.SolidFill,
|
||||||
SchemeClr: schemeClr,
|
|
||||||
SrgbClr: srgbClr,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if chartSeriesSpPr, ok := map[ChartType]*cSpPr{
|
if chartSeriesSpPr, ok := map[ChartType]*cSpPr{
|
||||||
|
@ -761,7 +769,7 @@ func (f *File) drawChartSeriesSpPr(i int, opts *Chart) *cSpPr {
|
||||||
}[opts.Type]; ok {
|
}[opts.Type]; ok {
|
||||||
return chartSeriesSpPr
|
return chartSeriesSpPr
|
||||||
}
|
}
|
||||||
if srgbClr != nil {
|
if spPr.SolidFill.SrgbClr != nil {
|
||||||
return spPr
|
return spPr
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -857,6 +865,7 @@ func (f *File) drawChartSeriesMarker(i int, opts *Chart) *cMarker {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
marker.SpPr = f.drawShapeFill(opts.Series[i].Marker.Fill, marker.SpPr)
|
||||||
chartSeriesMarker := map[ChartType]*cMarker{Scatter: marker, Line: marker}
|
chartSeriesMarker := map[ChartType]*cMarker{Scatter: marker, Line: marker}
|
||||||
return chartSeriesMarker[opts.Type]
|
return chartSeriesMarker[opts.Type]
|
||||||
}
|
}
|
||||||
|
|
|
@ -561,6 +561,7 @@ type ChartPlotArea struct {
|
||||||
ShowPercent bool
|
ShowPercent bool
|
||||||
ShowSerName bool
|
ShowSerName bool
|
||||||
ShowVal bool
|
ShowVal bool
|
||||||
|
Fill Fill
|
||||||
NumFmt ChartNumFmt
|
NumFmt ChartNumFmt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,6 +577,7 @@ type Chart struct {
|
||||||
XAxis ChartAxis
|
XAxis ChartAxis
|
||||||
YAxis ChartAxis
|
YAxis ChartAxis
|
||||||
PlotArea ChartPlotArea
|
PlotArea ChartPlotArea
|
||||||
|
Fill Fill
|
||||||
Border ChartLine
|
Border ChartLine
|
||||||
ShowBlanksAs string
|
ShowBlanksAs string
|
||||||
BubbleSize int
|
BubbleSize int
|
||||||
|
@ -591,6 +593,7 @@ type ChartLegend struct {
|
||||||
|
|
||||||
// ChartMarker directly maps the format settings of the chart marker.
|
// ChartMarker directly maps the format settings of the chart marker.
|
||||||
type ChartMarker struct {
|
type ChartMarker struct {
|
||||||
|
Fill Fill
|
||||||
Symbol string
|
Symbol string
|
||||||
Size int
|
Size int
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue