diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj index a4b4662..4682fba 100644 --- a/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML.csproj @@ -90,6 +90,7 @@ + diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs index b47d0e7..f0551fb 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; namespace ClosedXML.Excel { @@ -18,6 +15,7 @@ ThisMonth, NextMonth } + public enum XLIconSetStyle { ThreeArrows, @@ -38,6 +36,7 @@ FiveRating, FiveQuarters } + public enum XLConditionalFormatType { Expression, @@ -59,47 +58,79 @@ TimePeriod, AboveAverage } + public enum XLCFOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween, Contains, NotContains, StartsWith, EndsWith } + public interface IXLConditionalFormat { IXLStyle Style { get; set; } IXLStyle WhenIsBlank(); + IXLStyle WhenNotBlank(); + IXLStyle WhenIsError(); + IXLStyle WhenNotError(); + IXLStyle WhenDateIs(XLTimePeriod timePeriod); + IXLStyle WhenContains(String value); + IXLStyle WhenNotContains(String value); + IXLStyle WhenStartsWith(String value); + IXLStyle WhenEndsWith(String value); + IXLStyle WhenEquals(String value); + IXLStyle WhenNotEquals(String value); + IXLStyle WhenGreaterThan(String value); + IXLStyle WhenLessThan(String value); + IXLStyle WhenEqualOrGreaterThan(String value); + IXLStyle WhenEqualOrLessThan(String value); + IXLStyle WhenBetween(String minValue, String maxValue); + IXLStyle WhenNotBetween(String minValue, String maxValue); IXLStyle WhenEquals(Double value); + IXLStyle WhenNotEquals(Double value); + IXLStyle WhenGreaterThan(Double value); + IXLStyle WhenLessThan(Double value); + IXLStyle WhenEqualOrGreaterThan(Double value); + IXLStyle WhenEqualOrLessThan(Double value); + IXLStyle WhenBetween(Double minValue, Double maxValue); + IXLStyle WhenNotBetween(Double minValue, Double maxValue); IXLStyle WhenIsDuplicate(); + IXLStyle WhenIsUnique(); + IXLStyle WhenIsTrue(String formula); + IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items); + IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType); IXLCFColorScaleMin ColorScale(); + IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false); + IXLCFDataBarMin DataBar(XLColor positiveColor, XLColor negativeColor, Boolean showBarOnly = false); + IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false); XLConditionalFormatType ConditionalFormatType { get; } @@ -116,10 +147,9 @@ XLDictionary IconSetOperators { get; } XLCFOperator Operator { get; } - Boolean Bottom { get; } + Boolean Bottom { get; } Boolean Percent { get; } IXLConditionalFormat StopIfTrue(bool value = true); - } } diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs index d00f871..83acea3 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs @@ -7,7 +7,12 @@ { public static ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority) { - return new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority, StopIfTrue = OpenXmlHelper.GetBooleanValue(((XLConditionalFormat)cf).StopIfTrueInternal, false) }; + return new ConditionalFormattingRule + { + Type = cf.ConditionalFormatType.ToOpenXml(), + Priority = priority, + StopIfTrue = OpenXmlHelper.GetBooleanValue(((XLConditionalFormat)cf).StopIfTrueInternal, false) + }; } } -} \ No newline at end of file +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs index 2186baf..06f9a6e 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs @@ -28,11 +28,22 @@ Converters.Add(XLConditionalFormatType.Top10, new XLCFTopConverter()); Converters.Add(XLConditionalFormatType.DataBar, new XLCFDataBarConverter()); Converters.Add(XLConditionalFormatType.IconSet, new XLCFIconSetConverter()); + Converters.Add(XLConditionalFormatType.TimePeriod, new XLCFDatesOccurringConverter()); + + foreach (var cft in Enum.GetValues(typeof(XLConditionalFormatType)).Cast()) + { + if (!Converters.ContainsKey(cft)) + Converters.Add(cft, null); + } } public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, Int32 priority, XLWorkbook.SaveContext context) { - return Converters[conditionalFormat.ConditionalFormatType].Convert(conditionalFormat, priority, context); + var converter = Converters[conditionalFormat.ConditionalFormatType]; + if (converter == null) + throw new NotImplementedException(string.Format("Conditional formatting rule '{0}' hasn't been implemented", conditionalFormat.ConditionalFormatType)); + + return converter.Convert(conditionalFormat, priority, context); } } } diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs new file mode 100644 index 0000000..24e1129 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs @@ -0,0 +1,40 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCFDatesOccurringConverter : IXLCFConverter + { + private static readonly IDictionary formulaTemplates = new Dictionary() + { + [XLTimePeriod.Today] = "FLOOR({0},1)=TODAY()", + [XLTimePeriod.Yesterday] = "FLOOR({0},1)=TODAY()-1", + [XLTimePeriod.Tomorrow] = "FLOOR({0},1)=TODAY()+1", + [XLTimePeriod.InTheLast7Days] = "AND(TODAY()-FLOOR({0},1)<=6,FLOOR({0},1)<=TODAY())", + [XLTimePeriod.ThisMonth] = "AND(MONTH({0})=MONTH(TODAY()),YEAR({0})=YEAR(TODAY()))", + [XLTimePeriod.LastMonth] = "AND(MONTH({0})=MONTH(EDATE(TODAY(),0-1)),YEAR({0})=YEAR(EDATE(TODAY(),0-1)))", + [XLTimePeriod.NextMonth] = "AND(MONTH({0})=MONTH(EDATE(TODAY(),0+1)),YEAR({0})=YEAR(EDATE(TODAY(),0+1)))", + [XLTimePeriod.ThisWeek] = "AND(TODAY()-ROUNDDOWN({0},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN({0},0)-TODAY()<=7-WEEKDAY(TODAY()))", + [XLTimePeriod.LastWeek] = "AND(TODAY()-ROUNDDOWN({0},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN({0},0)-TODAY()<=7-WEEKDAY(TODAY()))", + [XLTimePeriod.NextWeek] = "AND(ROUNDDOWN({0},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN({0},0)-TODAY()<(15-WEEKDAY(TODAY())))" + }; + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + + if (!cf.Style.Equals(XLWorkbook.DefaultStyle)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style]; + + conditionalFormattingRule.TimePeriod = cf.TimePeriod.ToOpenXml(); + + var address = cf.Range.RangeAddress.FirstAddress.ToStringRelative(false); + var formula = new Formula { Text = String.Format(formulaTemplates[cf.TimePeriod], address) }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/EnumConverter.cs b/ClosedXML/Excel/EnumConverter.cs index 5b8ea92..af5ebe8 100644 --- a/ClosedXML/Excel/EnumConverter.cs +++ b/ClosedXML/Excel/EnumConverter.cs @@ -30,12 +30,8 @@ case XLFontUnderlineValues.SingleAccounting: return UnderlineValues.SingleAccounting; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -52,12 +48,8 @@ case XLPageOrientation.Portrait: return OrientationValues.Portrait; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -74,12 +66,8 @@ case XLFontVerticalTextAlignmentValues.Superscript: return VerticalAlignmentRunValues.Superscript; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -144,12 +132,8 @@ case XLFillPatternValues.Solid: return PatternValues.Solid; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -199,12 +183,8 @@ case XLBorderStyleValues.Thin: return BorderStyleValues.Thin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -236,12 +216,8 @@ case XLAlignmentHorizontalValues.Right: return HorizontalAlignmentValues.Right; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -264,12 +240,8 @@ case XLAlignmentVerticalValues.Top: return VerticalAlignmentValues.Top; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -283,12 +255,8 @@ case XLPageOrderValues.OverThenDown: return PageOrderValues.OverThenDown; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -305,12 +273,8 @@ case XLShowCommentsValues.None: return CellCommentsValues.None; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -330,12 +294,8 @@ case XLPrintErrorValues.NA: return PrintErrorValues.NA; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -352,12 +312,8 @@ case XLCalculateMode.Manual: return CalculateModeValues.Manual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -371,12 +327,8 @@ case XLReferenceStyle.A1: return ReferenceModeValues.A1; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -393,12 +345,8 @@ case XLAlignmentReadingOrderValues.RightToLeft: return 2; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -436,12 +384,8 @@ case XLTotalsRowFunction.Custom: return TotalsRowFunctionValues.Custom; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -473,12 +417,8 @@ case XLAllowedValues.WholeNumber: return DataValidationValues.Whole; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -495,12 +435,8 @@ case XLErrorStyle.Stop: return DataValidationErrorStyleValues.Stop; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -532,12 +468,8 @@ case XLOperator.NotEqualTo: return DataValidationOperatorValues.NotEqual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -554,12 +486,8 @@ case XLWorksheetVisibility.VeryHidden: return SheetStateValues.VeryHidden; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -579,12 +507,8 @@ case XLPhoneticAlignment.NoControl: return PhoneticAlignmentValues.NoControl; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -604,12 +528,8 @@ case XLPhoneticType.NoConversion: return PhoneticValues.NoConversion; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -629,12 +549,8 @@ case XLPivotSummary.Variance: return DataConsolidateFunctionValues.Variance; case XLPivotSummary.PopulationVariance: return DataConsolidateFunctionValues.VarianceP; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -652,12 +568,8 @@ case XLPivotCalculation.PercentageOfTotal: return ShowDataAsValues.PercentOfTotal; case XLPivotCalculation.Index: return ShowDataAsValues.Index; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -672,12 +584,8 @@ case XLFilterOperator.LessThan: return FilterOperatorValues.LessThan; case XLFilterOperator.EqualOrLessThan: return FilterOperatorValues.LessThanOrEqual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -688,12 +596,8 @@ case XLFilterDynamicType.AboveAverage: return DynamicFilterValues.AboveAverage; case XLFilterDynamicType.BelowAverage: return DynamicFilterValues.BelowAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -705,12 +609,8 @@ case XLSheetViewOptions.PageBreakPreview: return SheetViewValues.PageBreakPreview; case XLSheetViewOptions.PageLayout: return SheetViewValues.PageLayout; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -724,12 +624,8 @@ case XLLineStyle.ThinThick: return Vml.StrokeLineStyleValues.ThinThick; case XLLineStyle.ThinThin: return Vml.StrokeLineStyleValues.ThinThin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -756,12 +652,8 @@ case XLConditionalFormatType.TimePeriod: return ConditionalFormatValues.TimePeriod; case XLConditionalFormatType.AboveAverage: return ConditionalFormatValues.AboveAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -776,12 +668,8 @@ case XLCFContentType.Formula: return ConditionalFormatValueObjectValues.Formula; case XLCFContentType.Percentile: return ConditionalFormatValueObjectValues.Percentile; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -802,12 +690,8 @@ case XLCFOperator.StartsWith: return ConditionalFormattingOperatorValues.BeginsWith; case XLCFOperator.EndsWith: return ConditionalFormattingOperatorValues.EndsWith; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -833,12 +717,28 @@ case XLIconSetStyle.FiveRating: return IconSetValues.FiveRating; case XLIconSetStyle.FiveQuarters: return IconSetValues.FiveQuarters; - #region default - default: throw new ArgumentOutOfRangeException("Not implemented value!"); + } + } - #endregion default + public static TimePeriodValues ToOpenXml(this XLTimePeriod value) + { + switch (value) + { + case XLTimePeriod.Yesterday: return TimePeriodValues.Yesterday; + case XLTimePeriod.Today: return TimePeriodValues.Today; + case XLTimePeriod.Tomorrow: return TimePeriodValues.Tomorrow; + case XLTimePeriod.InTheLast7Days: return TimePeriodValues.Last7Days; + case XLTimePeriod.LastWeek: return TimePeriodValues.LastWeek; + case XLTimePeriod.ThisWeek: return TimePeriodValues.ThisWeek; + case XLTimePeriod.NextWeek: return TimePeriodValues.NextWeek; + case XLTimePeriod.LastMonth: return TimePeriodValues.LastMonth; + case XLTimePeriod.ThisMonth: return TimePeriodValues.ThisMonth; + case XLTimePeriod.NextMonth: return TimePeriodValues.NextMonth; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -853,10 +753,13 @@ { case XLPicturePlacement.FreeFloating: return Xdr.EditAsValues.Absolute; + case XLPicturePlacement.Move: return Xdr.EditAsValues.OneCell; + case XLPicturePlacement.MoveAndSize: return Xdr.EditAsValues.TwoCell; + default: throw new ArgumentOutOfRangeException("Not implemented value!"); } @@ -885,12 +788,8 @@ case UnderlineValues.SingleAccounting: return XLFontUnderlineValues.SingleAccounting; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -907,12 +806,8 @@ case OrientationValues.Portrait: return XLPageOrientation.Portrait; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -929,12 +824,8 @@ case VerticalAlignmentRunValues.Superscript: return XLFontVerticalTextAlignmentValues.Superscript; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -999,12 +890,8 @@ case PatternValues.Solid: return XLFillPatternValues.Solid; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1054,12 +941,8 @@ case BorderStyleValues.Thin: return XLBorderStyleValues.Thin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1091,12 +974,8 @@ case HorizontalAlignmentValues.Right: return XLAlignmentHorizontalValues.Right; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1119,12 +998,8 @@ case VerticalAlignmentValues.Top: return XLAlignmentVerticalValues.Top; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1138,12 +1013,8 @@ case PageOrderValues.OverThenDown: return XLPageOrderValues.OverThenDown; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1160,12 +1031,8 @@ case CellCommentsValues.None: return XLShowCommentsValues.None; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1185,12 +1052,8 @@ case PrintErrorValues.NA: return XLPrintErrorValues.NA; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1207,12 +1070,8 @@ case CalculateModeValues.Manual: return XLCalculateMode.Manual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1226,12 +1085,8 @@ case ReferenceModeValues.A1: return XLReferenceStyle.A1; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1248,12 +1103,8 @@ case 2: return XLAlignmentReadingOrderValues.RightToLeft; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1291,12 +1142,8 @@ case TotalsRowFunctionValues.Custom: return XLTotalsRowFunction.Custom; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1328,12 +1175,8 @@ case DataValidationValues.Whole: return XLAllowedValues.WholeNumber; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1350,12 +1193,8 @@ case DataValidationErrorStyleValues.Stop: return XLErrorStyle.Stop; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1387,12 +1226,8 @@ case DataValidationOperatorValues.NotEqual: return XLOperator.NotEqualTo; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1409,12 +1244,8 @@ case SheetStateValues.VeryHidden: return XLWorksheetVisibility.VeryHidden; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1434,12 +1265,8 @@ case PhoneticAlignmentValues.NoControl: return XLPhoneticAlignment.NoControl; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1457,12 +1284,8 @@ case PhoneticValues.NoConversion: return XLPhoneticType.NoConversion; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1482,12 +1305,8 @@ case DataConsolidateFunctionValues.Variance: return XLPivotSummary.Variance; case DataConsolidateFunctionValues.VarianceP: return XLPivotSummary.PopulationVariance; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1505,12 +1324,8 @@ case ShowDataAsValues.PercentOfTotal: return XLPivotCalculation.PercentageOfTotal; case ShowDataAsValues.Index: return XLPivotCalculation.Index; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1525,12 +1340,8 @@ case FilterOperatorValues.GreaterThanOrEqual: return XLFilterOperator.EqualOrGreaterThan; case FilterOperatorValues.LessThanOrEqual: return XLFilterOperator.EqualOrLessThan; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1541,12 +1352,8 @@ case DynamicFilterValues.AboveAverage: return XLFilterDynamicType.AboveAverage; case DynamicFilterValues.BelowAverage: return XLFilterDynamicType.BelowAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1558,12 +1365,8 @@ case SheetViewValues.PageBreakPreview: return XLSheetViewOptions.PageBreakPreview; case SheetViewValues.PageLayout: return XLSheetViewOptions.PageLayout; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1577,12 +1380,8 @@ case Vml.StrokeLineStyleValues.ThinThick: return XLLineStyle.ThinThick; case Vml.StrokeLineStyleValues.ThinThin: return XLLineStyle.ThinThin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1609,12 +1408,8 @@ case ConditionalFormatValues.TimePeriod: return XLConditionalFormatType.TimePeriod; case ConditionalFormatValues.AboveAverage: return XLConditionalFormatType.AboveAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1629,12 +1424,8 @@ case ConditionalFormatValueObjectValues.Formula: return XLCFContentType.Formula; case ConditionalFormatValueObjectValues.Percentile: return XLCFContentType.Percentile; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1655,12 +1446,8 @@ case ConditionalFormattingOperatorValues.BeginsWith: return XLCFOperator.StartsWith; case ConditionalFormattingOperatorValues.EndsWith: return XLCFOperator.EndsWith; - #region default - default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1686,12 +1473,28 @@ case IconSetValues.FiveRating: return XLIconSetStyle.FiveRating; case IconSetValues.FiveQuarters: return XLIconSetStyle.FiveQuarters; - #region default + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLTimePeriod ToClosedXml(this TimePeriodValues value) + { + switch (value) + { + case TimePeriodValues.Yesterday: return XLTimePeriod.Yesterday; + case TimePeriodValues.Today: return XLTimePeriod.Today; + case TimePeriodValues.Tomorrow: return XLTimePeriod.Tomorrow; + case TimePeriodValues.Last7Days: return XLTimePeriod.InTheLast7Days; + case TimePeriodValues.LastWeek: return XLTimePeriod.LastWeek; + case TimePeriodValues.ThisWeek: return XLTimePeriod.ThisWeek; + case TimePeriodValues.NextWeek: return XLTimePeriod.NextWeek; + case TimePeriodValues.LastMonth: return XLTimePeriod.LastMonth; + case TimePeriodValues.ThisMonth: return XLTimePeriod.ThisMonth; + case TimePeriodValues.NextMonth: return XLTimePeriod.NextMonth; default: - throw new ApplicationException("Not implemented value!"); - - #endregion default + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } @@ -1706,12 +1509,15 @@ { case Xdr.EditAsValues.Absolute: return XLPicturePlacement.FreeFloating; + case Xdr.EditAsValues.OneCell: return XLPicturePlacement.Move; + case Xdr.EditAsValues.TwoCell: return XLPicturePlacement.MoveAndSize; + default: - throw new ArgumentOutOfRangeException(); + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); } } diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 307f878..f47f720 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -2061,6 +2061,13 @@ if (fr.Rank != null) conditionalFormat.Values.Add(GetFormula(fr.Rank.Value.ToString())); } + else if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.TimePeriod) + { + if (fr.TimePeriod != null) + conditionalFormat.TimePeriod = fr.TimePeriod.Value.ToClosedXml(); + else + conditionalFormat.TimePeriod = XLTimePeriod.Yesterday; + } if (fr.Elements().Any()) { diff --git a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs index 769afa2..d845942 100644 --- a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs +++ b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs @@ -542,7 +542,7 @@ .LowestValue() .HighestValue(); - ws.Cell(1,3).SetValue(-20) + ws.Cell(1, 3).SetValue(-20) .CellBelow().SetValue(40) .CellBelow().SetValue(-60) .CellBelow().SetValue(30); @@ -678,7 +678,6 @@ ws.RangeUsed().AddConditionalFormat().StopIfTrue().WhenGreaterThan(5); - ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) @@ -687,4 +686,36 @@ workbook.SaveAs(filePath); } } + + public class CFDatesOccurring : IXLExample + { + public void Create(String filePath) + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet("Sheet1"); + + using (var range = ws.Range("A1:A10")) + { + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.Tomorrow) + .Fill.SetBackgroundColor(XLColor.GrannySmithApple); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.Yesterday) + .Fill.SetBackgroundColor(XLColor.Orange); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.InTheLast7Days) + .Fill.SetBackgroundColor(XLColor.Blue); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.ThisMonth) + .Fill.SetBackgroundColor(XLColor.Red); + } + + workbook.SaveAs(filePath); + } + } + } } diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index b559252..cf2d274 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -302,6 +302,7 @@ + diff --git a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs index 333c347..2d010eb 100644 --- a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs +++ b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs @@ -125,5 +125,11 @@ { TestHelper.RunTestExample(@"ConditionalFormatting\CFStopIfTrue.xlsx"); } + + [Test] + public void CFDatesOccurring() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDatesOccurring.xlsx"); + } } } diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDatesOccurring.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDatesOccurring.xlsx new file mode 100644 index 0000000..6ec8da4 --- /dev/null +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDatesOccurring.xlsx Binary files differ