Skip to content

Commit 07293c9

Browse files
authored
Fix for grouping Merge2 + added corresponding test (#237)
1 parent 007f6cc commit 07293c9

File tree

2 files changed

+62
-17
lines changed

2 files changed

+62
-17
lines changed

ClosedXML.Report/Excel/Subtotal.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -308,21 +308,29 @@ public SubtotalGroup[] ScanForGroups(int groupBy)
308308

309309
var groupRng = Sheet.Range(moveData.SourceAddress);
310310

311-
var cuttingGroups = _groups.Where(g => moveData.SourceAddress.Contains(g.Range.RangeAddress.LastAddress)).ToArray();
311+
var cuttingGroups = _groups.Select(g => g.Range.RangeAddress.LastAddress)
312+
.Distinct()
313+
.Where(address => moveData.SourceAddress.Contains(address))
314+
.OrderBy(address => address.RowNumber)
315+
.ToArray();
312316
if (cuttingGroups.Any())
313317
{
314318
var startAddress = moveData.SourceAddress.FirstAddress;
315319
foreach (var g in cuttingGroups)
316320
{
317-
groupRng = Sheet.Range(startAddress, g.Range.RangeAddress.LastAddress);
321+
groupRng = Sheet.Range(startAddress, g);
318322
result.Add(new SubtotalGroup(level, groupBy, moveData.GroupTitle, groupRng, null, false));
319-
startAddress = g.Range.LastCell().WorksheetRow().RowBelow()
323+
startAddress = Sheet.Cell(g).WorksheetRow().RowBelow()
320324
.Cell(startAddress.ColumnNumber).Address;
321325
}
322-
groupRng = Sheet.Range(startAddress, moveData.SourceAddress.LastAddress);
326+
327+
groupRng = startAddress.RowNumber <= moveData.SourceAddress.LastAddress.RowNumber
328+
? Sheet.Range(startAddress, moveData.SourceAddress.LastAddress)
329+
: null;
323330
}
324331

325-
result.Add(new SubtotalGroup(level, groupBy, moveData.GroupTitle, groupRng, null, false));
332+
if (groupRng != null)
333+
result.Add(new SubtotalGroup(level, groupBy, moveData.GroupTitle, groupRng, null, false));
326334
}
327335

328336
_groups.AddRange(result);

tests/ClosedXML.Report.Tests/SubtotalTests.cs

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,59 @@ public void SummaryAbove()
5757
[Fact]
5858
public void ScanForGroupsTest()
5959
{
60-
LoadTemplate("9_plaindata.xlsx");
60+
void AssertGroup(SubtotalGroup group, string expectedAddress, string expectedTitle)
61+
{
62+
group.Range.RangeAddress.ToString().Should().Be(expectedAddress);
63+
group.Level.Should().Be(1);
64+
group.GroupTitle.Should().Be(expectedTitle);
65+
}
66+
67+
_workbook = new XLWorkbook();
68+
var sheet = _workbook.AddWorksheet("test");
69+
sheet.Range("A2:A5").Value = "val1";
70+
sheet.Range("A6:A9").Value = "val2";
71+
sheet.Range("A10:A13").Value = "val3";
72+
73+
sheet.Range("B2:B4").Value = "val4";
74+
sheet.Range("B5:B11").Value = "val5";
75+
sheet.Range("B12:B13").Value = "val6";
76+
77+
sheet.Range("C2:C3").Value = "val7";
78+
sheet.Range("C4:C6").Value = "val8";
79+
sheet.Range("C7:C8").Value = "val9";
80+
sheet.Range("C9:C12").Value = "val7";
81+
sheet.Range("C13:C13").Value = "val8";
82+
83+
_rng = sheet.Range("A2:C13");
6184

62-
SubtotalGroup[] groups;
6385
using (var subtotal = new Subtotal(_rng))
86+
{
87+
var groups = subtotal.ScanForGroups(1);
88+
groups.Length.Should().Be(3);
89+
AssertGroup(groups[0], "A2:C5", "val1");
90+
AssertGroup(groups[1], "A6:C9", "val2");
91+
AssertGroup(groups[2], "A10:C13", "val3");
92+
6493
groups = subtotal.ScanForGroups(2);
94+
groups.Length.Should().Be(5);
95+
AssertGroup(groups[0], "A2:C4", "val4");
96+
AssertGroup(groups[1], "A5:C5", "val5");
97+
AssertGroup(groups[2], "A6:C9", "val5");
98+
AssertGroup(groups[3], "A10:C11", "val5");
99+
AssertGroup(groups[4], "A12:C13", "val6");
65100

66-
groups.Length.Should().Be(3);
67-
groups[0].Range.RangeAddress.ToString().Should().Be("C3:I26");
68-
groups[0].Level.Should().Be(1);
69-
groups[0].GroupTitle.Should().Be("Central");
70-
groups[1].Range.RangeAddress.ToString().Should().Be("C27:I38");
71-
groups[1].Level.Should().Be(1);
72-
groups[1].GroupTitle.Should().Be("East");
73-
groups[2].Range.RangeAddress.ToString().Should().Be("C39:I44");
74-
groups[2].Level.Should().Be(1);
75-
groups[2].GroupTitle.Should().Be("West");
101+
groups = subtotal.ScanForGroups(3);
102+
groups.Length.Should().Be(9);
103+
AssertGroup(groups[0], "A2:C3", "val7");
104+
AssertGroup(groups[1], "A4:C4", "val8");
105+
AssertGroup(groups[2], "A5:C5", "val8");
106+
AssertGroup(groups[3], "A6:C6", "val8");
107+
AssertGroup(groups[4], "A7:C8", "val9");
108+
AssertGroup(groups[5], "A9:C9", "val7");
109+
AssertGroup(groups[6], "A10:C11", "val7");
110+
AssertGroup(groups[7], "A12:C12", "val7");
111+
AssertGroup(groups[8], "A13:C13", "val8");
112+
}
76113
}
77114

78115
[Fact]

0 commit comments

Comments
 (0)