@@ -1161,25 +1161,61 @@ var (
1161
1161
"iconSet" : drawCondFmtIconSet ,
1162
1162
}
1163
1163
// extractContFmtFunc defines functions to get conditional formats.
1164
- extractContFmtFunc = map [string ]func (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1165
- "cellIs" : extractCondFmtCellIs ,
1166
- "timePeriod" : extractCondFmtTimePeriod ,
1167
- "containsText" : extractCondFmtText ,
1168
- "notContainsText" : extractCondFmtText ,
1169
- "beginsWith" : extractCondFmtText ,
1170
- "endsWith" : extractCondFmtText ,
1171
- "top10" : extractCondFmtTop10 ,
1172
- "aboveAverage" : extractCondFmtAboveAverage ,
1173
- "duplicateValues" : extractCondFmtDuplicateUniqueValues ,
1174
- "uniqueValues" : extractCondFmtDuplicateUniqueValues ,
1175
- "containsBlanks" : extractCondFmtBlanks ,
1176
- "notContainsBlanks" : extractCondFmtNoBlanks ,
1177
- "containsErrors" : extractCondFmtErrors ,
1178
- "notContainsErrors" : extractCondFmtNoErrors ,
1179
- "colorScale" : extractCondFmtColorScale ,
1180
- "dataBar" : extractCondFmtDataBar ,
1181
- "expression" : extractCondFmtExp ,
1182
- "iconSet" : extractCondFmtIconSet ,
1164
+ extractContFmtFunc = map [string ]func (* File , * xlsxCfRule , * xlsxExtLst ) ConditionalFormatOptions {
1165
+ "cellIs" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1166
+ return f .extractCondFmtCellIs (c , extLst )
1167
+ },
1168
+ "timePeriod" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1169
+ return f .extractCondFmtTimePeriod (c , extLst )
1170
+ },
1171
+ "containsText" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1172
+ return f .extractCondFmtText (c , extLst )
1173
+ },
1174
+ "notContainsText" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1175
+ return f .extractCondFmtText (c , extLst )
1176
+ },
1177
+ "beginsWith" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1178
+ return f .extractCondFmtText (c , extLst )
1179
+ },
1180
+ "endsWith" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1181
+ return f .extractCondFmtText (c , extLst )
1182
+ },
1183
+ "top10" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1184
+ return f .extractCondFmtTop10 (c , extLst )
1185
+ },
1186
+ "aboveAverage" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1187
+ return f .extractCondFmtAboveAverage (c , extLst )
1188
+ },
1189
+ "duplicateValues" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1190
+ return f .extractCondFmtDuplicateUniqueValues (c , extLst )
1191
+ },
1192
+ "uniqueValues" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1193
+ return f .extractCondFmtDuplicateUniqueValues (c , extLst )
1194
+ },
1195
+ "containsBlanks" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1196
+ return f .extractCondFmtBlanks (c , extLst )
1197
+ },
1198
+ "notContainsBlanks" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1199
+ return f .extractCondFmtNoBlanks (c , extLst )
1200
+ },
1201
+ "containsErrors" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1202
+ return f .extractCondFmtErrors (c , extLst )
1203
+ },
1204
+ "notContainsErrors" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1205
+ return f .extractCondFmtNoErrors (c , extLst )
1206
+ },
1207
+ "colorScale" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1208
+ return f .extractCondFmtColorScale (c , extLst )
1209
+ },
1210
+ "dataBar" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1211
+ return f .extractCondFmtDataBar (c , extLst )
1212
+ },
1213
+ "expression" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1214
+ return f .extractCondFmtExp (c , extLst )
1215
+ },
1216
+ "iconSet" : func (f * File , c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
1217
+ return f .extractCondFmtIconSet (c , extLst )
1218
+ },
1183
1219
}
1184
1220
// validType defined the list of valid validation types.
1185
1221
validType = map [string ]string {
@@ -2713,7 +2749,6 @@ func (f *File) SetConditionalFormat(sheet, rangeRef string, opts []ConditionalFo
2713
2749
rules += len (cf .CfRule )
2714
2750
}
2715
2751
var (
2716
- GUID = fmt .Sprintf ("{00000000-0000-0000-%04X-%012X}" , f .getSheetID (sheet ), rules )
2717
2752
cfRule []* xlsxCfRule
2718
2753
noCriteriaTypes = []string {
2719
2754
"containsBlanks" ,
@@ -2735,7 +2770,8 @@ func (f *File) SetConditionalFormat(sheet, rangeRef string, opts []ConditionalFo
2735
2770
if ok || inStrSlice (noCriteriaTypes , vt , true ) != - 1 {
2736
2771
drawFunc , ok := drawContFmtFunc [vt ]
2737
2772
if ok {
2738
- rule , x14rule := drawFunc (p , ct , strings .Split (rangeRef , ":" )[0 ], GUID , & v )
2773
+ rule , x14rule := drawFunc (p , ct , strings .Split (rangeRef , ":" )[0 ],
2774
+ fmt .Sprintf ("{00000000-0000-0000-%04X-%012X}" , f .getSheetID (sheet ), rules + p ), & v )
2739
2775
if rule == nil {
2740
2776
return ErrParameterInvalid
2741
2777
}
@@ -2813,7 +2849,7 @@ func (f *File) appendCfRule(ws *xlsxWorksheet, rule *xlsxX14CfRule) error {
2813
2849
// extractCondFmtCellIs provides a function to extract conditional format
2814
2850
// settings for cell value (include between, not between, equal, not equal,
2815
2851
// greater than and less than) by given conditional formatting rule.
2816
- func extractCondFmtCellIs (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2852
+ func ( f * File ) extractCondFmtCellIs (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2817
2853
format := ConditionalFormatOptions {StopIfTrue : c .StopIfTrue , Type : "cell" , Criteria : operatorType [c .Operator ]}
2818
2854
if c .DxfID != nil {
2819
2855
format .Format = * c .DxfID
@@ -2828,7 +2864,7 @@ func extractCondFmtCellIs(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOp
2828
2864
2829
2865
// extractCondFmtTimePeriod provides a function to extract conditional format
2830
2866
// settings for time period by given conditional formatting rule.
2831
- func extractCondFmtTimePeriod (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2867
+ func ( f * File ) extractCondFmtTimePeriod (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2832
2868
format := ConditionalFormatOptions {StopIfTrue : c .StopIfTrue , Type : "time_period" , Criteria : operatorType [c .Operator ]}
2833
2869
if c .DxfID != nil {
2834
2870
format .Format = * c .DxfID
@@ -2838,7 +2874,7 @@ func extractCondFmtTimePeriod(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalForm
2838
2874
2839
2875
// extractCondFmtText provides a function to extract conditional format
2840
2876
// settings for text cell values by given conditional formatting rule.
2841
- func extractCondFmtText (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2877
+ func ( f * File ) extractCondFmtText (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2842
2878
format := ConditionalFormatOptions {StopIfTrue : c .StopIfTrue , Type : "text" , Criteria : operatorType [c .Operator ], Value : c .Text }
2843
2879
if c .DxfID != nil {
2844
2880
format .Format = * c .DxfID
@@ -2849,7 +2885,7 @@ func extractCondFmtText(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOpti
2849
2885
// extractCondFmtTop10 provides a function to extract conditional format
2850
2886
// settings for top N (default is top 10) by given conditional formatting
2851
2887
// rule.
2852
- func extractCondFmtTop10 (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2888
+ func ( f * File ) extractCondFmtTop10 (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2853
2889
format := ConditionalFormatOptions {
2854
2890
StopIfTrue : c .StopIfTrue ,
2855
2891
Type : "top" ,
@@ -2869,7 +2905,7 @@ func extractCondFmtTop10(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOpt
2869
2905
// extractCondFmtAboveAverage provides a function to extract conditional format
2870
2906
// settings for above average and below average by given conditional formatting
2871
2907
// rule.
2872
- func extractCondFmtAboveAverage (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2908
+ func ( f * File ) extractCondFmtAboveAverage (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2873
2909
format := ConditionalFormatOptions {
2874
2910
StopIfTrue : c .StopIfTrue ,
2875
2911
Type : "average" ,
@@ -2887,7 +2923,7 @@ func extractCondFmtAboveAverage(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFo
2887
2923
// extractCondFmtDuplicateUniqueValues provides a function to extract
2888
2924
// conditional format settings for duplicate and unique values by given
2889
2925
// conditional formatting rule.
2890
- func extractCondFmtDuplicateUniqueValues (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2926
+ func ( f * File ) extractCondFmtDuplicateUniqueValues (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2891
2927
format := ConditionalFormatOptions {
2892
2928
StopIfTrue : c .StopIfTrue ,
2893
2929
Type : map [string ]string {
@@ -2904,7 +2940,7 @@ func extractCondFmtDuplicateUniqueValues(c *xlsxCfRule, extLst *xlsxExtLst) Cond
2904
2940
2905
2941
// extractCondFmtBlanks provides a function to extract conditional format
2906
2942
// settings for blank cells by given conditional formatting rule.
2907
- func extractCondFmtBlanks (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2943
+ func ( f * File ) extractCondFmtBlanks (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2908
2944
format := ConditionalFormatOptions {
2909
2945
StopIfTrue : c .StopIfTrue ,
2910
2946
Type : "blanks" ,
@@ -2917,7 +2953,7 @@ func extractCondFmtBlanks(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOp
2917
2953
2918
2954
// extractCondFmtNoBlanks provides a function to extract conditional format
2919
2955
// settings for no blank cells by given conditional formatting rule.
2920
- func extractCondFmtNoBlanks (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2956
+ func ( f * File ) extractCondFmtNoBlanks (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2921
2957
format := ConditionalFormatOptions {
2922
2958
StopIfTrue : c .StopIfTrue ,
2923
2959
Type : "no_blanks" ,
@@ -2930,7 +2966,7 @@ func extractCondFmtNoBlanks(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormat
2930
2966
2931
2967
// extractCondFmtErrors provides a function to extract conditional format
2932
2968
// settings for cells with errors by given conditional formatting rule.
2933
- func extractCondFmtErrors (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2969
+ func ( f * File ) extractCondFmtErrors (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2934
2970
format := ConditionalFormatOptions {
2935
2971
StopIfTrue : c .StopIfTrue ,
2936
2972
Type : "errors" ,
@@ -2943,7 +2979,7 @@ func extractCondFmtErrors(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOp
2943
2979
2944
2980
// extractCondFmtNoErrors provides a function to extract conditional format
2945
2981
// settings for cells without errors by given conditional formatting rule.
2946
- func extractCondFmtNoErrors (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2982
+ func ( f * File ) extractCondFmtNoErrors (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2947
2983
format := ConditionalFormatOptions {
2948
2984
StopIfTrue : c .StopIfTrue ,
2949
2985
Type : "no_errors" ,
@@ -2957,7 +2993,7 @@ func extractCondFmtNoErrors(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormat
2957
2993
// extractCondFmtColorScale provides a function to extract conditional format
2958
2994
// settings for color scale (include 2 color scale and 3 color scale) by given
2959
2995
// conditional formatting rule.
2960
- func extractCondFmtColorScale (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2996
+ func ( f * File ) extractCondFmtColorScale (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2961
2997
format := ConditionalFormatOptions {StopIfTrue : c .StopIfTrue }
2962
2998
format .Type , format .Criteria = "2_color_scale" , "="
2963
2999
values := len (c .ColorScale .Cfvo )
@@ -2967,66 +3003,68 @@ func extractCondFmtColorScale(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalForm
2967
3003
if c .ColorScale .Cfvo [0 ].Val != "0" {
2968
3004
format .MinValue = c .ColorScale .Cfvo [0 ].Val
2969
3005
}
2970
- format .MinColor = "#" + strings . TrimPrefix ( strings . ToUpper ( c .ColorScale .Color [0 ]. RGB ), "FF" )
3006
+ format .MinColor = "#" + f . getThemeColor ( c .ColorScale .Color [0 ])
2971
3007
format .MaxType = c .ColorScale .Cfvo [1 ].Type
2972
3008
if c .ColorScale .Cfvo [1 ].Val != "0" {
2973
3009
format .MaxValue = c .ColorScale .Cfvo [1 ].Val
2974
3010
}
2975
- format .MaxColor = "#" + strings . TrimPrefix ( strings . ToUpper ( c .ColorScale .Color [1 ]. RGB ), "FF" )
3011
+ format .MaxColor = "#" + f . getThemeColor ( c .ColorScale .Color [1 ])
2976
3012
}
2977
3013
if colors == 3 {
2978
3014
format .Type = "3_color_scale"
2979
3015
format .MidType = c .ColorScale .Cfvo [1 ].Type
2980
3016
if c .ColorScale .Cfvo [1 ].Val != "0" {
2981
3017
format .MidValue = c .ColorScale .Cfvo [1 ].Val
2982
3018
}
2983
- format .MidColor = "#" + strings . TrimPrefix ( strings . ToUpper ( c .ColorScale .Color [1 ]. RGB ), "FF" )
3019
+ format .MidColor = "#" + f . getThemeColor ( c .ColorScale .Color [1 ])
2984
3020
format .MaxType = c .ColorScale .Cfvo [2 ].Type
2985
3021
if c .ColorScale .Cfvo [2 ].Val != "0" {
2986
3022
format .MaxValue = c .ColorScale .Cfvo [2 ].Val
2987
3023
}
2988
- format .MaxColor = "#" + strings . TrimPrefix ( strings . ToUpper ( c .ColorScale .Color [2 ]. RGB ), "FF" )
3024
+ format .MaxColor = "#" + f . getThemeColor ( c .ColorScale .Color [2 ])
2989
3025
}
2990
3026
return format
2991
3027
}
2992
3028
3029
+ // extractCondFmtDataBarRule provides a function to extract conditional format
3030
+ // settings for data bar by given conditional formatting rule extension list.
3031
+ func (f * File ) extractCondFmtDataBarRule (ID string , format * ConditionalFormatOptions , condFmts []decodeX14ConditionalFormatting ) {
3032
+ for _ , condFmt := range condFmts {
3033
+ for _ , rule := range condFmt .CfRule {
3034
+ if rule .DataBar != nil && rule .ID == ID {
3035
+ format .BarDirection = rule .DataBar .Direction
3036
+ if rule .DataBar .Gradient != nil && ! * rule .DataBar .Gradient {
3037
+ format .BarSolid = true
3038
+ }
3039
+ if rule .DataBar .BorderColor != nil {
3040
+ format .BarBorderColor = "#" + f .getThemeColor (rule .DataBar .BorderColor )
3041
+ }
3042
+ }
3043
+ }
3044
+ }
3045
+ }
3046
+
2993
3047
// extractCondFmtDataBar provides a function to extract conditional format
2994
3048
// settings for data bar by given conditional formatting rule.
2995
- func extractCondFmtDataBar (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
3049
+ func ( f * File ) extractCondFmtDataBar (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
2996
3050
format := ConditionalFormatOptions {Type : "data_bar" , Criteria : "=" }
2997
3051
if c .DataBar != nil {
2998
3052
format .StopIfTrue = c .StopIfTrue
2999
3053
format .MinType = c .DataBar .Cfvo [0 ].Type
3000
3054
format .MinValue = c .DataBar .Cfvo [0 ].Val
3001
3055
format .MaxType = c .DataBar .Cfvo [1 ].Type
3002
3056
format .MaxValue = c .DataBar .Cfvo [1 ].Val
3003
- format .BarColor = "#" + strings . TrimPrefix ( strings . ToUpper ( c .DataBar .Color [0 ]. RGB ), "FF" )
3057
+ format .BarColor = "#" + f . getThemeColor ( c .DataBar .Color [0 ])
3004
3058
if c .DataBar .ShowValue != nil {
3005
3059
format .BarOnly = ! * c .DataBar .ShowValue
3006
3060
}
3007
3061
}
3008
- extractDataBarRule := func (condFmts []decodeX14ConditionalFormatting ) {
3009
- for _ , condFmt := range condFmts {
3010
- for _ , rule := range condFmt .CfRule {
3011
- if rule .DataBar != nil {
3012
- format .BarSolid = ! rule .DataBar .Gradient
3013
- format .BarDirection = rule .DataBar .Direction
3014
- if rule .DataBar .BorderColor != nil {
3015
- format .BarBorderColor = "#" + strings .TrimPrefix (strings .ToUpper (rule .DataBar .BorderColor .RGB ), "FF" )
3016
- }
3017
- }
3018
- }
3019
- }
3020
- }
3021
- extractExtLst := func (extLst * decodeExtLst ) {
3062
+ extractExtLst := func (ID string , extLst * decodeExtLst ) {
3022
3063
for _ , ext := range extLst .Ext {
3023
3064
if ext .URI == ExtURIConditionalFormattings {
3024
- decodeCondFmts := new (decodeX14ConditionalFormattings )
3065
+ decodeCondFmts := new (decodeX14ConditionalFormattingRules )
3025
3066
if err := xml .Unmarshal ([]byte (ext .Content ), & decodeCondFmts ); err == nil {
3026
- var condFmts []decodeX14ConditionalFormatting
3027
- if err = xml .Unmarshal ([]byte (decodeCondFmts .Content ), & condFmts ); err == nil {
3028
- extractDataBarRule (condFmts )
3029
- }
3067
+ f .extractCondFmtDataBarRule (ID , & format , decodeCondFmts .CondFmt )
3030
3068
}
3031
3069
}
3032
3070
}
@@ -3036,7 +3074,7 @@ func extractCondFmtDataBar(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatO
3036
3074
if err := xml .Unmarshal ([]byte (c .ExtLst .Ext ), & ext ); err == nil && extLst != nil {
3037
3075
decodeExtLst := new (decodeExtLst )
3038
3076
if err = xml .Unmarshal ([]byte ("<extLst>" + extLst .Ext + "</extLst>" ), decodeExtLst ); err == nil {
3039
- extractExtLst (decodeExtLst )
3077
+ extractExtLst (ext . ID , decodeExtLst )
3040
3078
}
3041
3079
}
3042
3080
}
@@ -3045,7 +3083,7 @@ func extractCondFmtDataBar(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatO
3045
3083
3046
3084
// extractCondFmtExp provides a function to extract conditional format settings
3047
3085
// for expression by given conditional formatting rule.
3048
- func extractCondFmtExp (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
3086
+ func ( f * File ) extractCondFmtExp (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
3049
3087
format := ConditionalFormatOptions {StopIfTrue : c .StopIfTrue , Type : "formula" }
3050
3088
if c .DxfID != nil {
3051
3089
format .Format = * c .DxfID
@@ -3058,7 +3096,7 @@ func extractCondFmtExp(c *xlsxCfRule, extLst *xlsxExtLst) ConditionalFormatOptio
3058
3096
3059
3097
// extractCondFmtIconSet provides a function to extract conditional format
3060
3098
// settings for icon sets by given conditional formatting rule.
3061
- func extractCondFmtIconSet (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
3099
+ func ( f * File ) extractCondFmtIconSet (c * xlsxCfRule , extLst * xlsxExtLst ) ConditionalFormatOptions {
3062
3100
format := ConditionalFormatOptions {Type : "icon_set" }
3063
3101
if c .IconSet != nil {
3064
3102
if c .IconSet .ShowValue != nil {
@@ -3082,7 +3120,7 @@ func (f *File) GetConditionalFormats(sheet string) (map[string][]ConditionalForm
3082
3120
var opts []ConditionalFormatOptions
3083
3121
for _ , cr := range cf .CfRule {
3084
3122
if extractFunc , ok := extractContFmtFunc [cr .Type ]; ok {
3085
- opts = append (opts , extractFunc (cr , ws .ExtLst ))
3123
+ opts = append (opts , extractFunc (f , cr , ws .ExtLst ))
3086
3124
}
3087
3125
}
3088
3126
conditionalFormats [cf .SQRef ] = opts
0 commit comments