Initial commit of the ClosedXML library
Establishes the foundational structure, core Excel functionality, and tooling. - Implements base components for cells, ranges, columns, and rows. - Integrates a custom calculation engine with a wide range of Excel functions. - Adds comprehensive support for styling, conditional formatting, data validation, comments, pictures, and charts. - Configures build setup, project metadata (NuGet), and developer guidelines. - Includes editor and Git attributes for consistent code style and line endings.
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using ClosedXML.Excel;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace ClosedXML_Tests.Excel.ConditionalFormats
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConditionalFormatCopyTests
|
||||
{
|
||||
[Test]
|
||||
public void StylesAreCreatedDuringCopy()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws = wb.Worksheets.Add("Sheet");
|
||||
var format = ws.Range("A1:A1").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
|
||||
var wb2 = new XLWorkbook();
|
||||
var ws2 = wb2.Worksheets.Add("Sheet2");
|
||||
ws2.FirstCell().CopyFrom(ws.FirstCell());
|
||||
Assert.That(ws2.ConditionalFormats.First().Style.Fill.BackgroundColor, Is.EqualTo(XLColor.Blue)); //Added blue style
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyConditionalFormatSingleWorksheet()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws = wb.Worksheets.Add("Sheet");
|
||||
var format = ws.Range("A1:A1").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
|
||||
ws.Cell("A1").CopyTo("B2");
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
Assert.AreEqual(2, ws.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual("A1:A1", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToString());
|
||||
Assert.AreEqual("B2:B2", ws.ConditionalFormats.First().Ranges.Last().RangeAddress.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyConditionalFormatSameRange()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws = wb.Worksheets.Add("Sheet");
|
||||
var format = ws.Range("A1:C3").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
|
||||
ws.Cell("A1").CopyTo("B2");
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual("A1:C3", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyConditionalFormatsDifferentWorksheets()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws1 = wb.Worksheets.Add("Sheet1");
|
||||
var format = ws1.Range("A1:A1").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
var ws2 = wb.Worksheets.Add("Sheet2");
|
||||
var otherCell = ws2.Cell("B2");
|
||||
|
||||
ws1.Cell("A1").CopyTo(otherCell);
|
||||
|
||||
Assert.AreEqual(1, ws1.ConditionalFormats.Count());
|
||||
Assert.AreEqual(1, ws2.ConditionalFormats.Count());
|
||||
Assert.AreEqual(1, ws1.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual(1, ws2.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual("Sheet1", ws1.ConditionalFormats.First().Ranges.First().Worksheet.Name);
|
||||
Assert.AreEqual("Sheet2", ws2.ConditionalFormats.First().Ranges.First().Worksheet.Name);
|
||||
Assert.AreEqual("A1:A1", ws1.ConditionalFormats.First().Ranges.First().RangeAddress.ToString());
|
||||
Assert.AreEqual("B2:B2", ws2.ConditionalFormats.First().Ranges.First().RangeAddress.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FullCopyConditionalFormatSameWorksheet()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws1 = wb.Worksheets.Add("Sheet1");
|
||||
var format = (XLConditionalFormat)ws1.Range("A1:A1").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
|
||||
TestDelegate action = () => format.CopyTo(ws1);
|
||||
|
||||
Assert.Throws(typeof(InvalidOperationException), action);
|
||||
|
||||
}
|
||||
[Test]
|
||||
public void FullCopyConditionalFormatDifferentWorksheets()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
var ws1 = wb.Worksheets.Add("Sheet1");
|
||||
var format = (XLConditionalFormat)ws1.Range("A1:C3").AddConditionalFormat();
|
||||
format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill
|
||||
.SetBackgroundColor(XLColor.Blue);
|
||||
var ws2 = wb.Worksheets.Add("Sheet2");
|
||||
|
||||
format.CopyTo(ws2);
|
||||
|
||||
Assert.AreEqual(1, ws1.ConditionalFormats.Count());
|
||||
Assert.AreEqual(1, ws2.ConditionalFormats.Count());
|
||||
Assert.AreEqual(1, ws1.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual(1, ws2.ConditionalFormats.First().Ranges.Count);
|
||||
Assert.AreEqual("Sheet1!A1:C3", ws1.ConditionalFormats.First().Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true));
|
||||
Assert.AreEqual("Sheet2!A1:C3", ws2.ConditionalFormats.First().Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
using ClosedXML.Excel;
|
||||
using NUnit.Framework;
|
||||
using System.Linq;
|
||||
|
||||
namespace ClosedXML_Tests.Excel.ConditionalFormats
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConditionalFormatShiftTests
|
||||
{
|
||||
[Test]
|
||||
public void CFShiftedOnColumnInsert()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet("CFShift");
|
||||
ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue);
|
||||
ws.Range("A2:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue);
|
||||
ws.Range("A3:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin);
|
||||
ws.Range("B4:B6").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond);
|
||||
ws.Range("C7:D7").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth);
|
||||
ws.Cells("A1:D7").Value = 1;
|
||||
|
||||
ws.Column(2).InsertColumnsAfter(2);
|
||||
var cf = ws.ConditionalFormats.ToArray();
|
||||
|
||||
Assert.AreEqual(5, cf.Length);
|
||||
Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("A2:D2", cf[1].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("A3:E3", cf[2].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("B4:D6", cf[3].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("E7:F7", cf[4].Range.RangeAddress.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CFShiftedOnRowInsert()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet("CFShift");
|
||||
ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue);
|
||||
ws.Range("B1:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue);
|
||||
ws.Range("C1:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin);
|
||||
ws.Range("D2:F2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond);
|
||||
ws.Range("G4:G5").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth);
|
||||
ws.Cells("A1:G5").Value = 1;
|
||||
|
||||
ws.Row(2).InsertRowsBelow(2);
|
||||
var cf = ws.ConditionalFormats.ToArray();
|
||||
|
||||
Assert.AreEqual(5, cf.Length);
|
||||
Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("B1:B4", cf[1].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("C1:C5", cf[2].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("D2:F4", cf[3].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("G6:G7", cf[4].Range.RangeAddress.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CFShiftedOnColumnDelete()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet("CFShift");
|
||||
ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue);
|
||||
ws.Range("A2:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue);
|
||||
ws.Range("A3:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin);
|
||||
ws.Range("B4:B6").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond);
|
||||
ws.Range("C7:D7").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth);
|
||||
ws.Cells("A1:D7").Value = 1;
|
||||
|
||||
ws.Column(2).Delete();
|
||||
var cf = ws.ConditionalFormats.ToArray();
|
||||
|
||||
Assert.AreEqual(4, cf.Length);
|
||||
Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("A2:A2", cf[1].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("A3:B3", cf[2].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("B7:C7", cf[3].Range.RangeAddress.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CFShiftedOnRowDelete()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet("CFShift");
|
||||
ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue);
|
||||
ws.Range("B1:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue);
|
||||
ws.Range("C1:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin);
|
||||
ws.Range("D2:F2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond);
|
||||
ws.Range("G4:G5").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth);
|
||||
ws.Cells("A1:G5").Value = 1;
|
||||
|
||||
ws.Row(2).Delete();
|
||||
var cf = ws.ConditionalFormats.ToArray();
|
||||
|
||||
Assert.AreEqual(4, cf.Length);
|
||||
Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("B1:B1", cf[1].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("C1:C2", cf[2].Range.RangeAddress.ToString());
|
||||
Assert.AreEqual("G3:G4", cf[3].Range.RangeAddress.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CFShiftedTruncateRange()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet("CFShift");
|
||||
ws.AsRange().AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Red);
|
||||
var cf = ws.ConditionalFormats.Single();
|
||||
|
||||
ws.Row(2).InsertRowsAbove(1);
|
||||
Assert.IsTrue(cf.Range.RangeAddress.IsValid);
|
||||
Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", cf.Range.RangeAddress.ToString());
|
||||
|
||||
ws.Column(2).InsertColumnsAfter(1);
|
||||
Assert.IsTrue(cf.Range.RangeAddress.IsValid);
|
||||
Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", cf.Range.RangeAddress.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
using ClosedXML.Excel;
|
||||
using NUnit.Framework;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
|
||||
namespace ClosedXML_Tests.Excel.ConditionalFormats
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConditionalFormatTests
|
||||
{
|
||||
[Test]
|
||||
public void MaintainConditionalFormattingOrder()
|
||||
{
|
||||
using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\StyleReferenceFiles\ConditionalFormattingOrder\inputfile.xlsx")))
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
TestHelper.CreateAndCompare(() =>
|
||||
{
|
||||
var wb = new XLWorkbook(stream);
|
||||
wb.SaveAs(ms);
|
||||
return wb;
|
||||
}, @"Other\StyleReferenceFiles\ConditionalFormattingOrder\ConditionalFormattingOrder.xlsx");
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase(true, 7)]
|
||||
[TestCase(false, 8)]
|
||||
public void SaveOptionAffectsConsolidationConditionalFormatRanges(bool consolidateConditionalFormatRanges, int expectedCount)
|
||||
{
|
||||
var options = new SaveOptions
|
||||
{
|
||||
ConsolidateConditionalFormatRanges = consolidateConditionalFormatRanges
|
||||
};
|
||||
|
||||
var wb = new XLWorkbook();
|
||||
var ws = wb.AddWorksheet("Sheet");
|
||||
|
||||
ws.Range("D2:D3").AddConditionalFormat().DataBar(XLColor.Red).LowestValue().HighestValue();
|
||||
ws.Range("B2:B3").AddConditionalFormat().DataBar(XLColor.Red).LowestValue().HighestValue();
|
||||
ws.Range("E2:E6").AddConditionalFormat().ColorScale().LowestValue(XLColor.Red).HighestValue(XLColor.Blue);
|
||||
ws.Range("F2:F6").AddConditionalFormat().ColorScale().LowestValue(XLColor.Red).HighestValue(XLColor.Blue);
|
||||
ws.Range("G2:G7").AddConditionalFormat().WhenIsUnique().Fill.SetBackgroundColor(XLColor.Blue);
|
||||
ws.Range("H2:H7").AddConditionalFormat().WhenIsUnique().Fill.SetBackgroundColor(XLColor.Blue);
|
||||
ws.Range("I2:I6").AddConditionalFormat().WhenContains("test");
|
||||
ws.Range("J2:J6").AddConditionalFormat().WhenContains("test");
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
wb.SaveAs(ms, options);
|
||||
var wb_saved = new XLWorkbook(ms);
|
||||
Assert.AreEqual(expectedCount, wb_saved.Worksheet("Sheet").ConditionalFormats.Count());
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase(true, 1)]
|
||||
[TestCase(false, 2)]
|
||||
public void SaveOptionAffectsConsolidationDataValidationRanges(bool consolidateDataValidationRanges, int expectedCount)
|
||||
{
|
||||
var options = new SaveOptions
|
||||
{
|
||||
ConsolidateDataValidationRanges = consolidateDataValidationRanges
|
||||
};
|
||||
|
||||
var wb = new XLWorkbook();
|
||||
var ws = wb.AddWorksheet("Sheet");
|
||||
ws.Range("C2:C5").SetDataValidation().Decimal.Between(1, 5);
|
||||
ws.Range("D2:D5").SetDataValidation().Decimal.Between(1, 5);
|
||||
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
wb.SaveAs(ms, options);
|
||||
var wb_saved = new XLWorkbook(ms);
|
||||
Assert.AreEqual(expectedCount, wb_saved.Worksheet("Sheet").DataValidations.Count());
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase("en-US")]
|
||||
[TestCase("fr-FR")]
|
||||
[TestCase("ru-RU")]
|
||||
public void SaveConditionalFormat_CultureIndependent(string culture)
|
||||
{
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
var expectedValue = 1.5;
|
||||
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture);
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.AddWorksheet();
|
||||
var i = 1;
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenEquals(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenNotEquals(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenGreaterThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenLessThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenEqualOrGreaterThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenEqualOrLessThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenBetween(expectedValue, expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.Cell(i++, 1).AddConditionalFormat().WhenNotBetween(expectedValue, expectedValue).Fill.SetBackgroundColor(XLColor.Red);
|
||||
|
||||
wb.SaveAs(ms);
|
||||
}
|
||||
|
||||
using (var wb = new XLWorkbook(ms))
|
||||
{
|
||||
var ws = wb.Worksheets.First();
|
||||
|
||||
var conditionalFormatValues = ws.ConditionalFormats
|
||||
.SelectMany(cf => cf.Values.Values)
|
||||
.Select(v => v.Value)
|
||||
.Distinct();
|
||||
|
||||
Assert.AreEqual(1, conditionalFormatValues.Count());
|
||||
Assert.AreEqual("1.5", conditionalFormatValues.Single());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using ClosedXML.Excel;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace ClosedXML_Tests.Excel.ConditionalFormats
|
||||
{
|
||||
[TestFixture]
|
||||
public class ConditionalFormatsConsolidateTests
|
||||
{
|
||||
[Test]
|
||||
public void ConsecutivelyRowsConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("B2:C2").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("B4:C4").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("B3:C3").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
var format = ws.ConditionalFormats.First();
|
||||
Assert.AreEqual("B2:C4", format.Range.RangeAddress.ToStringRelative());
|
||||
Assert.AreEqual("F2", format.Values.Values.First().Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ConsecutivelyColumnsConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("D2:D3").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("B2:B3").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("C2:C3").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
var format = ws.ConditionalFormats.First();
|
||||
Assert.AreEqual("B2:D3", format.Ranges.First().RangeAddress.ToStringRelative());
|
||||
Assert.AreEqual("F2", format.Values.Values.First().Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Contains1ConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("B11:D12").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("C12:D12").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
var format = ws.ConditionalFormats.First();
|
||||
Assert.AreEqual("B11:D12", format.Range.RangeAddress.ToStringRelative());
|
||||
Assert.AreEqual("F11", format.Values.Values.First().Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Contains2ConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("B14:C14").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("B14:B14").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
var format = ws.ConditionalFormats.First();
|
||||
Assert.AreEqual("B14:C14", format.Range.RangeAddress.ToStringRelative());
|
||||
Assert.AreEqual("F14", format.Values.Values.First().Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SuperimposedConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("B16:D18").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("B18:D19").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
var format = ws.ConditionalFormats.First();
|
||||
Assert.AreEqual("B16:D19", format.Range.RangeAddress.ToStringRelative());
|
||||
Assert.AreEqual("F16", format.Values.Values.First().Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DifferentFormatNoConsolidateTest()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("B11:D12").AddConditionalFormat());
|
||||
SetFormat2(ws.Range("C12:D12").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(2, ws.ConditionalFormats.Count());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ConsolidatePreservesPriorities()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("A1:A5").AddConditionalFormat());
|
||||
SetFormat2(ws.Range("A1:A5").AddConditionalFormat());
|
||||
SetFormat2(ws.Range("A6:A10").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("A6:A10").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(3, ws.ConditionalFormats.Count());
|
||||
Assert.AreEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.Last().Style as XLStyle).Value);
|
||||
Assert.AreNotEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.ElementAt(1).Style as XLStyle).Value);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void ConsolidatePreservesPriorities2()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
SetFormat1(ws.Range("A1:A1").AddConditionalFormat());
|
||||
SetFormat2(ws.Range("A2:A3").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("A2:A6").AddConditionalFormat());
|
||||
SetFormat1(ws.Range("A7:A8").AddConditionalFormat());
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(3, ws.ConditionalFormats.Count());
|
||||
Assert.AreEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.Last().Style as XLStyle).Value);
|
||||
Assert.AreNotEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.ElementAt(1).Style as XLStyle).Value);
|
||||
Assert.IsTrue(ws.ConditionalFormats.All(cf => cf.Ranges.Count == 1), "Number of ranges in consolidated conditional formats is expected to be 1");
|
||||
Assert.AreEqual("A1:A1", ws.ConditionalFormats.ElementAt(0).Ranges.Single().RangeAddress.ToString());
|
||||
Assert.AreEqual("A2:A3", ws.ConditionalFormats.ElementAt(1).Ranges.Single().RangeAddress.ToString());
|
||||
Assert.AreEqual("A2:A8", ws.ConditionalFormats.ElementAt(2).Ranges.Single().RangeAddress.ToString());
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void ConsolidateShiftsFormulaRelativelyToTopMostCell()
|
||||
{
|
||||
var wb = new XLWorkbook();
|
||||
IXLWorksheet ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
var ranges = ws.Ranges("B3:B8,C3:C4,A3:A4,C5:C8,A5:A8").Cast<XLRange>();
|
||||
var cf = new XLConditionalFormat(ranges);
|
||||
cf.Values.Add(new XLFormula("=A3=$D3"));
|
||||
cf.Style.Fill.SetBackgroundColor(XLColor.Red);
|
||||
ws.ConditionalFormats.Add(cf);
|
||||
|
||||
((XLConditionalFormats)ws.ConditionalFormats).Consolidate();
|
||||
|
||||
Assert.AreEqual(1, ws.ConditionalFormats.Count());
|
||||
Assert.AreEqual((ws.ConditionalFormats.Single().Style as XLStyle).Value, (cf.Style as XLStyle).Value);
|
||||
Assert.AreEqual("A3:C8", ws.ConditionalFormats.Single().Ranges.Single().RangeAddress.ToString());
|
||||
Assert.IsTrue(ws.ConditionalFormats.Single().Values.Single().Value.IsFormula);
|
||||
Assert.AreEqual("A3=$D3", ws.ConditionalFormats.Single().Values.Single().Value.Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ColorScaleComparing()
|
||||
{
|
||||
using (var wb = new XLWorkbook())
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Sheet");
|
||||
|
||||
var ranges = ws.Ranges("B3:B8,C3:C4,A3:A4,C5:C8,A5:A8").Cast<XLRange>();
|
||||
var cf1 = new XLConditionalFormat(ranges);
|
||||
cf1.ColorScale()
|
||||
.LowestValue(XLColor.Red)
|
||||
.HighestValue(XLColor.Green);
|
||||
|
||||
var cf2 = new XLConditionalFormat(ranges);
|
||||
cf2.ColorScale()
|
||||
.LowestValue(XLColor.Red)
|
||||
.HighestValue(XLColor.Green);
|
||||
Assert.True(XLConditionalFormat.NoRangeComparer.Equals(cf1, cf2));
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetFormat1(IXLConditionalFormat format)
|
||||
{
|
||||
format.WhenEquals("="+format.Range.FirstCell().CellRight(4).Address.ToStringRelative()).Fill.SetBackgroundColor(XLColor.Blue);
|
||||
}
|
||||
|
||||
private static void SetFormat2(IXLConditionalFormat format)
|
||||
{
|
||||
format.WhenEquals(5).Fill.SetBackgroundColor(XLColor.AliceBlue);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user