| /******************************************************************************* | |
| * 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); | |
| } | |
| } | |
| } | |
| } |