/// <summary> /// Create the 'cfvo'/'color' nodes in the right order. They should appear like this: /// "cfvo" --> Low Value (value object) /// "cfvo" --> Middle Value (value object) /// "cfvo" --> High Value (value object) /// "color" --> Low Value (color) /// "color" --> Middle Value (color) /// "color" --> High Value (color) /// </summary> /// <param name="nodeType"></param> /// <param name="attributePath"></param> /// <param name="attributeValue"></param> private void CreateNodeByOrdem( eExcelConditionalFormattingValueObjectNodeType nodeType, string attributePath, string attributeValue) { // Save the current TopNode XmlNode currentTopNode = TopNode; string nodePath = ExcelConditionalFormattingValueObjectType.GetNodePathByNodeType(nodeType); int nodeOrder = GetNodeOrder(); eNodeInsertOrder nodeInsertOrder = eNodeInsertOrder.SchemaOrder; XmlNode referenceNode = null; if (nodeOrder > 1) { // Find the node just before the one we need to include referenceNode = TopNode.SelectSingleNode( string.Format( "{0}[position()={1}]", // {0} nodePath, // {1} nodeOrder - 1), _worksheet.NameSpaceManager); // Only if the prepend node exists than insert after if (referenceNode != null) { nodeInsertOrder = eNodeInsertOrder.After; } } // Create the node in the right order var node = CreateComplexNode( TopNode, string.Format( "{0}[position()={1}]", // {0} nodePath, // {1} nodeOrder), nodeInsertOrder, referenceNode); // Point to the new node as the temporary TopNode (we need it for the XmlHelper functions) TopNode = node; // Add/Remove the attribute (if the attributeValue is empty then it will be removed) SetXmlNodeString( node, attributePath, attributeValue, true); // Point back to the <cfvo>/<color> parent node TopNode = currentTopNode; }
/// <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) { Require.Argument(address).IsNotNull("address"); Require.Argument(worksheet).IsNotNull("worksheet"); // Save the worksheet for private methods to use _worksheet = worksheet; // Schema order list SchemaNodeOrder = new string[] { ExcelConditionalFormattingConstants.Nodes.Cfvo, }; //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 Exception( ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode); } } RuleType = ruleType; }
/// <summary> /// /// </summary> /// <param name="position"></param> ///<param name="ruleType"></param> /// <param name="topNode"></param> /// <param name="nameSpaceManager"></param> /// <returns></returns> public static XmlNode GetCfvoNodeByPosition( eExcelConditionalFormattingValueObjectPosition position, eExcelConditionalFormattingRuleType ruleType, XmlNode topNode, XmlNamespaceManager nameSpaceManager) { // Get the corresponding <cfvo> node (by the position) var node = topNode.SelectSingleNode( string.Format( "{0}[position()={1}]", // {0} ExcelConditionalFormattingConstants.Paths.Cfvo, // {1} ExcelConditionalFormattingValueObjectType.GetOrderByPosition(position, ruleType)), nameSpaceManager); if (node == null) { throw new Exception( ExcelConditionalFormattingConstants.Errors.MissingCfvoNode); } return(node); }
/****************************************************************************************/ #region Constructors /// <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) { Require.Argument(priority).IsInRange(1, int.MaxValue, "priority"); // 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 Exception( 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 Exception( ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode); } } TopNode = itemElementNode; // Save the attributes RuleType = ruleType; Type = type; Value = value; Formula = formula; }
/****************************************************************************************/ #region Constructors /// <summary> /// Initialize the cfvo (§18.3.1.11) node /// </summary> /// <param name="position"></param> /// <param name="type"></param> /// <param name="color"></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 ExcelConditionalFormattingColorScaleValue( eExcelConditionalFormattingValueObjectPosition position, eExcelConditionalFormattingValueObjectType type, Color color, double value, string formula, eExcelConditionalFormattingRuleType ruleType, ExcelAddress address, int priority, ExcelWorksheet worksheet, XmlNode itemElementNode, XmlNamespaceManager namespaceManager) : base( namespaceManager, itemElementNode) { Require.Argument(priority).IsInRange(1, int.MaxValue, "priority"); Require.Argument(address).IsNotNull("address"); Require.Argument(worksheet).IsNotNull("worksheet"); // Save the worksheet for private methods to use _worksheet = worksheet; // Schema order list SchemaNodeOrder = new string[] { ExcelConditionalFormattingConstants.Nodes.Cfvo, ExcelConditionalFormattingConstants.Nodes.Color }; // 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 Exception( 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 Exception( ExcelConditionalFormattingConstants.Errors.MissingCfvoParentNode); } } // Point to the <cfvo> parent node (<colorScale>, <dataBar> or <iconSet>) // This is different than normal, as TopNode does not point to the node itself but to // its PARENT. Later, in the CreateNodeByOrdem method the TopNode will be updated. TopNode = itemElementNode; // Save the attributes Position = position; RuleType = ruleType; Type = type; Color = color; Value = value; Formula = formula; }
/****************************************************************************************/ #region Methods /// <summary> /// Get the node order (1, 2 ou 3) according to the Position (Low, Middle and High) /// and the Rule Type (TwoColorScale ou ThreeColorScale). /// </summary> /// <returns></returns> private int GetNodeOrder() { return(ExcelConditionalFormattingValueObjectType.GetOrderByPosition( Position, RuleType)); }