diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index c52ace6..38ec9cb 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -144,10 +144,7 @@ get { using (var asRange = AsRange()) - { - - } - return AsRange().DataValidation; + return asRange.DataValidation; } } @@ -1199,7 +1196,7 @@ Worksheet.Cell( Address.RowNumber + sourceCell.Address.RowNumber - minRow, Address.ColumnNumber + sourceCell.Address.ColumnNumber - minColumn - ).CopyFrom(sourceCell); + ).CopyFrom(sourceCell, true); } var rangesToMerge = (from mergedRange in (asRange.Worksheet).Internals.MergedRanges @@ -1557,7 +1554,7 @@ _comment = source._comment == null ? null : new XLComment(this, source._comment, source.Style.Font); } - public IXLCell CopyFrom(XLCell otherCell) + public IXLCell CopyFrom(XLCell otherCell, Boolean copyDataValidations) { var source = otherCell; _cellValue = source._cellValue; @@ -1575,12 +1572,15 @@ SettingHyperlink = false; } - using (var asRange = source.AsRange()) + if (copyDataValidations) { - //if (DataValidation != source.DataValidation && source.Worksheet.DataValidations.Any(dv => dv.Ranges.Contains(asRange))) - if (source.Worksheet.DataValidations.Any(dv => dv.Ranges.Contains(asRange))) - DataValidation.CopyFrom(source.DataValidation); + using (var asRange = AsRange()) + { + if (source.Worksheet.DataValidations.Any(dv => dv.Ranges.Contains(asRange))) + DataValidation.CopyFrom(source.Worksheet.DataValidations.First(dv => dv.Ranges.Contains(asRange))); + } } + return this; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs index f0c9d81..c01dbf0 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/DataValidation/XLDataValidation.cs @@ -149,13 +149,17 @@ { if (dataValidation == this) return; - if (Ranges != null) - Ranges.Dispose(); + //if (Ranges != null) + // Ranges.Dispose(); - Ranges = new XLRanges(); - - if (dataValidation.Ranges != null) + //Ranges = new XLRanges(); + + if (Ranges == null && dataValidation.Ranges != null) + { + Ranges = new XLRanges(); dataValidation.Ranges.ForEach(r => Ranges.Add(r)); + } + IgnoreBlanks = dataValidation.IgnoreBlanks; InCellDropdown = dataValidation.InCellDropdown; @@ -170,6 +174,7 @@ Operator = dataValidation.Operator; MinValue = dataValidation.MinValue; MaxValue = dataValidation.MaxValue; + } public void Clear() diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs index 35fe7d9..16322ee 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs @@ -716,7 +716,7 @@ var newKey = rngToTranspose.Cell(co, ro).Address; // new XLAddress(Worksheet, c.Address.ColumnNumber, c.Address.RowNumber); var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyFrom(oldCell); + newCell.CopyFrom(oldCell, true); 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 a2e661e..2cc1369 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -83,11 +83,6 @@ { get { - using (var thisRange = AsRange()) - { - if (Worksheet.DataValidations.ContainsSingle(thisRange)) - return Worksheet.DataValidations.Single(dv => dv.Ranges.Contains(thisRange)) as XLDataValidation; - } var dvEmpty = new List(); foreach (IXLDataValidation dv in Worksheet.DataValidations) { @@ -1096,7 +1091,7 @@ Worksheet.Cell(oldKey); var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyFrom(oldCell); + newCell.CopyFrom(oldCell, true); newCell.FormulaA1 = oldCell.FormulaA1; cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(oldKey); @@ -1115,7 +1110,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.GetStyleId()); - newCell.CopyFrom(c); + newCell.CopyFrom(c, true); newCell.FormulaA1 = c.FormulaA1; cellsToInsert.Add(newKey, newCell); cellsToDelete.Add(c.Address); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs index 59c47e9..8c68c0e 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs @@ -68,7 +68,7 @@ public Boolean Contains(IXLRange range) { - return _ranges.Any(r => !r.RangeAddress.IsInvalid && r.Equals(range)); + return _ranges.Any(r => !r.RangeAddress.IsInvalid && r.Contains(range)); } public IXLDataValidation DataValidation diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 3a8912d..40f41db 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -550,7 +550,7 @@ { var targetSheet = (XLWorksheet)workbook.WorksheetsInternal.Add(newSheetName, position); - Internals.CellsCollection.GetCells().ForEach(c => targetSheet.Cell(c.Address).CopyFrom(c)); + Internals.CellsCollection.GetCells().ForEach(c => targetSheet.Cell(c.Address).CopyFrom(c, false)); DataValidations.ForEach(dv => targetSheet.DataValidations.Add(new XLDataValidation(dv))); Internals.ColumnsCollection.ForEach( kp => targetSheet.Internals.ColumnsCollection.Add(kp.Key, new XLColumn(kp.Value))); diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/DataValidation.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/DataValidation.cs index 5606a69..a4e9935 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/DataValidation.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/DataValidation.cs @@ -92,7 +92,7 @@ var rng3Validation = rng3.DataValidation; rng3Validation.Decimal.EqualTo(3); rng3Validation.IgnoreBlanks = true; - + var rng4 = ws2.Range("D5:D6"); //rng4.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); var rng4Validation = rng4.DataValidation; @@ -119,6 +119,10 @@ ws.CopyTo(ws.Name + " - Copy"); ws2.CopyTo(ws2.Name + " - Copy"); + + var ws3 = wb.AddWorksheet("Copy From Range"); + ws3.FirstCell().Value = ws2.RangeUsed(true); + wb.SaveAs(filePath); } diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx index 6ad73db..431dd05 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx Binary files differ