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