|  | /******************************************************************************* | 
|  | * 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		Conditional Formatting            2012-04-03 | 
|  | *******************************************************************************/ | 
|  | using System; | 
|  | using System.Collections.Generic; | 
|  | using System.Linq; | 
|  | using System.Text; | 
|  | using System.Collections; | 
|  | using OfficeOpenXml.Utils; | 
|  | using System.Xml; | 
|  | using OfficeOpenXml.ConditionalFormatting.Contracts; | 
|  | using System.Text.RegularExpressions; | 
|  | using System.Drawing; | 
|  |  | 
|  | namespace OfficeOpenXml.ConditionalFormatting | 
|  | { | 
|  | /// <summary> | 
|  | /// Collection of <see cref="ExcelConditionalFormattingRule"/>. | 
|  | /// This class is providing the API for EPPlus conditional formatting. | 
|  | /// </summary> | 
|  | /// <remarks> | 
|  | /// <para> | 
|  | /// The public methods of this class (Add[...]ConditionalFormatting) will create a ConditionalFormatting/CfRule entry in the worksheet. When this | 
|  | /// Conditional Formatting has been created changes to the properties will affect the workbook immediately. | 
|  | /// </para> | 
|  | /// <para> | 
|  | /// Each type of Conditional Formatting Rule has diferente set of properties. | 
|  | /// </para> | 
|  | /// <code> | 
|  | /// // Add a Three Color Scale conditional formatting | 
|  | /// var cf = worksheet.ConditionalFormatting.AddThreeColorScale(new ExcelAddress("A1:C10")); | 
|  | /// // Set the conditional formatting properties | 
|  | /// cf.LowValue.Type = ExcelConditionalFormattingValueObjectType.Min; | 
|  | /// cf.LowValue.Color = Color.White; | 
|  | /// cf.MiddleValue.Type = ExcelConditionalFormattingValueObjectType.Percent; | 
|  | /// cf.MiddleValue.Value = 50; | 
|  | /// cf.MiddleValue.Color = Color.Blue; | 
|  | /// cf.HighValue.Type = ExcelConditionalFormattingValueObjectType.Max; | 
|  | /// cf.HighValue.Color = Color.Black; | 
|  | /// </code> | 
|  | /// </remarks> | 
|  | public class ExcelConditionalFormattingCollection | 
|  | : XmlHelper, | 
|  | IEnumerable<IExcelConditionalFormattingRule> | 
|  | { | 
|  | /****************************************************************************************/ | 
|  |  | 
|  | #region Private Properties | 
|  | private List<IExcelConditionalFormattingRule> _rules = new List<IExcelConditionalFormattingRule>(); | 
|  | private ExcelWorksheet _worksheet = null; | 
|  | #endregion Private Properties | 
|  |  | 
|  | /****************************************************************************************/ | 
|  |  | 
|  | #region Constructors | 
|  | /// <summary> | 
|  | /// Initialize the <see cref="ExcelConditionalFormattingCollection"/> | 
|  | /// </summary> | 
|  | /// <param name="worksheet"></param> | 
|  | internal ExcelConditionalFormattingCollection( | 
|  | ExcelWorksheet worksheet) | 
|  | : base( | 
|  | worksheet.NameSpaceManager, | 
|  | worksheet.WorksheetXml.DocumentElement) | 
|  | { | 
|  | Require.Argument(worksheet).IsNotNull("worksheet"); | 
|  |  | 
|  | _worksheet = worksheet; | 
|  | SchemaNodeOrder = _worksheet.SchemaNodeOrder; | 
|  |  | 
|  | // Look for all the <conditionalFormatting> | 
|  | var conditionalFormattingNodes = TopNode.SelectNodes( | 
|  | "//" + ExcelConditionalFormattingConstants.Paths.ConditionalFormatting, | 
|  | _worksheet.NameSpaceManager); | 
|  |  | 
|  | // Check if we found at least 1 node | 
|  | if ((conditionalFormattingNodes != null) | 
|  | && (conditionalFormattingNodes.Count > 0)) | 
|  | { | 
|  | // Foreach <conditionalFormatting> | 
|  | foreach (XmlNode conditionalFormattingNode in conditionalFormattingNodes) | 
|  | { | 
|  | // Check if @sqref attribute exists | 
|  | if (conditionalFormattingNode.Attributes[ExcelConditionalFormattingConstants.Attributes.Sqref] == null) | 
|  | { | 
|  | throw new Exception( | 
|  | ExcelConditionalFormattingConstants.Errors.MissingSqrefAttribute); | 
|  | } | 
|  |  | 
|  | // Get the @sqref attribute | 
|  | ExcelAddress address = new ExcelAddress( | 
|  | conditionalFormattingNode.Attributes[ExcelConditionalFormattingConstants.Attributes.Sqref].Value); | 
|  |  | 
|  | // Check for all the <cfRules> nodes and load them | 
|  | var cfRuleNodes = conditionalFormattingNode.SelectNodes( | 
|  | ExcelConditionalFormattingConstants.Paths.CfRule, | 
|  | _worksheet.NameSpaceManager); | 
|  |  | 
|  | // Foreach <cfRule> inside the current <conditionalFormatting> | 
|  | foreach (XmlNode cfRuleNode in cfRuleNodes) | 
|  | { | 
|  | // Check if @type attribute exists | 
|  | if (cfRuleNode.Attributes[ExcelConditionalFormattingConstants.Attributes.Type] == null) | 
|  | { | 
|  | throw new Exception( | 
|  | ExcelConditionalFormattingConstants.Errors.MissingTypeAttribute); | 
|  | } | 
|  |  | 
|  | // Check if @priority attribute exists | 
|  | if (cfRuleNode.Attributes[ExcelConditionalFormattingConstants.Attributes.Priority] == null) | 
|  | { | 
|  | throw new Exception( | 
|  | ExcelConditionalFormattingConstants.Errors.MissingPriorityAttribute); | 
|  | } | 
|  |  | 
|  | // Get the <cfRule> main attributes | 
|  | string typeAttribute = ExcelConditionalFormattingHelper.GetAttributeString( | 
|  | cfRuleNode, | 
|  | ExcelConditionalFormattingConstants.Attributes.Type); | 
|  |  | 
|  | int priority = ExcelConditionalFormattingHelper.GetAttributeInt( | 
|  | cfRuleNode, | 
|  | ExcelConditionalFormattingConstants.Attributes.Priority); | 
|  |  | 
|  | // Transform the @type attribute to EPPlus Rule Type (slighty diferente) | 
|  | var type = ExcelConditionalFormattingRuleType.GetTypeByAttrbiute( | 
|  | typeAttribute, | 
|  | cfRuleNode, | 
|  | _worksheet.NameSpaceManager); | 
|  |  | 
|  | // Create the Rule according to the correct type, address and priority | 
|  | var cfRule = ExcelConditionalFormattingRuleFactory.Create( | 
|  | type, | 
|  | address, | 
|  | priority, | 
|  | _worksheet, | 
|  | cfRuleNode); | 
|  |  | 
|  | // Add the new rule to the list | 
|  | if(cfRule!=null) | 
|  | _rules.Add(cfRule); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | #endregion Constructors | 
|  |  | 
|  | /****************************************************************************************/ | 
|  |  | 
|  | #region Methods | 
|  | /// <summary> | 
|  | /// | 
|  | /// </summary> | 
|  | private void EnsureRootElementExists() | 
|  | { | 
|  | // Find the <worksheet> node | 
|  | if (_worksheet.WorksheetXml.DocumentElement == null) | 
|  | { | 
|  | throw new Exception( | 
|  | ExcelConditionalFormattingConstants.Errors.MissingWorksheetNode); | 
|  | } | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// GetRootNode | 
|  | /// </summary> | 
|  | /// <returns></returns> | 
|  | private XmlNode GetRootNode() | 
|  | { | 
|  | EnsureRootElementExists(); | 
|  | return _worksheet.WorksheetXml.DocumentElement; | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Validates address - not empty (collisions are allowded) | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | private ExcelAddress ValidateAddress( | 
|  | ExcelAddress address) | 
|  | { | 
|  | Require.Argument(address).IsNotNull("address"); | 
|  |  | 
|  | //TODO: Are there any other validation we need to do? | 
|  | return address; | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Get the next priority sequencial number | 
|  | /// </summary> | 
|  | /// <returns></returns> | 
|  | private int GetNextPriority() | 
|  | { | 
|  | // Consider zero as the last priority when we have no CF rules | 
|  | int lastPriority = 0; | 
|  |  | 
|  | // Search for the last priority | 
|  | foreach (var cfRule in _rules) | 
|  | { | 
|  | if (cfRule.Priority > lastPriority) | 
|  | { | 
|  | lastPriority = cfRule.Priority; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Our next priority is the last plus one | 
|  | return lastPriority + 1; | 
|  | } | 
|  | #endregion Methods | 
|  |  | 
|  | /****************************************************************************************/ | 
|  |  | 
|  | #region IEnumerable<IExcelConditionalFormatting> | 
|  | /// <summary> | 
|  | /// Number of validations | 
|  | /// </summary> | 
|  | public int Count | 
|  | { | 
|  | get { return _rules.Count; } | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Index operator, returns by 0-based index | 
|  | /// </summary> | 
|  | /// <param name="index"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingRule this[int index] | 
|  | { | 
|  | get { return _rules[index]; } | 
|  | set { _rules[index] = value; } | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Get the 'cfRule' enumerator | 
|  | /// </summary> | 
|  | /// <returns></returns> | 
|  | IEnumerator<IExcelConditionalFormattingRule> IEnumerable<IExcelConditionalFormattingRule>.GetEnumerator() | 
|  | { | 
|  | return _rules.GetEnumerator(); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Get the 'cfRule' enumerator | 
|  | /// </summary> | 
|  | /// <returns></returns> | 
|  | IEnumerator System.Collections.IEnumerable.GetEnumerator() | 
|  | { | 
|  | return _rules.GetEnumerator(); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Removes all 'cfRule' from the collection and from the XML. | 
|  | /// <remarks> | 
|  | /// This is the same as removing all the 'conditionalFormatting' nodes. | 
|  | /// </remarks> | 
|  | /// </summary> | 
|  | public void RemoveAll() | 
|  | { | 
|  | // Look for all the <conditionalFormatting> nodes | 
|  | var conditionalFormattingNodes = TopNode.SelectNodes( | 
|  | "//" + ExcelConditionalFormattingConstants.Paths.ConditionalFormatting, | 
|  | _worksheet.NameSpaceManager); | 
|  |  | 
|  | // Remove all the <conditionalFormatting> nodes one by one | 
|  | foreach (XmlNode conditionalFormattingNode in conditionalFormattingNodes) | 
|  | { | 
|  | conditionalFormattingNode.ParentNode.RemoveChild(conditionalFormattingNode); | 
|  | } | 
|  |  | 
|  | // Clear the <cfRule> item list | 
|  | _rules.Clear(); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Remove a Conditional Formatting Rule by its object | 
|  | /// </summary> | 
|  | /// <param name="item"></param> | 
|  | public void Remove( | 
|  | IExcelConditionalFormattingRule item) | 
|  | { | 
|  | Require.Argument(item).IsNotNull("item"); | 
|  |  | 
|  | try | 
|  | { | 
|  | // Point to the parent node | 
|  | var oldParentNode = item.Node.ParentNode; | 
|  |  | 
|  | // Remove the <cfRule> from the old <conditionalFormatting> parent node | 
|  | oldParentNode.RemoveChild(item.Node); | 
|  |  | 
|  | // Check if the old <conditionalFormatting> parent node has <cfRule> node inside it | 
|  | if (!oldParentNode.HasChildNodes) | 
|  | { | 
|  | // Remove the old parent node | 
|  | oldParentNode.ParentNode.RemoveChild(oldParentNode); | 
|  | } | 
|  |  | 
|  | _rules.Remove(item); | 
|  | } | 
|  | catch | 
|  | { | 
|  | throw new Exception( | 
|  | ExcelConditionalFormattingConstants.Errors.InvalidRemoveRuleOperation); | 
|  | } | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Remove a Conditional Formatting Rule by its 0-based index | 
|  | /// </summary> | 
|  | /// <param name="index"></param> | 
|  | public void RemoveAt( | 
|  | int index) | 
|  | { | 
|  | Require.Argument(index).IsInRange(0, this.Count - 1, "index"); | 
|  |  | 
|  | Remove(this[index]); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Remove a Conditional Formatting Rule by its priority | 
|  | /// </summary> | 
|  | /// <param name="priority"></param> | 
|  | public void RemoveByPriority( | 
|  | int priority) | 
|  | { | 
|  | try | 
|  | { | 
|  | Remove(RulesByPriority(priority)); | 
|  | } | 
|  | catch | 
|  | { | 
|  | } | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Get a rule by its priority | 
|  | /// </summary> | 
|  | /// <param name="priority"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingRule RulesByPriority( | 
|  | int priority) | 
|  | { | 
|  | return _rules.Find(x => x.Priority == priority); | 
|  | } | 
|  | #endregion IEnumerable<IExcelConditionalFormatting> | 
|  |  | 
|  | /****************************************************************************************/ | 
|  |  | 
|  | #region Conditional Formatting Rules | 
|  | /// <summary> | 
|  | /// Add rule (internal) | 
|  | /// </summary> | 
|  | /// <param name="type"></param> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns>F | 
|  | internal IExcelConditionalFormattingRule AddRule( | 
|  | eExcelConditionalFormattingRuleType type, | 
|  | ExcelAddress address) | 
|  | { | 
|  | Require.Argument(address).IsNotNull("address"); | 
|  |  | 
|  | address = ValidateAddress(address); | 
|  | EnsureRootElementExists(); | 
|  |  | 
|  | // Create the Rule according to the correct type, address and priority | 
|  | IExcelConditionalFormattingRule cfRule = ExcelConditionalFormattingRuleFactory.Create( | 
|  | type, | 
|  | address, | 
|  | GetNextPriority(), | 
|  | _worksheet, | 
|  | null); | 
|  |  | 
|  | // Add the newly created rule to the list | 
|  | _rules.Add(cfRule); | 
|  |  | 
|  | // Return the newly created rule | 
|  | return cfRule; | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add AboveAverage Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingAverageGroup AddAboveAverage( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingAverageGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.AboveAverage, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add AboveOrEqualAverage Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingAverageGroup AddAboveOrEqualAverage( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingAverageGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.AboveOrEqualAverage, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add BelowAverage Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingAverageGroup AddBelowAverage( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingAverageGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.BelowAverage, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add BelowOrEqualAverage Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingAverageGroup AddBelowOrEqualAverage( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingAverageGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.BelowOrEqualAverage, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add AboveStdDev Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingStdDevGroup AddAboveStdDev( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingStdDevGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.AboveStdDev, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add BelowStdDev Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingStdDevGroup AddBelowStdDev( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingStdDevGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.BelowStdDev, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Bottom Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTopBottomGroup AddBottom( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTopBottomGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Bottom, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add BottomPercent Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTopBottomGroup AddBottomPercent( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTopBottomGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.BottomPercent, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Top Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTopBottomGroup AddTop( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTopBottomGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Top, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add TopPercent Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTopBottomGroup AddTopPercent( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTopBottomGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.TopPercent, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Last7Days Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddLast7Days( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Last7Days, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add LastMonth Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddLastMonth( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.LastMonth, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add LastWeek Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddLastWeek( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.LastWeek, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NextMonth Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddNextMonth( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NextMonth, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NextWeek Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddNextWeek( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NextWeek, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ThisMonth Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddThisMonth( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ThisMonth, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ThisWeek Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddThisWeek( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ThisWeek, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Today Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddToday( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Today, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Tomorrow Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddTomorrow( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Tomorrow, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Yesterday Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTimePeriodGroup AddYesterday( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTimePeriodGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Yesterday, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add BeginsWith Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingBeginsWith AddBeginsWith( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingBeginsWith)AddRule( | 
|  | eExcelConditionalFormattingRuleType.BeginsWith, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Between Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingBetween AddBetween( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingBetween)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Between, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ContainsBlanks Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingContainsBlanks AddContainsBlanks( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingContainsBlanks)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ContainsBlanks, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ContainsErrors Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingContainsErrors AddContainsErrors( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingContainsErrors)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ContainsErrors, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ContainsText Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingContainsText AddContainsText( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingContainsText)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ContainsText, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add DuplicateValues Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingDuplicateValues AddDuplicateValues( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingDuplicateValues)AddRule( | 
|  | eExcelConditionalFormattingRuleType.DuplicateValues, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add EndsWith Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingEndsWith AddEndsWith( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingEndsWith)AddRule( | 
|  | eExcelConditionalFormattingRuleType.EndsWith, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Equal Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingEqual AddEqual( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingEqual)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Equal, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Expression Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingExpression AddExpression( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingExpression)AddRule( | 
|  | eExcelConditionalFormattingRuleType.Expression, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add GreaterThan Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingGreaterThan AddGreaterThan( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingGreaterThan)AddRule( | 
|  | eExcelConditionalFormattingRuleType.GreaterThan, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add GreaterThanOrEqual Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingGreaterThanOrEqual AddGreaterThanOrEqual( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingGreaterThanOrEqual)AddRule( | 
|  | eExcelConditionalFormattingRuleType.GreaterThanOrEqual, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add LessThan Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingLessThan AddLessThan( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingLessThan)AddRule( | 
|  | eExcelConditionalFormattingRuleType.LessThan, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add LessThanOrEqual Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingLessThanOrEqual AddLessThanOrEqual( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingLessThanOrEqual)AddRule( | 
|  | eExcelConditionalFormattingRuleType.LessThanOrEqual, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NotBetween Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingNotBetween AddNotBetween( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingNotBetween)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NotBetween, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NotContainsBlanks Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingNotContainsBlanks AddNotContainsBlanks( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingNotContainsBlanks)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NotContainsBlanks, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NotContainsErrors Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingNotContainsErrors AddNotContainsErrors( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingNotContainsErrors)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NotContainsErrors, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NotContainsText Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingNotContainsText AddNotContainsText( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingNotContainsText)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NotContainsText, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add NotEqual Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingNotEqual AddNotEqual( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingNotEqual)AddRule( | 
|  | eExcelConditionalFormattingRuleType.NotEqual, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add Unique Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingUniqueValues AddUniqueValues( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingUniqueValues)AddRule( | 
|  | eExcelConditionalFormattingRuleType.UniqueValues, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ThreeColorScale Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingThreeColorScale AddThreeColorScale( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingThreeColorScale)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ThreeColorScale, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add TwoColorScale Rule | 
|  | /// </summary> | 
|  | /// <param name="address"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingTwoColorScale AddTwoColorScale( | 
|  | ExcelAddress address) | 
|  | { | 
|  | return (IExcelConditionalFormattingTwoColorScale)AddRule( | 
|  | eExcelConditionalFormattingRuleType.TwoColorScale, | 
|  | address); | 
|  | } | 
|  |  | 
|  | /// <summary> | 
|  | /// Add ThreeIconSet Rule | 
|  | /// </summary> | 
|  | /// <param name="Address">The address</param> | 
|  | /// <param name="IconSet">Type of iconset</param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType> AddThreeIconSet(ExcelAddress Address, eExcelconditionalFormatting3IconsSetType IconSet) | 
|  | { | 
|  | var icon = (IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType>)AddRule( | 
|  | eExcelConditionalFormattingRuleType.ThreeIconSet, | 
|  | Address); | 
|  | icon.IconSet = IconSet; | 
|  | return icon; | 
|  | } | 
|  | /// <summary> | 
|  | /// Adds a FourIconSet rule | 
|  | /// </summary> | 
|  | /// <param name="Address"></param> | 
|  | /// <param name="IconSet"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType> AddFourIconSet(ExcelAddress Address, eExcelconditionalFormatting4IconsSetType IconSet) | 
|  | { | 
|  | var icon = (IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType>)AddRule( | 
|  | eExcelConditionalFormattingRuleType.FourIconSet, | 
|  | Address); | 
|  | icon.IconSet = IconSet; | 
|  | return icon; | 
|  | } | 
|  | /// <summary> | 
|  | /// Adds a FiveIconSet rule | 
|  | /// </summary> | 
|  | /// <param name="Address"></param> | 
|  | /// <param name="IconSet"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingFiveIconSet AddFiveIconSet(ExcelAddress Address, eExcelconditionalFormatting5IconsSetType IconSet) | 
|  | { | 
|  | var icon = (IExcelConditionalFormattingFiveIconSet)AddRule( | 
|  | eExcelConditionalFormattingRuleType.FiveIconSet, | 
|  | Address); | 
|  | icon.IconSet = IconSet; | 
|  | return icon; | 
|  | } | 
|  | /// <summary> | 
|  | /// Adds a databar rule | 
|  | /// </summary> | 
|  | /// <param name="Address"></param> | 
|  | /// <param name="color"></param> | 
|  | /// <returns></returns> | 
|  | public IExcelConditionalFormattingDataBarGroup AddDatabar(ExcelAddress Address, Color color) | 
|  | { | 
|  | var dataBar = (IExcelConditionalFormattingDataBarGroup)AddRule( | 
|  | eExcelConditionalFormattingRuleType.DataBar, | 
|  | Address); | 
|  | dataBar.Color=color; | 
|  | return dataBar; | 
|  | } | 
|  | #endregion Conditional Formatting Rules | 
|  |  | 
|  | } | 
|  | } |