Skip to content

Commit 76ffe3b

Browse files
committed
Grouping cells takes into account already merged cells + possibility to disable grouping of blank cells
1 parent 9ff393e commit 76ffe3b

File tree

7 files changed

+309
-26
lines changed

7 files changed

+309
-26
lines changed

ExcelReportGenerator.Tests/ExcelReportGenerator.Tests.csproj

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<Using Include="NUnit.Framework"/>
12-
<Using Include="NSubstitute"/>
11+
<Using Include="NUnit.Framework" />
12+
<Using Include="NSubstitute" />
1313
</ItemGroup>
1414

1515
<ItemGroup>
16-
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0"/>
17-
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="7.0.0"/>
18-
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0"/>
19-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0"/>
20-
<PackageReference Include="NSubstitute" Version="5.0.0"/>
21-
<PackageReference Include="NUnit" Version="3.13.3"/>
22-
<PackageReference Include="NUnit3TestAdapter" Version="4.3.1"/>
23-
<PackageReference Include="System.Data.SqlClient" Version="4.8.5"/>
16+
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
17+
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="7.0.0" />
18+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
19+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
20+
<PackageReference Include="NSubstitute" Version="5.0.0" />
21+
<PackageReference Include="NUnit" Version="3.13.3" />
22+
<PackageReference Include="NUnit3TestAdapter" Version="4.3.1" />
23+
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
2424
</ItemGroup>
2525

2626
<ItemGroup>
27-
<ProjectReference Include="..\ExcelReportGenerator\ExcelReportGenerator.csproj"/>
27+
<ProjectReference Include="..\ExcelReportGenerator\ExcelReportGenerator.csproj" />
2828
</ItemGroup>
2929

3030
<ItemGroup>
@@ -343,6 +343,12 @@
343343
<None Update="TestData\TotalsPanelRenderTest\TestPanelWithNullData.xlsx">
344344
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
345345
</None>
346+
<None Update="TestData\ExcelDataSourcePanelTest\TestGroupResultHorizontal_WithoutGroupingBlankValues.xlsx">
347+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
348+
</None>
349+
<None Update="TestData\ExcelDataSourcePanelTest\TestGroupResultVertical_WithoutGroupingBlankValues.xlsx">
350+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
351+
</None>
346352
</ItemGroup>
347353

348354
</Project>

ExcelReportGenerator.Tests/Rendering/Panels/ExcelPanels/ExcelDataSourcePanelTest.cs

Lines changed: 259 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public void TestGroupResultVertical()
116116
{
117117
var wb = new XLWorkbook();
118118
var ws = wb.AddWorksheet("Test");
119-
var range = ws.Range(2, 2, 9, 6);
119+
var range = ws.Range(2, 2, 9, 12);
120120

121121
ws.Cell(2, 2).Value = "One";
122122
ws.Cell(3, 2).Value = "One";
@@ -164,10 +164,66 @@ public void TestGroupResultVertical()
164164
ws.Cell(8, 6).Value = new DateTime(2018, 2, 21);
165165
ws.Cell(9, 6).Value = new DateTime(2018, 2, 21).ToString();
166166

167+
ws.Cell(1, 7).Value = "One";
168+
ws.Cell(2, 7).Value = "One";
169+
ws.Cell(10, 7).Value = "One";
170+
171+
ws.Range(2, 7, 9, 7).Merge();
172+
173+
ws.Cell(1, 8).Value = "Two";
174+
ws.Cell(2, 8).Value = "Two";
175+
ws.Cell(3, 8).Value = "One";
176+
ws.Cell(10, 8).Value = "One";
177+
178+
ws.Range(3, 8, 9, 8).Merge();
179+
180+
ws.Cell(1, 9).Value = "One";
181+
ws.Cell(2, 9).Value = "One";
182+
ws.Cell(9, 9).Value = "Two";
183+
ws.Cell(10, 9).Value = "Two";
184+
185+
ws.Range(2, 9, 8, 9).Merge();
186+
187+
ws.Cell(1, 10).Value = "One";
188+
ws.Cell(2, 10).Value = "One";
189+
ws.Cell(3, 10).Value = "One";
190+
ws.Cell(6, 10).Value = "One";
191+
ws.Cell(8, 10).Value = "Two";
192+
ws.Cell(9, 10).Value = "Two";
193+
ws.Cell(10, 10).Value = "Two";
194+
195+
ws.Range(3, 10, 5, 10).Merge();
196+
ws.Range(6, 10, 7, 10).Merge();
197+
198+
ws.Cell(1, 11).Value = "Two";
199+
ws.Cell(2, 11).Value = "Two";
200+
ws.Cell(3, 11).Value = "One";
201+
ws.Cell(5, 11).Value = "One";
202+
ws.Cell(6, 11).Value = "One";
203+
ws.Cell(8, 11).Value = "Two";
204+
ws.Cell(9, 11).Value = "Two";
205+
ws.Cell(10, 11).Value = "Two";
206+
207+
ws.Range(3, 11, 4, 11).Merge();
208+
ws.Range(6, 11, 8, 11).Merge();
209+
210+
ws.Cell(1, 12).Value = "One";
211+
ws.Cell(2, 12).Value = "One";
212+
ws.Cell(3, 12).Value = "One";
213+
ws.Cell(6, 12).Value = "One";
214+
ws.Cell(8, 12).Value = "Two";
215+
ws.Cell(9, 12).Value = "Two";
216+
ws.Cell(10, 12).Value = "Two";
217+
218+
ws.Range(1, 12, 2, 12).Merge();
219+
ws.Range(3, 12, 5, 12).Merge();
220+
ws.Range(6, 12, 7, 12).Merge();
221+
ws.Range(9, 12, 10,12).Merge();
222+
167223
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
168224
Substitute.For<ITemplateProcessor>())
169225
{
170-
GroupBy = "1,2, 3 , 4,5"
226+
GroupBy = "1,2, 3 , 4,5,6,7,8,9,10,11",
171227
};
172228

