Pārlūkot izejas kodu

Merge pull request #253 from alex-whitney/252-color-scale-cond-formatting

Use min/mid/max value for 2 and 3 color scale conditional formatting
xuri 7 gadi atpakaļ
vecāks
revīzija
cddcf852c2
3 mainītis faili ar 151 papildinājumiem un 4 dzēšanām
  1. 16 3
      styles.go
  2. 134 0
      styles_test.go
  3. 1 1
      xmlWorksheet.go

+ 16 - 3
styles.go

@@ -2674,12 +2674,25 @@ func drawCondFmtDuplicateUniqueValues(p int, ct string, format *formatConditiona
 // for color scale (include 2 color scale and 3 color scale) by given priority,
 // criteria type and format settings.
 func drawCondFmtColorScale(p int, ct string, format *formatConditional) *xlsxCfRule {
+	minValue := format.MinValue
+	if minValue == "" {
+		minValue = "0"
+	}
+	maxValue := format.MaxValue
+	if maxValue == "" {
+		maxValue = "0"
+	}
+	midValue := format.MidValue
+	if midValue == "" {
+		midValue = "50"
+	}
+
 	c := &xlsxCfRule{
 		Priority: p + 1,
 		Type:     "colorScale",
 		ColorScale: &xlsxColorScale{
 			Cfvo: []*xlsxCfvo{
-				{Type: format.MinType},
+				{Type: format.MinType, Val: minValue},
 			},
 			Color: []*xlsxColor{
 				{RGB: getPaletteColor(format.MinColor)},
@@ -2687,10 +2700,10 @@ func drawCondFmtColorScale(p int, ct string, format *formatConditional) *xlsxCfR
 		},
 	}
 	if validType[format.Type] == "3_color_scale" {
-		c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MidType, Val: 50})
+		c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MidType, Val: midValue})
 		c.ColorScale.Color = append(c.ColorScale.Color, &xlsxColor{RGB: getPaletteColor(format.MidColor)})
 	}
-	c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MaxType})
+	c.ColorScale.Cfvo = append(c.ColorScale.Cfvo, &xlsxCfvo{Type: format.MaxType, Val: maxValue})
 	c.ColorScale.Color = append(c.ColorScale.Color, &xlsxColor{RGB: getPaletteColor(format.MaxColor)})
 	return c
 }

+ 134 - 0
styles_test.go

@@ -0,0 +1,134 @@
+package excelize
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestSetConditionalFormat(t *testing.T) {
+	cases := []struct {
+		label  string
+		format string
+		rules  []*xlsxCfRule
+	}{{
+		label: "3_color_scale",
+		format: `[{
+			"type":"3_color_scale",
+			"criteria":"=",
+			"min_type":"num",
+			"mid_type":"num",
+			"max_type":"num",
+			"min_value": "-10",
+			"mid_value": "0",
+			"max_value": "10",
+			"min_color":"ff0000",
+			"mid_color":"00ff00",
+			"max_color":"0000ff"
+		}]`,
+		rules: []*xlsxCfRule{{
+			Priority: 1,
+			Type:     "colorScale",
+			ColorScale: &xlsxColorScale{
+				Cfvo: []*xlsxCfvo{{
+					Type: "num",
+					Val:  "-10",
+				}, {
+					Type: "num",
+					Val:  "0",
+				}, {
+					Type: "num",
+					Val:  "10",
+				}},
+				Color: []*xlsxColor{{
+					RGB: "FFFF0000",
+				}, {
+					RGB: "FF00FF00",
+				}, {
+					RGB: "FF0000FF",
+				}},
+			},
+		}},
+	}, {
+		label: "3_color_scale default min/mid/max",
+		format: `[{
+			"type":"3_color_scale",
+			"criteria":"=",
+			"min_type":"num",
+			"mid_type":"num",
+			"max_type":"num",
+			"min_color":"ff0000",
+			"mid_color":"00ff00",
+			"max_color":"0000ff"
+		}]`,
+		rules: []*xlsxCfRule{{
+			Priority: 1,
+			Type:     "colorScale",
+			ColorScale: &xlsxColorScale{
+				Cfvo: []*xlsxCfvo{{
+					Type: "num",
+					Val:  "0",
+				}, {
+					Type: "num",
+					Val:  "50",
+				}, {
+					Type: "num",
+					Val:  "0",
+				}},
+				Color: []*xlsxColor{{
+					RGB: "FFFF0000",
+				}, {
+					RGB: "FF00FF00",
+				}, {
+					RGB: "FF0000FF",
+				}},
+			},
+		}},
+	}, {
+		label: "2_color_scale default min/max",
+		format: `[{
+			"type":"2_color_scale",
+			"criteria":"=",
+			"min_type":"num",
+			"max_type":"num",
+			"min_color":"ff0000",
+			"max_color":"0000ff"
+		}]`,
+		rules: []*xlsxCfRule{{
+			Priority: 1,
+			Type:     "colorScale",
+			ColorScale: &xlsxColorScale{
+				Cfvo: []*xlsxCfvo{{
+					Type: "num",
+					Val:  "0",
+				}, {
+					Type: "num",
+					Val:  "0",
+				}},
+				Color: []*xlsxColor{{
+					RGB: "FFFF0000",
+				}, {
+					RGB: "FF0000FF",
+				}},
+			},
+		}},
+	}}
+
+	for _, testCase := range cases {
+		xl := NewFile()
+		const sheet = "Sheet1"
+		const cellRange = "A1:A1"
+
+		err := xl.SetConditionalFormat(sheet, cellRange, testCase.format)
+		if err != nil {
+			t.Fatalf("%s", err)
+		}
+
+		xlsx := xl.workSheetReader(sheet)
+		cf := xlsx.ConditionalFormatting
+		assert.Len(t, cf, 1, testCase.label)
+		assert.Len(t, cf[0].CfRule, 1, testCase.label)
+		assert.Equal(t, cellRange, cf[0].SQRef, testCase.label)
+		assert.EqualValues(t, testCase.rules, cf[0].CfRule, testCase.label)
+	}
+}

+ 1 - 1
xmlWorksheet.go

@@ -446,7 +446,7 @@ type xlsxIconSet struct {
 type xlsxCfvo struct {
 	Gte    bool        `xml:"gte,attr,omitempty"`
 	Type   string      `xml:"type,attr,omitempty"`
-	Val    int         `xml:"val,attr"`
+	Val    string      `xml:"val,attr"`
 	ExtLst *xlsxExtLst `xml:"extLst"`
 }