diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs index 8ccfbdd..cae5f8c 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs @@ -1,14 +1,14 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; namespace ClosedXML.Excel { - public interface IXLConditionalFormats: IEnumerable + public interface IXLConditionalFormats : IEnumerable { void Add(IXLConditionalFormat conditionalFormat); + void RemoveAll(); + void Remove(Predicate predicate); } } diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs index e55ec35..7c47c57 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs @@ -142,6 +142,7 @@ } public Guid Id { get; internal set; } + internal Int32 OriginalPriority { get; set; } public Boolean CopyDefaultModify { get; set; } private IXLStyle _style; private Int32 _styleCacheId; diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs index 940bd22..f986db8 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs @@ -110,5 +110,15 @@ _conditionalFormats.ForEach(cf => cf.Range.Dispose()); _conditionalFormats.Clear(); } + + /// + /// Reorders the according to original priority. Done during load process + /// + public void ReorderAccordingToOriginalPriority() + { + var reorderedFormats = _conditionalFormats.OrderBy(cf => (cf as XLConditionalFormat).OriginalPriority).ToList(); + _conditionalFormats.Clear(); + _conditionalFormats.AddRange(reorderedFormats); + } } } diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index e5991e1..8aa12c5 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -276,6 +276,8 @@ reader.Close(); } + (ws.ConditionalFormats as XLConditionalFormats).ReorderAccordingToOriginalPriority(); + #region LoadTables foreach (var tableDefinitionPart in worksheetPart.TableDefinitionParts) @@ -2143,6 +2145,7 @@ // The conditional formatting type is compulsory. If it doesn't exist, skip the entire rule. if (fr.Type == null) continue; conditionalFormat.ConditionalFormatType = fr.Type.Value.ToClosedXml(); + conditionalFormat.OriginalPriority = fr.Priority?.Value ?? Int32.MaxValue; if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs && fr.Operator != null) conditionalFormat.Operator = fr.Operator.Value.ToClosedXml(); diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 188d213..d04eaef 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -4992,8 +4992,9 @@ worksheetPart.Worksheet.RemoveAllChildren(); var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ConditionalFormatting); - var priority = 1; // priority is 1 origin in Microsoft Excel - foreach (var cfGroup in xlWorksheet.ConditionalFormats + var conditionalFormats = xlWorksheet.ConditionalFormats.ToList(); // Required for IndexOf method + + foreach (var cfGroup in conditionalFormats .GroupBy( c => c.Range.RangeAddress.ToStringRelative(false), c => c, @@ -5008,8 +5009,8 @@ }; foreach (var cf in cfGroup.CfList) { + var priority = conditionalFormats.IndexOf(cf) + 1; conditionalFormatting.Append(XLCFConverters.Convert(cf, priority, context)); - priority++; } worksheetPart.Worksheet.InsertAfter(conditionalFormatting, previousElement); previousElement = conditionalFormatting;