173229
var method = panel.GetType().GetMethod("GroupResult", BindingFlags.Instance | BindingFlags.NonPublic);
@@ -180,12 +236,83 @@ public void TestGroupResultVertical()
180236
//wb.SaveAs("test.xlsx");
181237
}
182238

239+
[Test]
240+
public void TestGroupResultVertical_WithoutGroupingBlankValues()
241+
{
242+
var wb = new XLWorkbook();
243+
var ws = wb.AddWorksheet("Test");
244+
var range = ws.Range(2, 2, 9, 7);
245+
246+
ws.Cell(2, 2).Value = "One";
247+
ws.Cell(3, 2).Value = "One";
248+
ws.Cell(4, 2).Value = "Two";
249+
ws.Cell(5, 2).Value = "Three";
250+
ws.Cell(6, 2).Value = "Three";
251+
ws.Cell(7, 2).Value = "Three";
252+
253+
ws.Range(5, 2, 6, 2).Merge();
254+
255+
ws.Cell(2, 3).Value = "Orange";
256+
ws.Cell(3, 3).Value = "Apple";
257+
ws.Cell(4, 3).Value = "Apple";
258+
ws.Cell(5, 3).Value = Blank.Value;
259+
ws.Cell(6, 3).Value = Blank.Value;
260+
ws.Cell(8, 3).Value = "Pear";
261+
ws.Cell(9, 3).Value = "Pear";
262+
263+
ws.Cell(2, 4).Value = true;
264+
ws.Cell(3, 4).Value = true;
265+
ws.Cell(4, 4).Value = 1;
266+
ws.Cell(7, 4).Value = 0;
267+
ws.Cell(8, 4).Value = false;
268+
ws.Cell(9, 4).Value = false;
269+
270+
ws.Cell(2, 5).Value = 1;
271+
ws.Cell(3, 5).Value = 1;
272+
ws.Cell(4, 5).Value = 1;
273+
ws.Cell(5, 5).Value = 56;
274+
ws.Cell(6, 5).Value = 56.1;
275+
ws.Cell(7, 5).Value = 56;
276+
ws.Cell(8, 5).Value = 77.7;
277+
ws.Cell(9, 5).Value = 77.7m;
278+
279+
ws.Range(3, 5, 4, 5).Merge();
280+
281+
ws.Cell(2, 6).Value = new DateTime(2018, 2, 18);
282+
ws.Cell(3, 6).Value = new DateTime(2018, 2, 20);
283+
ws.Cell(4, 6).Value = new DateTime(2018, 2, 20);
284+
ws.Cell(5, 6).Value = new DateTime(2018, 2, 18);
285+
286+
ws.Range(6, 6, 8, 6).Merge();
287+
288+
ws.Cell(5, 7).Value = "Value";
289+
ws.Cell(6, 7).Value = "Value";
290+
291+
ws.Range(2, 7, 3, 7).Merge();
292+
293+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
294+
Substitute.For<ITemplateProcessor>())
295+
{
296+
GroupBy = "1,2, 3 , 4,5,6",
297+
GroupBlankValues = false
298+
};
299+
300+
var method = panel.GetType().GetMethod("GroupResult", BindingFlags.Instance | BindingFlags.NonPublic);
301+
SetResultRange(panel, range);
302+
method.Invoke(panel, null);
303+
304+
ExcelAssert.AreWorkbooksContentEquals(
305+
TestHelper.GetExpectedWorkbook(nameof(ExcelDataSourcePanelTest), nameof(TestGroupResultVertical_WithoutGroupingBlankValues)), wb);
306+
307+
//wb.SaveAs("test.xlsx");
308+
}
309+
183310
[Test]
184311
public void TestGroupResultHorizontal()
185312
{
186313
var wb = new XLWorkbook();
187314
var ws = wb.AddWorksheet("Test");
188-
var range = ws.Range(2, 2, 6, 9);
315+
var range = ws.Range(2, 2, 12, 9);
189316

190317
ws.Cell(2, 2).Value = "One";
191318
ws.Cell(2, 3).Value = "One";
@@ -201,15 +328,12 @@ public void TestGroupResultHorizontal()
201328
ws.Cell(3, 2).Value = "Orange";
202329
ws.Cell(3, 3).Value = "Apple";
203330
ws.Cell(3, 4).Value = "Apple";
204-
ws.Cell(3, 5).Value = Blank.Value;
205-
ws.Cell(3, 6).Value = Blank.Value;
206331
ws.Cell(3, 8).Value = "Pear";
207332
ws.Cell(3, 9).Value = "Pear";
208333

209334
ws.Cell(4, 2).Value = true;
210335
ws.Cell(4, 3).Value = true;
211336
ws.Cell(4, 4).Value = 1;
212-
ws.Cell(4, 5).Value = Blank.Value;
213337
ws.Cell(4, 7).Value = 0;
214338
ws.Cell(4, 8).Value = false;
215339
ws.Cell(4, 9).Value = false;
@@ -233,10 +357,66 @@ public void TestGroupResultHorizontal()
233357
ws.Cell(6, 8).Value = new DateTime(2018, 2, 21);
234358
ws.Cell(6, 9).Value = new DateTime(2018, 2, 21).ToString();
235359

360+
ws.Cell(7, 1).Value = "One";
361+
ws.Cell(7, 2).Value = "One";
362+
ws.Cell(7, 10).Value = "One";
363+
364+
ws.Range(7, 2, 7, 9).Merge();
365+
366+
ws.Cell(8, 1).Value = "Two";
367+
ws.Cell(8, 2).Value = "Two";
368+
ws.Cell(8, 3).Value = "One";
369+
ws.Cell(8, 10).Value = "One";
370+
371+
ws.Range(8, 3, 8, 9).Merge();
372+
373+
ws.Cell(9, 1).Value = "One";
374+
ws.Cell(9, 2).Value = "One";
375+
ws.Cell(9, 9).Value = "Two";
376+
ws.Cell(9, 10).Value = "Two";
377+
378+
ws.Range(9, 2, 9, 8).Merge();
379+
380+
ws.Cell(10, 1).Value = "One";
381+
ws.Cell(10, 2).Value = "One";
382+
ws.Cell(10, 3).Value = "One";
383+
ws.Cell(10, 6).Value = "One";
384+
ws.Cell(10, 8).Value = "Two";
385+
ws.Cell(10, 9).Value = "Two";
386+
ws.Cell(10, 10).Value = "Two";
387+
388+
ws.Range(10, 3, 10, 5).Merge();
389+
ws.Range(10, 6, 10, 7).Merge();
390+
391+
ws.Cell(11, 1).Value = "Two";
392+
ws.Cell(11, 2).Value = "Two";
393+
ws.Cell(11, 3).Value = "One";
394+
ws.Cell(11, 5).Value = "One";
395+
ws.Cell(11, 6).Value = "One";
396+
ws.Cell(11, 8).Value = "Two";
397+
ws.Cell(11, 9).Value = "Two";
398+
ws.Cell(11, 10).Value = "Two";
399+
400+
ws.Range(11, 3, 11, 4).Merge();
401+
ws.Range(11, 6, 11, 8).Merge();
402+
403+
ws.Cell(12, 1).Value = "One";
404+
ws.Cell(12, 2).Value = "One";
405+
ws.Cell(12, 3).Value = "One";
406+
ws.Cell(12, 6).Value = "One";
407+
ws.Cell(12, 8).Value = "Two";
408+
ws.Cell(12, 9).Value = "Two";
409+
ws.Cell(12, 10).Value = "Two";
410+
411+
ws.Range(12, 1, 12, 2).Merge();
412+
ws.Range(12, 3, 12, 5).Merge();
413+
ws.Range(12, 6, 12, 7).Merge();
414+
ws.Range(12, 9, 12, 10).Merge();
415+
236416
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
237417
Substitute.For<ITemplateProcessor>())
238418
{
239-
GroupBy = "1,2, 3 , 4,5",
419+
GroupBy = "1,2, 3 , 4,5,6,7,8,9,10,11",
240420
Type = PanelType.Horizontal
241421
};
242422

