diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs index 08a5c1e..3aac78e 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/IXLCell.cs @@ -308,5 +308,8 @@ IXLConditionalFormat AddConditionalFormat(); void Select(); + + Boolean Active { get; set; } + IXLCell SetActive(Boolean value = true); } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index 70d3cf7..1d33b47 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -2360,5 +2360,24 @@ using (var r = AsRange()) return r.AddConditionalFormat(); } + + public Boolean Active + { + get { return Worksheet.ActiveCell == this; } + set + { + if (value) + Worksheet.ActiveCell = this; + else if (Active) + Worksheet.ActiveCell = null; + + } + } + + public IXLCell SetActive(Boolean value = true) + { + Active = value; + return this; + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCells.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCells.cs index d768af2..50e4f09 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCells.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCells.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; namespace ClosedXML.Excel { @@ -276,18 +277,8 @@ public void Select() { - var worksheets = new HashSet(); - foreach (var range in this) - { - var worksheet = range.Worksheet as XLWorksheet; - if (!worksheets.Contains(worksheet)) - { - worksheet.SelectedRanges = new XLRanges(); - worksheets.Add(worksheet); - } - - worksheet.SelectedRanges.Add(range); - } + foreach (var cell in this) + cell.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs index e089e32..bd9917e 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs @@ -282,7 +282,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs index 8fe6448..0197791 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs @@ -363,5 +363,6 @@ IXLConditionalFormats ConditionalFormats { get; } IXLRanges SelectedRanges { get; } + IXLCell ActiveCell { get; set; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index 8c7947d..70de835 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -1907,7 +1907,7 @@ public void Select() { - Worksheet.SelectedRanges = new XLRanges {this}; + Worksheet.SelectedRanges.Add(AsRange()); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumns.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumns.cs index 846b00a..cb9208f 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumns.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumns.cs @@ -140,7 +140,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRows.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRows.cs index a87f931..29ede5c 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRows.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRows.cs @@ -140,7 +140,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs index 8ce3f40..a4b012c 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRanges.cs @@ -234,7 +234,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs index b896bed..232de05 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs @@ -273,7 +273,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Tables/XLTableRows.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Tables/XLTableRows.cs index 7c436be..e5905c4 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Tables/XLTableRows.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Tables/XLTableRows.cs @@ -122,7 +122,8 @@ public void Select() { - XLHelper.AddSelection(this); + foreach (var range in this) + range.Select(); } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index 83c249a..d346471 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -1601,8 +1601,9 @@ { if (selection.SequenceOfReferences != null) ws.Ranges(selection.SequenceOfReferences.InnerText.Replace(" ", ",")).Select(); - else if (selection.ActiveCell != null) - ws.Cell(selection.ActiveCell).Select(); + + if (selection.ActiveCell != null) + ws.Cell(selection.ActiveCell).SetActive(); } var pane = sheetView.Elements().FirstOrDefault(); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index a9d360a..8cfe1f4 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -3645,20 +3645,26 @@ sheetView.TabSelected = xlWorksheet.TabSelected; - if (xlWorksheet.SelectedRanges != null && xlWorksheet.SelectedRanges.Any()) + if (xlWorksheet.SelectedRanges.Any() || xlWorksheet.ActiveCell != null) { sheetView.RemoveAllChildren(); - var sb = new StringBuilder(); - foreach (var range in xlWorksheet.SelectedRanges) + + var firstSelection = xlWorksheet.SelectedRanges.FirstOrDefault(); + var selection = new Selection(); + if (xlWorksheet.ActiveCell != null) + selection.ActiveCell = xlWorksheet.ActiveCell.Address.ToStringRelative(false); + else if (firstSelection != null) + selection.ActiveCell = firstSelection.RangeAddress.FirstAddress.ToStringRelative(false); + + + var seqRef = new List {selection.ActiveCell.Value}; + if (xlWorksheet.SelectedRanges.Any()) { - sb.Append(range.RangeAddress.ToStringRelative(false)); - sb.Append(" "); + seqRef.AddRange(xlWorksheet.SelectedRanges.Select(range => range.RangeAddress.ToStringRelative(false))); } - var selection = new Selection - { - ActiveCell = xlWorksheet.SelectedRanges.First().FirstCell().Address.ToStringRelative(false), - SequenceOfReferences = new ListValue {InnerText = sb.ToString().TrimEnd()} - }; + + selection.SequenceOfReferences = new ListValue {InnerText = String.Join(" ", seqRef.Distinct().ToArray())}; + sheetView.Append(selection); } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 34fb755..308da07 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -79,6 +79,7 @@ ShowZeros = workbook.ShowZeros; RightToLeft = workbook.RightToLeft; TabColor = new XLColor(); + SelectedRanges = new XLRanges(); } #endregion @@ -1386,9 +1387,9 @@ { EventTrackingEnabled = _eventTracking; } - - public IXLRanges SelectedRanges { get; internal set; } + + public IXLCell ActiveCell { get; set; } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs b/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs index 225f52e..7aa3828 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs +++ b/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs @@ -214,21 +214,7 @@ return rows; } - internal static void AddSelection(IEnumerable items) where T : IXLRangeBase - { - var worksheets = new HashSet(); - foreach (var range in items) - { - var worksheet = range.Worksheet as XLWorksheet; - if (!worksheets.Contains(worksheet)) - { - worksheet.SelectedRanges = new XLRanges(); - worksheets.Add(worksheet); - } - worksheet.SelectedRanges.Add(range); - } - } public static bool IsNullOrWhiteSpace(string value) { diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj index a1e5278..ee1d408 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -165,6 +165,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Ranges/SelectingRanges.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Ranges/SelectingRanges.cs new file mode 100644 index 0000000..963a3cd --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Ranges/SelectingRanges.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class SelectingRanges : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsActiveCell = wb.AddWorksheet("Set Active Cell"); + wsActiveCell.Cell("B2").SetActive(); + + var wsSelectRowsColumns = wb.AddWorksheet("Select Rows and Columns"); + wsSelectRowsColumns.Rows("2, 4-5").Select(); + wsSelectRowsColumns.Columns("2, 4-5").Select(); + + var wsSelectMisc = wb.AddWorksheet("Select Misc"); + wsSelectMisc.Cell("B2").Select(); + wsSelectMisc.Range("D2:E2").Select(); + wsSelectMisc.Ranges("C3, D4:E5").Select(); + + wb.SaveAs(filePath); + } + + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj index 9858365..28ff5dd 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -234,6 +234,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Examples/RangeTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Examples/RangeTests.cs index 6a8d536..2569679 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Examples/RangeTests.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Examples/RangeTests.cs @@ -89,5 +89,10 @@ TestHelper.RunTestExample(@"Ranges\CurrentRowColumn.xlsx"); } + [TestMethod] + public void SelectingRanges() + { + TestHelper.RunTestExample(@"Ranges\SelectingRanges.xlsx"); + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx new file mode 100644 index 0000000..f70776c --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx Binary files differ