| /******************************************************************************* |
| * You may amend and distribute as you like, but don't remove this header! |
| * |
| * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. |
| * See http://www.codeplex.com/EPPlus for details. |
| * |
| * Copyright (C) 2011 Jan Källman |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See the GNU Lesser General Public License for more details. |
| * |
| * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php |
| * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html |
| * |
| * All code and executables are provided "as is" with no warranty either express or implied. |
| * The author accepts no liability for any damage or loss of business that this product may cause. |
| * |
| * Code change notes: |
| * |
| * Author Change Date |
| * ****************************************************************************** |
| * Eyal Seagull Added 2012-04-03 |
| *******************************************************************************/ |
| |
| using System; |
| using System.Collections.Immutable; |
| using System.Drawing; |
| using System.Globalization; |
| using System.Xml; |
| |
| namespace AppsheetEpplus; |
| |
| /// <summary> |
| /// 18.3.1.11 cfvo (Conditional Format Value Object) |
| /// Describes the values of the interpolation points in a gradient scale. |
| /// </summary> |
| public class ExcelConditionalFormattingIconDataBarValue : XmlHelper { |
| private eExcelConditionalFormattingRuleType _ruleType; |
| private readonly ExcelWorksheet _worksheet; |
| |
| /// <summary> |
| /// Initialize the cfvo (§18.3.1.11) node |
| /// </summary> |
| /// <param name="type"></param> |
| /// <param name="value"></param> |
| /// <param name="formula"></param> |
| /// <param name="ruleType"></param> |
| /// <param name="address"></param> |
| /// <param name="priority"></param> |
| /// <param name="worksheet"></param> |
| /// <param name="itemElementNode">The cfvo (§18.3.1.11) node parent. Can be any of the following: |
| /// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)</param> |
| /// <param name="namespaceManager"></param> |
| internal ExcelConditionalFormattingIconDataBarValue( |
| eExcelConditionalFormattingValueObjectType type, |
| double value, |
| string formula, |
| eExcelConditionalFormattingRuleType ruleType, |
| ExcelAddress address, |
| int priority, |
| ExcelWorksheet worksheet, |
| XmlNode itemElementNode, |
| XmlNamespaceManager namespaceManager) |
| : this(ruleType, address, worksheet, itemElementNode, namespaceManager) { |
| ArgumentOutOfRangeException.ThrowIfLessThan(priority, 1); |
| |
| // Check if the parent does not exists |
| if (itemElementNode == null) { |
| // Get the parent node path by the rule type |
| string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType( |
| ruleType); |
| |
| // Check for en error (rule type does not have <cfvo>) |
| if (parentNodePath == string.Empty) { |
| throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode); |
| } |
| |
| // Point to the <cfvo> parent node |
| itemElementNode = _worksheet.WorksheetXml.SelectSingleNode( |
| string.Format( |
| "//{0}[{1}='{2}']/{3}[{4}='{5}']/{6}", |
| // {0} |
| ExcelConditionalFormattingConstants.Paths._conditionalFormatting, |
| // {1} |
| ExcelConditionalFormattingConstants.Paths._sqrefAttribute, |
| // {2} |
| address.Address, |
| // {3} |
| ExcelConditionalFormattingConstants.Paths._cfRule, |
| // {4} |
| ExcelConditionalFormattingConstants.Paths._priorityAttribute, |
| // {5} |
| priority, |
| // {6} |
| parentNodePath), |
| _worksheet.NameSpaceManager); |
| |
| // Check for en error (rule type does not have <cfvo>) |
| if (itemElementNode == null) { |
| throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode); |
| } |
| } |
| |
| TopNode = itemElementNode; |
| |
| // Save the attributes |
| RuleType = ruleType; |
| Type = type; |
| Value = value; |
| Formula = formula; |
| } |
| |
| protected override ImmutableArray<string> SchemaNodeOrder { get; } = [ |
| ExcelConditionalFormattingConstants.Nodes._cfvo, |
| ]; |
| |
| /// <summary> |
| /// Initialize the cfvo (§18.3.1.11) node |
| /// </summary> |
| /// <param name="ruleType"></param> |
| /// <param name="address"></param> |
| /// <param name="worksheet"></param> |
| /// <param name="itemElementNode">The cfvo (§18.3.1.11) node parent. Can be any of the following: |
| /// colorScale (§18.3.1.16); dataBar (§18.3.1.28); iconSet (§18.3.1.49)</param> |
| /// <param name="namespaceManager"></param> |
| internal ExcelConditionalFormattingIconDataBarValue( |
| eExcelConditionalFormattingRuleType ruleType, |
| ExcelAddress address, |
| ExcelWorksheet worksheet, |
| XmlNode itemElementNode, |
| XmlNamespaceManager namespaceManager) |
| : base(namespaceManager, itemElementNode) { |
| ArgumentNullException.ThrowIfNull(address); |
| ArgumentNullException.ThrowIfNull(worksheet); |
| |
| // Save the worksheet for private methods to use |
| _worksheet = worksheet; |
| |
| //Check if the parent does not exists |
| if (itemElementNode == null) { |
| // Get the parent node path by the rule type |
| string parentNodePath = ExcelConditionalFormattingValueObjectType.GetParentPathByRuleType( |
| ruleType); |
| |
| // Check for en error (rule type does not have <cfvo>) |
| if (parentNodePath == string.Empty) { |
| throw new(ExcelConditionalFormattingConstants.Errors._missingCfvoParentNode); |
| } |
| } |
| RuleType = ruleType; |
| } |
| |
| /// <summary> |
| /// Initialize the <see cref="ExcelConditionalFormattingColorScaleValue"/> |
| /// </summary> |
| /// <param name="type"></param> |
| /// <param name="value"></param> |
| /// <param name="formula"></param> |
| /// <param name="ruleType"></param> |
| /// <param name="priority"></param> |
| /// <param name="address"></param> |
| /// <param name="worksheet"></param> |
| /// <param name="namespaceManager"></param> |
| internal ExcelConditionalFormattingIconDataBarValue( |
| eExcelConditionalFormattingValueObjectType type, |
| double value, |
| string formula, |
| eExcelConditionalFormattingRuleType ruleType, |
| ExcelAddress address, |
| int priority, |
| ExcelWorksheet worksheet, |
| XmlNamespaceManager namespaceManager) |
| : this( |
| type, |
| value, |
| formula, |
| ruleType, |
| address, |
| priority, |
| worksheet, |
| null, |
| namespaceManager) {} |
| |
| /// <summary> |
| /// Initialize the <see cref="ExcelConditionalFormattingColorScaleValue"/> |
| /// </summary> |
| /// <param name="type"></param> |
| /// <param name="color"></param> |
| /// <param name="ruleType"></param> |
| /// <param name="priority"></param> |
| /// <param name="address"></param> |
| /// <param name="worksheet"></param> |
| /// <param name="namespaceManager"></param> |
| internal ExcelConditionalFormattingIconDataBarValue( |
| eExcelConditionalFormattingValueObjectType type, |
| Color color, |
| eExcelConditionalFormattingRuleType ruleType, |
| ExcelAddress address, |
| int priority, |
| ExcelWorksheet worksheet, |
| XmlNamespaceManager namespaceManager) |
| : this(type, 0, null, ruleType, address, priority, worksheet, null, namespaceManager) {} |
| |
| /// <summary> |
| /// |
| /// </summary> |
| internal eExcelConditionalFormattingRuleType RuleType { |
| get => _ruleType; |
| set => _ruleType = value; |
| } |
| |
| /// <summary> |
| /// |
| /// </summary> |
| public eExcelConditionalFormattingValueObjectType Type { |
| get { |
| var typeAttribute = GetXmlNodeString( |
| ExcelConditionalFormattingConstants.Paths._typeAttribute); |
| |
| return ExcelConditionalFormattingValueObjectType.GetTypeByAttrbiute(typeAttribute); |
| } |
| set { |
| if ((_ruleType == eExcelConditionalFormattingRuleType.ThreeIconSet |
| || _ruleType == eExcelConditionalFormattingRuleType.FourIconSet |
| || _ruleType == eExcelConditionalFormattingRuleType.FiveIconSet) |
| && (value == eExcelConditionalFormattingValueObjectType.Min |
| || value == eExcelConditionalFormattingValueObjectType.Max)) { |
| throw (new ArgumentException("Value type can't be Min or Max for icon sets")); |
| } |
| SetXmlNodeString( |
| ExcelConditionalFormattingConstants.Paths._typeAttribute, |
| value.ToString().ToLower(CultureInfo.InvariantCulture)); |
| } |
| } |
| |
| /// <summary> |
| /// Get/Set the 'cfvo' node @val attribute |
| /// </summary> |
| public Double Value { |
| get { |
| if ((Type == eExcelConditionalFormattingValueObjectType.Num) |
| || (Type == eExcelConditionalFormattingValueObjectType.Percent) |
| || (Type == eExcelConditionalFormattingValueObjectType.Percentile)) { |
| return GetXmlNodeDouble(ExcelConditionalFormattingConstants.Paths._valAttribute); |
| } |
| return 0; |
| } |
| set { |
| string valueToStore = string.Empty; |
| |
| // Only some types use the @val attribute |
| if ((Type == eExcelConditionalFormattingValueObjectType.Num) |
| || (Type == eExcelConditionalFormattingValueObjectType.Percent) |
| || (Type == eExcelConditionalFormattingValueObjectType.Percentile)) { |
| valueToStore = value.ToString(CultureInfo.InvariantCulture); |
| } |
| |
| SetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute, valueToStore); |
| } |
| } |
| |
| /// <summary> |
| /// Get/Set the Formula of the Object Value (uses the same attribute as the Value) |
| /// </summary> |
| public string Formula { |
| get { |
| // Return empty if the Object Value type is not Formula |
| if (Type != eExcelConditionalFormattingValueObjectType.Formula) { |
| return string.Empty; |
| } |
| |
| // Excel stores the formula in the @val attribute |
| return GetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute); |
| } |
| set { |
| // Only store the formula if the Object Value type is Formula |
| if (Type == eExcelConditionalFormattingValueObjectType.Formula) { |
| SetXmlNodeString(ExcelConditionalFormattingConstants.Paths._valAttribute, value); |
| } |
| } |
| } |
| } |