@@ -250,6 +430,78 @@ public void TestGroupResultHorizontal()
250430
//wb.SaveAs("test.xlsx");
251431
}
252432

433+
[Test]
434+
public void TestGroupResultHorizontal_WithoutGroupingBlankValues()
435+
{
436+
var wb = new XLWorkbook();
437+
var ws = wb.AddWorksheet("Test");
438+
var range = ws.Range(2, 2, 7, 9);
439+
440+
ws.Cell(2, 2).Value = "One";
441+
ws.Cell(2, 3).Value = "One";
442+
ws.Cell(2, 4).Value = "Two";
443+
ws.Cell(2, 5).Value = "Three";
444+
ws.Cell(2, 6).Value = "Three";
445+
ws.Cell(2, 7).Value = "Three";
446+
447+
ws.Range(2, 5, 2, 6).Merge();
448+
449+
ws.Cell(3, 2).Value = "Orange";
450+
ws.Cell(3, 3).Value = "Apple";
451+
ws.Cell(3, 4).Value = "Apple";
452+
ws.Cell(3, 5).Value = Blank.Value;
453+
ws.Cell(3, 6).Value = Blank.Value;
454+
ws.Cell(3, 8).Value = "Pear";
455+
ws.Cell(3, 9).Value = "Pear";
456+
457+
ws.Cell(4, 2).Value = true;
458+
ws.Cell(4, 3).Value = true;
459+
ws.Cell(4, 4).Value = 1;
460+
ws.Cell(4, 7).Value = 0;
461+
ws.Cell(4, 8).Value = false;
462+
ws.Cell(4, 9).Value = false;
463+
464+
ws.Cell(5, 2).Value = 1;
465+
ws.Cell(5, 3).Value = 1;
466+
ws.Cell(5, 4).Value = 1;
467+
ws.Cell(5, 5).Value = 56;
468+
ws.Cell(5, 6).Value = 56.1;
469+
ws.Cell(5, 7).Value = 56;
470+
ws.Cell(5, 8).Value = 77.7;
471+
ws.Cell(5, 9).Value = 77.7m;
472+
473+
ws.Range(5, 3, 5, 4).Merge();
474+
475+
ws.Cell(6, 2).Value = new DateTime(2018, 2, 18);
476+
ws.Cell(6, 3).Value = new DateTime(2018, 2, 20);
477+
ws.Cell(6, 4).Value = new DateTime(2018, 2, 20);
478+
ws.Cell(6, 5).Value = new DateTime(2018, 2, 18);
479+
480+
ws.Range(6, 6, 6, 8).Merge();
481+
482+
ws.Cell(7, 5).Value = "Value";
483+
ws.Cell(7, 6).Value = "Value";
484+
485+
ws.Range(7, 2, 7, 3).Merge();
486+
487+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
488+
Substitute.For<ITemplateProcessor>())
489+
{
490+
GroupBy = "1,2, 3 , 4,5,6",
491+
GroupBlankValues = false,
492+
Type = PanelType.Horizontal
493+
};
494+
495+
var method = panel.GetType().GetMethod("GroupResult", BindingFlags.Instance | BindingFlags.NonPublic);
496+
SetResultRange(panel, range);
497+
method.Invoke(panel, null);
498+
499+
ExcelAssert.AreWorkbooksContentEquals(
500+
TestHelper.GetExpectedWorkbook(nameof(ExcelDataSourcePanelTest), nameof(TestGroupResultHorizontal_WithoutGroupingBlankValues)), wb);
501+
502+
//wb.SaveAs("test.xlsx");
503+
}
504+
253505
[Test]
254506
public void TestIfGroupByPropertyIsEmpty()
255507
{
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)