diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj
index 4121264..b17bde2 100644
--- a/ClosedXML/ClosedXML.csproj
+++ b/ClosedXML/ClosedXML.csproj
@@ -82,6 +82,7 @@
+
@@ -102,6 +103,7 @@
+
diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs
index 8428f7e..b47d0e7 100644
--- a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs
+++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs
@@ -119,6 +119,7 @@
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
new file mode 100644
index 0000000..d00f871
--- /dev/null
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs
@@ -0,0 +1,13 @@
+using ClosedXML.Utils;
+using DocumentFormat.OpenXml.Spreadsheet;
+
+namespace ClosedXML.Excel
+{
+ internal static class XLCFBaseConverter
+ {
+ public static ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority)
+ {
+ 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/XLCFCellIsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs
index 98c63ef..f883286 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -12,8 +9,9 @@
{
String val = GetQuoted(cf.Values[1]);
-
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = cf.Operator.ToOpenXml(), Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32) context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Operator = cf.Operator.ToOpenXml();
var formula = new Formula();
if (cf.Operator == XLCFOperator.Equal || cf.Operator == XLCFOperator.NotEqual)
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs
index 952a72d..e7fabb8 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs
@@ -1,8 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +7,7 @@
{
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
var colorScale = new ColorScale();
for (Int32 i = 1; i <= cf.ContentTypes.Count; i++)
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs
index c12c3b8..01a4694 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,8 +8,11 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
String val = cf.Values[1].Value;
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.ContainsText, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
-
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32) context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.ContainsText;
+ conditionalFormattingRule.Text = val;
+
var formula = new Formula { Text = "NOT(ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")))" };
conditionalFormattingRule.Append(formula);
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs
index fc84360..2186baf 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs
@@ -29,6 +29,7 @@
Converters.Add(XLConditionalFormatType.DataBar, new XLCFDataBarConverter());
Converters.Add(XLConditionalFormatType.IconSet, new XLCFIconSetConverter());
}
+
public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, Int32 priority, XLWorkbook.SaveContext context)
{
return Converters[conditionalFormat.ConditionalFormatType].Convert(conditionalFormat, priority, context);
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs
index 7edeb9c..29300fa 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs
@@ -1,10 +1,7 @@
using System;
-using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using DocumentFormat.OpenXml;
-using DocumentFormat.OpenXml.Spreadsheet;
using ClosedXML.Extensions;
+using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
{
@@ -12,7 +9,7 @@
{
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
var dataBar = new DataBar { ShowValue = !cf.ShowBarOnly };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs
index 4c1f2f8..54364f7 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,10 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
String val = cf.Values[1].Value;
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.EndsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.EndsWith;
+ conditionalFormattingRule.Text = val;
var formula = new Formula { Text = "RIGHT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs
index bdb78d2..722465d 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs
@@ -1,8 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +7,7 @@
{
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
var iconSet = new IconSet {ShowValue = !cf.ShowIconOnly, Reverse = cf.ReverseIconOrder, IconSetValue = cf.IconSetStyle.ToOpenXml()};
Int32 count = cf.Values.Count;
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs
index 0a37418..a9dac0f 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,8 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))=0" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs
index 7faacff..eb65890 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,8 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
var formula = new Formula { Text = "ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs
index ebebc5b..753e754 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,8 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))>0" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs
index 6b46bf4..3e3c081 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,10 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
String val = cf.Values[1].Value;
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.NotContains, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.NotContains;
+ conditionalFormattingRule.Text = val;
var formula = new Formula { Text = "ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs
index 63f9ba9..108c244 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,8 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
var formula = new Formula { Text = "NOT(ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs
index 20cb843..77abaf9 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,10 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
String val = cf.Values[1].Value;
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.BeginsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.BeginsWith;
+ conditionalFormattingRule.Text = val;
var formula = new Formula { Text = "LEFT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" };
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs
index 277144d..3ca8dbc 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs
@@ -1,7 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -11,7 +8,11 @@
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
UInt32 val = UInt32.Parse(cf.Values[1].Value);
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Percent = cf.Percent, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority, Rank = val, Bottom = cf.Bottom};
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cf.Style];
+ conditionalFormattingRule.Percent = cf.Percent;
+ conditionalFormattingRule.Rank = val;
+ conditionalFormattingRule.Bottom = cf.Bottom;
return conditionalFormattingRule;
}
diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs
index da68ca8..f4945bc 100644
--- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs
+++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ClosedXML.Excel
@@ -10,10 +6,9 @@
{
public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context)
{
- var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority };
+ var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority);
+ conditionalFormattingRule.FormatId = (uint)context.DifferentialFormats[cf.Style];
return conditionalFormattingRule;
}
-
-
}
}
diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs
index b42905d..03aa8ca 100644
--- a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs
+++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using ClosedXML.Utils;
namespace ClosedXML.Excel
{
@@ -17,6 +16,7 @@
ContentTypes = new XLDictionary();
IconSetOperators = new XLDictionary();
CopyDefaultModify = copyDefaultModify;
+
}
public XLConditionalFormat(XLConditionalFormat conditionalFormat)
@@ -39,6 +39,9 @@
ReverseIconOrder = conditionalFormat.ReverseIconOrder;
ShowIconOnly = conditionalFormat.ShowIconOnly;
ShowBarOnly = conditionalFormat.ShowBarOnly;
+ StopIfTrueInternal = OpenXmlHelper.GetBooleanValueAsBool(conditionalFormat.StopIfTrueInternal, true);
+
+
}
public Guid Id { get; internal set; }
@@ -98,6 +101,14 @@
public Boolean ShowIconOnly { get; set; }
public Boolean ShowBarOnly { get; set; }
+ internal bool StopIfTrueInternal { get; set; }
+
+ public IXLConditionalFormat StopIfTrue(bool value = true)
+ {
+ StopIfTrueInternal = value;
+ return this;
+ }
+
public void CopyFrom(IXLConditionalFormat other)
{
Style = other.Style;
@@ -110,6 +121,7 @@
ReverseIconOrder = other.ReverseIconOrder;
ShowIconOnly = other.ShowIconOnly;
ShowBarOnly = other.ShowBarOnly;
+ StopIfTrueInternal = ((XLConditionalFormat)other).StopIfTrueInternal;
Values.Clear();
other.Values.ForEach(kp => Values.Add(kp.Key, new XLFormula(kp.Value)));
diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs
index 22dafbe..f2080c5 100644
--- a/ClosedXML/Excel/XLWorkbook_Load.cs
+++ b/ClosedXML/Excel/XLWorkbook_Load.cs
@@ -1440,14 +1440,11 @@
if (fontColor.HasValue)
fontBase.FontColor = fontColor;
- var fontFamilyNumbering = fontSource.Elements().FirstOrDefault();
+ var fontFamilyNumbering =
+ fontSource.Elements().FirstOrDefault();
if (fontFamilyNumbering != null && fontFamilyNumbering.Val != null)
- fontBase.FontFamilyNumbering = (XLFontFamilyNumberingValues)Int32.Parse(fontFamilyNumbering.Val.ToString());
-
- var fontCharSet = fontSource.Elements().FirstOrDefault();
- if (fontCharSet != null && fontCharSet.Val != null)
- fontBase.FontCharSet = (XLFontCharSet)Int32.Parse(fontCharSet.Val.ToString());
-
+ fontBase.FontFamilyNumbering =
+ (XLFontFamilyNumberingValues)Int32.Parse(fontFamilyNumbering.Val.ToString());
var runFont = fontSource.Elements().FirstOrDefault();
if (runFont != null)
{
@@ -1841,6 +1838,9 @@
foreach (var fr in conditionalFormatting.Elements())
{
var conditionalFormat = new XLConditionalFormat(ws.Range(sor.Value));
+
+ conditionalFormat.StopIfTrueInternal = OpenXmlHelper.GetBooleanValueAsBool(fr.StopIfTrue, false);
+
if (fr.FormatId != null)
{
LoadFont(differentialFormats[(Int32)fr.FormatId.Value].Font, conditionalFormat.Style.Font);
diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs
index 80fb542..9e8f1a1 100644
--- a/ClosedXML/Excel/XLWorkbook_Save.cs
+++ b/ClosedXML/Excel/XLWorkbook_Save.cs
@@ -2033,31 +2033,31 @@
Name = pt.Name,
CacheId = cacheId,
DataCaption = "Values",
- MergeItem = GetBooleanValue(pt.MergeAndCenterWithLabels, true),
+ MergeItem = OpenXmlHelper.GetBooleanValue(pt.MergeAndCenterWithLabels, true),
Indent = Convert.ToUInt32(pt.RowLabelIndent),
PageOverThenDown = (pt.FilterAreaOrder == XLFilterAreaOrder.OverThenDown),
PageWrap = Convert.ToUInt32(pt.FilterFieldsPageWrap),
ShowError = String.IsNullOrEmpty(pt.ErrorValueReplacement),
- UseAutoFormatting = GetBooleanValue(pt.AutofitColumns, true),
- PreserveFormatting = GetBooleanValue(pt.PreserveCellFormatting, true),
- RowGrandTotals = GetBooleanValue(pt.ShowGrandTotalsRows, true),
- ColumnGrandTotals = GetBooleanValue(pt.ShowGrandTotalsColumns, true),
- SubtotalHiddenItems = GetBooleanValue(pt.FilteredItemsInSubtotals, true),
- MultipleFieldFilters = GetBooleanValue(pt.AllowMultipleFilters, true),
- CustomListSort = GetBooleanValue(pt.UseCustomListsForSorting, true),
- ShowDrill = GetBooleanValue(pt.ShowExpandCollapseButtons, true),
- ShowDataTips = GetBooleanValue(pt.ShowContextualTooltips, true),
- ShowMemberPropertyTips = GetBooleanValue(pt.ShowPropertiesInTooltips, true),
- ShowHeaders = GetBooleanValue(pt.DisplayCaptionsAndDropdowns, true),
- GridDropZones = GetBooleanValue(pt.ClassicPivotTableLayout, false),
- ShowEmptyRow = GetBooleanValue(pt.ShowEmptyItemsOnRows, true),
- ShowEmptyColumn = GetBooleanValue(pt.ShowEmptyItemsOnColumns, true),
- ShowItems = GetBooleanValue(pt.DisplayItemLabels, true),
- FieldListSortAscending = GetBooleanValue(pt.SortFieldsAtoZ, true),
- PrintDrill = GetBooleanValue(pt.PrintExpandCollapsedButtons, true),
- ItemPrintTitles = GetBooleanValue(pt.RepeatRowLabels, true),
- FieldPrintTitles = GetBooleanValue(pt.PrintTitles, true),
- EnableDrill = GetBooleanValue(pt.EnableShowDetails, true)
+ UseAutoFormatting = OpenXmlHelper.GetBooleanValue(pt.AutofitColumns, true),
+ PreserveFormatting = OpenXmlHelper.GetBooleanValue(pt.PreserveCellFormatting, true),
+ RowGrandTotals = OpenXmlHelper.GetBooleanValue(pt.ShowGrandTotalsRows, true),
+ ColumnGrandTotals = OpenXmlHelper.GetBooleanValue(pt.ShowGrandTotalsColumns, true),
+ SubtotalHiddenItems = OpenXmlHelper.GetBooleanValue(pt.FilteredItemsInSubtotals, true),
+ MultipleFieldFilters = OpenXmlHelper.GetBooleanValue(pt.AllowMultipleFilters, true),
+ CustomListSort = OpenXmlHelper.GetBooleanValue(pt.UseCustomListsForSorting, true),
+ ShowDrill = OpenXmlHelper.GetBooleanValue(pt.ShowExpandCollapseButtons, true),
+ ShowDataTips = OpenXmlHelper.GetBooleanValue(pt.ShowContextualTooltips, true),
+ ShowMemberPropertyTips = OpenXmlHelper.GetBooleanValue(pt.ShowPropertiesInTooltips, true),
+ ShowHeaders = OpenXmlHelper.GetBooleanValue(pt.DisplayCaptionsAndDropdowns, true),
+ GridDropZones = OpenXmlHelper.GetBooleanValue(pt.ClassicPivotTableLayout, false),
+ ShowEmptyRow = OpenXmlHelper.GetBooleanValue(pt.ShowEmptyItemsOnRows, true),
+ ShowEmptyColumn = OpenXmlHelper.GetBooleanValue(pt.ShowEmptyItemsOnColumns, true),
+ ShowItems = OpenXmlHelper.GetBooleanValue(pt.DisplayItemLabels, true),
+ FieldListSortAscending = OpenXmlHelper.GetBooleanValue(pt.SortFieldsAtoZ, true),
+ PrintDrill = OpenXmlHelper.GetBooleanValue(pt.PrintExpandCollapsedButtons, true),
+ ItemPrintTitles = OpenXmlHelper.GetBooleanValue(pt.RepeatRowLabels, true),
+ FieldPrintTitles = OpenXmlHelper.GetBooleanValue(pt.PrintTitles, true),
+ EnableDrill = OpenXmlHelper.GetBooleanValue(pt.EnableShowDetails, true)
};
if (pt.ClassicPivotTableLayout)
@@ -4414,19 +4414,19 @@
sheetProtection.Sheet = protection.Protected;
if (!String.IsNullOrWhiteSpace(protection.PasswordHash))
sheetProtection.Password = protection.PasswordHash;
- sheetProtection.FormatCells = GetBooleanValue(!protection.FormatCells, true);
- sheetProtection.FormatColumns = GetBooleanValue(!protection.FormatColumns, true);
- sheetProtection.FormatRows = GetBooleanValue(!protection.FormatRows, true);
- sheetProtection.InsertColumns = GetBooleanValue(!protection.InsertColumns, true);
- sheetProtection.InsertHyperlinks = GetBooleanValue(!protection.InsertHyperlinks, true);
- sheetProtection.InsertRows = GetBooleanValue(!protection.InsertRows, true);
- sheetProtection.DeleteColumns = GetBooleanValue(!protection.DeleteColumns, true);
- sheetProtection.DeleteRows = GetBooleanValue(!protection.DeleteRows, true);
- sheetProtection.AutoFilter = GetBooleanValue(!protection.AutoFilter, true);
- sheetProtection.PivotTables = GetBooleanValue(!protection.PivotTables, true);
- sheetProtection.Sort = GetBooleanValue(!protection.Sort, true);
- sheetProtection.SelectLockedCells = GetBooleanValue(!protection.SelectLockedCells, false);
- sheetProtection.SelectUnlockedCells = GetBooleanValue(!protection.SelectUnlockedCells, false);
+ sheetProtection.FormatCells = OpenXmlHelper.GetBooleanValue(!protection.FormatCells, true);
+ sheetProtection.FormatColumns = OpenXmlHelper.GetBooleanValue(!protection.FormatColumns, true);
+ sheetProtection.FormatRows = OpenXmlHelper.GetBooleanValue(!protection.FormatRows, true);
+ sheetProtection.InsertColumns = OpenXmlHelper.GetBooleanValue(!protection.InsertColumns, true);
+ sheetProtection.InsertHyperlinks = OpenXmlHelper.GetBooleanValue(!protection.InsertHyperlinks, true);
+ sheetProtection.InsertRows = OpenXmlHelper.GetBooleanValue(!protection.InsertRows, true);
+ sheetProtection.DeleteColumns = OpenXmlHelper.GetBooleanValue(!protection.DeleteColumns, true);
+ sheetProtection.DeleteRows = OpenXmlHelper.GetBooleanValue(!protection.DeleteRows, true);
+ sheetProtection.AutoFilter = OpenXmlHelper.GetBooleanValue(!protection.AutoFilter, true);
+ sheetProtection.PivotTables = OpenXmlHelper.GetBooleanValue(!protection.PivotTables, true);
+ sheetProtection.Sort = OpenXmlHelper.GetBooleanValue(!protection.Sort, true);
+ sheetProtection.SelectLockedCells = OpenXmlHelper.GetBooleanValue(!protection.SelectLockedCells, false);
+ sheetProtection.SelectUnlockedCells = OpenXmlHelper.GetBooleanValue(!protection.SelectUnlockedCells, false);
}
else
{
@@ -5114,11 +5114,6 @@
}
}
- private static BooleanValue GetBooleanValue(bool value, bool defaultValue)
- {
- return value == defaultValue ? null : new BooleanValue(value);
- }
-
private static void CollapseColumns(Columns columns, Dictionary sheetColumns)
{
UInt32 lastMin = 1;
diff --git a/ClosedXML/Utils/OpenXmlHelper.cs b/ClosedXML/Utils/OpenXmlHelper.cs
new file mode 100644
index 0000000..6f0c7a2
--- /dev/null
+++ b/ClosedXML/Utils/OpenXmlHelper.cs
@@ -0,0 +1,17 @@
+using DocumentFormat.OpenXml;
+
+namespace ClosedXML.Utils
+{
+ internal static class OpenXmlHelper
+ {
+ public static BooleanValue GetBooleanValue(bool value, bool defaultValue)
+ {
+ return value == defaultValue ? null : new BooleanValue(value);
+ }
+
+ public static bool GetBooleanValueAsBool(BooleanValue value, bool defaultValue)
+ {
+ return value == null ? defaultValue : value.Value;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
index 27656bf..769afa2 100644
--- a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
+++ b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs
@@ -663,4 +663,28 @@
workbook.SaveAs(filePath);
}
}
+
+ public class CFStopIfTrue : IXLExample
+ {
+ public void Create(String filePath)
+ {
+ var workbook = new XLWorkbook();
+ var ws = workbook.AddWorksheet("Sheet1");
+
+ ws.FirstCell().SetValue(6)
+ .CellBelow().SetValue(1)
+ .CellBelow().SetValue(2)
+ .CellBelow().SetValue(3);
+
+ 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)
+ .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number);
+
+ workbook.SaveAs(filePath);
+ }
+ }
}
diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj
index 7b6f453..08ec404 100644
--- a/ClosedXML_Tests/ClosedXML_Tests.csproj
+++ b/ClosedXML_Tests/ClosedXML_Tests.csproj
@@ -297,6 +297,7 @@
+
diff --git a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
index 8a298ae..333c347 100644
--- a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
+++ b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs
@@ -119,5 +119,11 @@
{
TestHelper.RunTestExample(@"ConditionalFormatting\CFMultipleConditions.xlsx");
}
+
+ [Test]
+ public void CFStopIfTrue()
+ {
+ TestHelper.RunTestExample(@"ConditionalFormatting\CFStopIfTrue.xlsx");
+ }
}
}
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
new file mode 100644
index 0000000..9894731
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
Binary files differ