diff --git a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj index 991d71c..85f38cd 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj @@ -196,6 +196,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/Dictionary.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/Dictionary.cs new file mode 100644 index 0000000..b866775 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/Dictionary.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.Style +{ + class Dictionary + { + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/IXLBorder.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/IXLBorder.cs index 5656674..301867a 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/IXLBorder.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/IXLBorder.cs @@ -23,6 +23,8 @@ { XLBorderStyleValues OutsideBorder { set; } IXLColor OutsideBorderColor { set; } + XLBorderStyleValues InsideBorder { set; } + IXLColor InsideBorderColor { set; } XLBorderStyleValues LeftBorder { get; set; } IXLColor LeftBorderColor { get; set; } @@ -39,6 +41,8 @@ IXLStyle SetOutsideBorder(XLBorderStyleValues value); IXLStyle SetOutsideBorderColor(IXLColor value); + IXLStyle SetInsideBorder(XLBorderStyleValues value); + IXLStyle SetInsideBorderColor(IXLColor value); IXLStyle SetLeftBorder(XLBorderStyleValues value); IXLStyle SetLeftBorderColor(IXLColor value); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLBorder.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLBorder.cs index 839b9e0..82c924d 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLBorder.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLBorder.cs @@ -3,6 +3,8 @@ namespace ClosedXML.Excel { + using System.Collections.Generic; + internal class XLBorder : IXLBorder { private readonly IXLStylized _container; @@ -76,6 +78,66 @@ } } + public XLBorderStyleValues InsideBorder + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + foreach (IXLRange r in _container.RangesUsed) + { + Dictionary topBorders = new Dictionary(); + r.FirstRow().Cells().ForEach(c=>topBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, c.Style.Border.TopBorder)); + + Dictionary bottomBorders = new Dictionary(); + r.LastRow().Cells().ForEach(c => bottomBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, c.Style.Border.BottomBorder)); + + Dictionary leftBorders = new Dictionary(); + r.FirstColumn().Cells().ForEach(c => leftBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, c.Style.Border.LeftBorder)); + + Dictionary rightBorders = new Dictionary(); + r.LastColumn().Cells().ForEach(c => rightBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, c.Style.Border.RightBorder)); + + r.Cells().Style.Border.OutsideBorder = value; + + topBorders.ForEach(kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorder = kp.Value); + bottomBorders.ForEach(kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorder = kp.Value); + leftBorders.ForEach(kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorder = kp.Value); + rightBorders.ForEach(kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorder = kp.Value); + } + } + } + + public IXLColor InsideBorderColor + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + foreach (IXLRange r in _container.RangesUsed) + { + Dictionary topBorders = new Dictionary(); + r.FirstRow().Cells().ForEach(c => topBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, c.Style.Border.TopBorderColor)); + + Dictionary bottomBorders = new Dictionary(); + r.LastRow().Cells().ForEach(c => bottomBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, c.Style.Border.BottomBorderColor)); + + Dictionary leftBorders = new Dictionary(); + r.FirstColumn().Cells().ForEach(c => leftBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, c.Style.Border.LeftBorderColor)); + + Dictionary rightBorders = new Dictionary(); + r.LastColumn().Cells().ForEach(c => rightBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, c.Style.Border.RightBorderColor)); + + r.Cells().Style.Border.OutsideBorderColor = value; + + topBorders.ForEach(kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorderColor = kp.Value); + bottomBorders.ForEach(kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorderColor = kp.Value); + leftBorders.ForEach(kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorderColor = kp.Value); + rightBorders.ForEach(kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorderColor = kp.Value); + } + } + } + public XLBorderStyleValues LeftBorder { get { return _leftBorder; } @@ -263,6 +325,18 @@ return _container.Style; } + public IXLStyle SetInsideBorder(XLBorderStyleValues value) + { + InsideBorder = value; + return _container.Style; + } + + public IXLStyle SetInsideBorderColor(IXLColor value) + { + InsideBorderColor = value; + return _container.Style; + } + public IXLStyle SetLeftBorder(XLBorderStyleValues value) { LeftBorder = value; diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj index 099c415..3f1f0f6 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -76,6 +76,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/StylesTest.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/StylesTest.cs new file mode 100644 index 0000000..a19ac80 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/StylesTest.cs @@ -0,0 +1,73 @@ +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.Linq; +using ClosedXML.Excel; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace ClosedXML_Tests.Excel.Misc +{ + /// + /// Summary description for UnitTest1 + /// + [TestClass] + public class StylesTest + { + [TestMethod] + public void InsideBorderTest() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + var range = ws.Range("B2:D4"); + + SetupBorders(range); + + range.Style.Border.InsideBorder = XLBorderStyleValues.Thin; + range.Style.Border.InsideBorderColor = XLColor.Red; + + var center = range.Cell(2, 2); + + Assert.AreEqual(XLColor.Red, center.Style.Border.TopBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.BottomBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.LeftBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.RightBorderColor); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstRow().Cell(1).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstRow().Cell(2).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstRow().Cell(3).Style.Border.TopBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastRow().Cell(1).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastRow().Cell(2).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastRow().Cell(3).Style.Border.BottomBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstColumn().Cell(1).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstColumn().Cell(2).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstColumn().Cell(3).Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastColumn().Cell(1).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastColumn().Cell(2).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastColumn().Cell(3).Style.Border.RightBorder); + } + + private static void SetupBorders(IXLRange range) + { + range.FirstRow().Cell(1).Style.Border.TopBorder = XLBorderStyleValues.None; + range.FirstRow().Cell(2).Style.Border.TopBorder = XLBorderStyleValues.Thick; + range.FirstRow().Cell(3).Style.Border.TopBorder = XLBorderStyleValues.Double; + + range.LastRow().Cell(1).Style.Border.BottomBorder = XLBorderStyleValues.None; + range.LastRow().Cell(2).Style.Border.BottomBorder = XLBorderStyleValues.Thick; + range.LastRow().Cell(3).Style.Border.BottomBorder = XLBorderStyleValues.Double; + + range.FirstColumn().Cell(1).Style.Border.LeftBorder = XLBorderStyleValues.None; + range.FirstColumn().Cell(2).Style.Border.LeftBorder = XLBorderStyleValues.Thick; + range.FirstColumn().Cell(3).Style.Border.LeftBorder = XLBorderStyleValues.Double; + + range.LastColumn().Cell(1).Style.Border.RightBorder = XLBorderStyleValues.None; + range.LastColumn().Cell(2).Style.Border.RightBorder = XLBorderStyleValues.Thick; + range.LastColumn().Cell(3).Style.Border.RightBorder = XLBorderStyleValues.Double; + } + + } +}