diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index 7f86b52..63972fc 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -70,15 +70,15 @@ #region Constructor private Int32 _styleCacheId; - public XLCell(XLWorksheet worksheet, XLAddress address, IXLStyle defaultStyle) + public XLCell(XLWorksheet worksheet, XLAddress address, Int32 styleId) { Address = address; ShareString = true; _worksheet = worksheet; - SetStyle(defaultStyle ?? worksheet.Style); - + //SetStyle(defaultStyle ?? worksheet.Style); + SetStyle(styleId); } private IXLStyle GetStyleForRead() @@ -98,6 +98,12 @@ _style = null; StyleChanged = false; } + private void SetStyle(Int32 styleId) + { + _styleCacheId = styleId; + _style = null; + StyleChanged = false; + } #endregion @@ -733,8 +739,9 @@ set { - _formulaA1 = value; - _formulaR1C1 = String.Empty; + _formulaA1 = StringExtensions.IsNullOrWhiteSpace(value) ? null : value; + + _formulaR1C1 = null; } } @@ -750,7 +757,7 @@ set { - _formulaR1C1 = value; + _formulaR1C1 = StringExtensions.IsNullOrWhiteSpace(value) ? null : value; // FormulaA1 = GetFormulaA1(value); } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index 8ad0e34..5942db6 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -31,7 +31,7 @@ Worksheet.RangeShiftedColumns += WorksheetRangeShiftedColumns; else { - SetStyle(xlColumnParameters.DefaultStyle ?? Worksheet.Style); + SetStyle(xlColumnParameters.DefaultStyleId); _width = xlColumnParameters.Worksheet.ColumnWidth; } } @@ -47,7 +47,7 @@ _collapsed = column._collapsed; _isHidden = column._isHidden; _outlineLevel = column._outlineLevel; - SetStyle(column.Style ?? Worksheet.Style); + SetStyle(column.GetStyleId()); } #endregion diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnParameters.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnParameters.cs index 84053aa..4353f20 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnParameters.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnParameters.cs @@ -5,13 +5,13 @@ { internal class XLColumnParameters { - public XLColumnParameters(XLWorksheet worksheet, IXLStyle defaultStyle, Boolean isReference) + public XLColumnParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference) { Worksheet = worksheet; - DefaultStyle = defaultStyle; + DefaultStyleId = defaultStyleId; IsReference = isReference; } - public IXLStyle DefaultStyle { get; set; } + public Int32 DefaultStyleId { get; set; } public XLWorksheet Worksheet { get; private set; } public Boolean IsReference { get; private set; } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs index 97f4d48..80630a2 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs @@ -907,7 +907,7 @@ var oldCell = rngToTranspose.Cell(ro, co); var newKey = rngToTranspose.Cell(co, ro).Address; // new XLAddress(Worksheet, c.Address.ColumnNumber, c.Address.RowNumber); - var newCell = new XLCell(Worksheet, newKey, oldCell.Style); + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); newCell.CopyFrom(oldCell); cellsToInsert.Add(new XLSheetPoint(newKey.RowNumber, newKey.ColumnNumber), newCell); cellsToDelete.Add(new XLSheetPoint(oldCell.Address.RowNumber, oldCell.Address.ColumnNumber)); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index fe050f2..74fd8ed 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -21,6 +21,12 @@ _style = null; StyleChanged = false; } + protected void SetStyle(Int32 styleId) + { + _styleCacheId = styleId; + _style = null; + StyleChanged = false; + } public Int32 GetStyleId() { if (StyleChanged) @@ -533,19 +539,29 @@ if (cell != null) return cell; - var style = Style; - if (Style != null && Style.Equals(Worksheet.Style)) + //var style = Style; + Int32 styleId = GetStyleId(); + Int32 worksheetStyleId = Worksheet.GetStyleId(); + + if (styleId == worksheetStyleId) { - if (Worksheet.Internals.RowsCollection.ContainsKey(absoluteAddress.RowNumber) - && !Worksheet.Internals.RowsCollection[absoluteAddress.RowNumber].Style.Equals(Worksheet.Style)) - style = Worksheet.Internals.RowsCollection[absoluteAddress.RowNumber].Style; - else if (Worksheet.Internals.ColumnsCollection.ContainsKey(absoluteAddress.ColumnNumber) - && - !Worksheet.Internals.ColumnsCollection[absoluteAddress.ColumnNumber].Style.Equals( - Worksheet.Style)) - style = Worksheet.Internals.ColumnsCollection[absoluteAddress.ColumnNumber].Style; + XLRow row; + XLColumn column; + if (Worksheet.Internals.RowsCollection.TryGetValue(absoluteAddress.RowNumber, out row) + && row.GetStyleId() == worksheetStyleId) + styleId = row.GetStyleId(); + else if (Worksheet.Internals.ColumnsCollection.TryGetValue(absoluteAddress.ColumnNumber, out column) + && column.GetStyleId() == worksheetStyleId) + styleId = column.GetStyleId(); + //if (Worksheet.Internals.RowsCollection.ContainsKey(absoluteAddress.RowNumber) + // && !Worksheet.Internals.RowsCollection[absoluteAddress.RowNumber].GetStyleId().Equals(worksheetStyleId)) + // style = Worksheet.Internals.RowsCollection[absoluteAddress.RowNumber].Style; + //else if (Worksheet.Internals.ColumnsCollection.ContainsKey(absoluteAddress.ColumnNumber) + // && + // !Worksheet.Internals.ColumnsCollection[absoluteAddress.ColumnNumber].GetStyleId().Equals(worksheetStyleId)) + // style = Worksheet.Internals.ColumnsCollection[absoluteAddress.ColumnNumber].Style; } - var newCell = new XLCell(Worksheet, absoluteAddress, style); + var newCell = new XLCell(Worksheet, absoluteAddress, styleId); Worksheet.Internals.CellsCollection.Add(absoluteAddress.RowNumber, absoluteAddress.ColumnNumber, newCell); return newCell; } @@ -780,7 +796,7 @@ var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co) ?? Worksheet.Cell(oldKey); - var newCell = new XLCell(Worksheet, newKey, oldCell.Style); + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); newCell.CopyValues(oldCell); newCell.FormulaA1 = oldCell.FormulaA1; cellsToInsert.Add(newKey, newCell); @@ -800,7 +816,7 @@ { int newColumn = c.Address.ColumnNumber + numberOfColumns; var newKey = new XLAddress(Worksheet, c.Address.RowNumber, newColumn, false, false); - var newCell = new XLCell(Worksheet, newKey, c.Style); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); newCell.CopyValues(c); newCell.FormulaA1 = c.FormulaA1; cellsToInsert.Add(newKey, newCell); @@ -963,7 +979,7 @@ var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co) ?? Worksheet.Cell(oldKey); - var newCell = new XLCell(Worksheet, newKey, oldCell.Style); + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); newCell.CopyFrom(oldCell); newCell.FormulaA1 = oldCell.FormulaA1; cellsToInsert.Add(newKey, newCell); @@ -984,7 +1000,7 @@ { int newRow = c.Address.RowNumber + numberOfRows; var newKey = new XLAddress(Worksheet, newRow, c.Address.ColumnNumber, false, false); - var newCell = new XLCell(Worksheet, newKey, c.Style); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); newCell.CopyFrom(c); newCell.FormulaA1 = c.FormulaA1; cellsToInsert.Add(newKey, newCell); @@ -1116,7 +1132,7 @@ var newKey = new XLAddress(Worksheet, c.Address.RowNumber - rowModifier, c.Address.ColumnNumber - columnModifier, false, false); - var newCell = new XLCell(Worksheet, newKey, c.Style); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); newCell.CopyValues(c); newCell.FormulaA1 = c.FormulaA1; cellsToDelete.Add(c.Address); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index c6bd563..70fa176 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -34,7 +34,7 @@ else { //_style = new XLStyle(this, xlRowParameters.DefaultStyle); - SetStyle(xlRowParameters.DefaultStyle ?? Worksheet.Style); + SetStyle(xlRowParameters.DefaultStyleId); _height = xlRowParameters.Worksheet.RowHeight; } } @@ -49,7 +49,7 @@ _collapsed = row._collapsed; _isHidden = row._isHidden; _outlineLevel = row._outlineLevel; - SetStyle(row.Style ?? Worksheet.Style); + SetStyle(row.GetStyleId()); } #endregion diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowParameters.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowParameters.cs index 0b2d13e..99d1603 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowParameters.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowParameters.cs @@ -5,14 +5,14 @@ { internal class XLRowParameters { - public XLRowParameters(XLWorksheet worksheet, IXLStyle defaultStyle, Boolean isReference = true) + public XLRowParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference = true) { Worksheet = worksheet; - DefaultStyle = defaultStyle; + DefaultStyleId = defaultStyleId; IsReference = isReference; } - public IXLStyle DefaultStyle { get; set; } + public Int32 DefaultStyleId { get; set; } public XLWorksheet Worksheet { get; private set; } public Boolean IsReference { get; private set; } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index 81abe5c..7e66a29 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -2510,7 +2510,8 @@ #region Columns if (xlWorksheet.Internals.CellsCollection.Count == 0 && - xlWorksheet.Internals.ColumnsCollection.Count == 0) + xlWorksheet.Internals.ColumnsCollection.Count == 0 + && xlWorksheet.Style.Equals(DefaultStyle)) worksheetPart.Worksheet.RemoveAllChildren(); else { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index df3b8a9..9aae4f2 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -80,7 +80,7 @@ #endregion - private IXLStyle _style; + //private IXLStyle _style; public XLWorksheetInternals Internals { get; private set; } public override IEnumerable Styles @@ -125,24 +125,24 @@ public XLWorkbook Workbook { get; private set; } - private Int32 _styleCacheId; - public new Int32 GetStyleId() - { - if (StyleChanged) - SetStyle(Style); + //private Int32 _styleCacheId; + //public new Int32 GetStyleId() + //{ + // if (StyleChanged) + // SetStyle(Style); - return _styleCacheId; - } - private new void SetStyle(IXLStyle styleToUse) - { - _styleCacheId = Worksheet.Workbook.GetStyleId(styleToUse); - _style = null; - StyleChanged = false; - } - private new IXLStyle GetStyle() - { - return _style ?? (_style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId))); - } + // return _styleCacheId; + //} + //private new void SetStyle(IXLStyle styleToUse) + //{ + // _styleCacheId = Worksheet.Workbook.GetStyleId(styleToUse); + // _style = null; + // StyleChanged = false; + //} + //private new IXLStyle GetStyle() + //{ + // return _style ?? (_style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId))); + //} public override IXLStyle Style { @@ -474,15 +474,16 @@ if (column <= 0 || column > ExcelHelper.MaxColumnNumber) throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", ExcelHelper.MaxColumnNumber)); + Int32 thisStyleId = GetStyleId(); if (!Internals.ColumnsCollection.ContainsKey(column)) { // This is a new row so we're going to reference all // cells in this row to preserve their formatting Internals.RowsCollection.Keys.ForEach(r => Cell(r, column)); - Internals.ColumnsCollection.Add(column, new XLColumn(column, new XLColumnParameters(this, Style, false))); + Internals.ColumnsCollection.Add(column, new XLColumn(column, new XLColumnParameters(this, thisStyleId, false))); } - return new XLColumn(column, new XLColumnParameters(this, Style, true)); + return new XLColumn(column, new XLColumnParameters(this, thisStyleId, true)); } IXLColumn IXLWorksheet.Column(Int32 column) @@ -1110,9 +1111,10 @@ if(row <= 0 || row > ExcelHelper.MaxRowNumber) throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", ExcelHelper.MaxRowNumber)); - IXLStyle styleToUse; - if (Internals.RowsCollection.ContainsKey(row)) - styleToUse = Internals.RowsCollection[row].Style; + Int32 styleId; + XLRow rowToUse; + if (Internals.RowsCollection.TryGetValue(row, out rowToUse)) + styleId = rowToUse.GetStyleId(); else { if (pingCells) @@ -1128,11 +1130,11 @@ usedColumns.ForEach(c => Cell(row, c)); } - styleToUse = Style; - Internals.RowsCollection.Add(row, new XLRow(row, new XLRowParameters(this, styleToUse, false))); + styleId = GetStyleId(); + Internals.RowsCollection.Add(row, new XLRow(row, new XLRowParameters(this, styleId, false))); } - return new XLRow(row, new XLRowParameters(this, styleToUse)); + return new XLRow(row, new XLRowParameters(this, styleId)); } private IXLRange GetRangeForSort() diff --git a/ClosedXML/ClosedXML/ClosedXML/Properties/AssemblyInfo.cs b/ClosedXML/ClosedXML/ClosedXML/Properties/AssemblyInfo.cs index e5f5e2a..f3d1841 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Properties/AssemblyInfo.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Properties/AssemblyInfo.cs @@ -31,6 +31,6 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.57.3.0")] -[assembly: AssemblyFileVersion("0.57.3.0")] +[assembly: AssemblyVersion("0.58.0.0")] +[assembly: AssemblyFileVersion("0.58.0.0")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ClosedXML_Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1fb8ba59167fe734d64128ca73d32c45cb8a117246d09c95c8769db88fe332b0a3396bedd0ea48ee42b0e5796fec0798ca5cb628a9a6de80d35d6c67b936ca1670347b3d4f2b769c8ce2ddcf959dbac6bcd88e6c08751ea1fffa0522de3507193e7035305a8aa008d6c88cca1341b3120fa9c347ab3f97e2d772e2709277da5")] \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj index 1c8ef9c..4730c6c 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -197,6 +197,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Styles/PurpleWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Styles/PurpleWorksheet.cs new file mode 100644 index 0000000..fa4e674 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Styles/PurpleWorksheet.cs @@ -0,0 +1,19 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class PurpleWorksheet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Purple Worksheet"); + + ws.Style.Fill.BackgroundColor = XLColor.Purple; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Net3.5/Properties/AssemblyInfo.cs b/ClosedXML/ClosedXML/ClosedXML_Net3.5/Properties/AssemblyInfo.cs index 8f835bb..046f2c4 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Net3.5/Properties/AssemblyInfo.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Net3.5/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.57.3.0")] -[assembly: AssemblyFileVersion("0.57.3.0")] +[assembly: AssemblyVersion("0.58.0.0")] +[assembly: AssemblyFileVersion("0.58.0.0")] diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj index dbeda88..951e44c 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -191,6 +191,7 @@ +