Skip to content

Commit e04130b

Browse files
authored
Merge pull request #8 from muffinman-coder/feature/upgrade-closedxml-performance
- Upgraded ClosedXML from previous version to 0.105.0. - Refactored code to accommodate IXLDefinedName replacing IXLNamedRange. - Includes minor adjustments for compatibility and performance enhancements within dependent library.
2 parents 070ccf3 + 00383d8 commit e04130b

File tree

15 files changed

+65
-45
lines changed

15 files changed

+65
-45
lines changed

ExcelReportGenerator.Tests/CustomAsserts/ExcelAssert.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ private static void AreMergedRangesEqual(IXLRanges expected, IXLRanges actual)
215215
}
216216
}
217217

218-
public static void AreNamedRangesEqual(IXLNamedRanges expected, IXLNamedRanges actual)
218+
public static void AreNamedRangesEqual(IXLDefinedNames expected, IXLDefinedNames actual)
219219
{
220220
Assert.AreEqual(expected.Count(), actual.Count(), "Worksheet named ranges count failed");
221221
foreach (var expectedNamedRange in expected)

ExcelReportGenerator.Tests/Excel/ExcelHelperTest.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -937,9 +937,6 @@ public void TestMergeRanges()
937937

938938
range1.Delete(XLShiftDeletedCells.ShiftCellsLeft);
939939

940-
Assert.AreEqual(range2, ExcelHelper.MergeRanges(range1, range2));
941-
Assert.IsNull(ExcelHelper.MergeRanges(range1, null));
942-
943940
range1 = ws.Range(3, 3, 5, 5);
944941
range2.Delete(XLShiftDeletedCells.ShiftCellsLeft);
945942

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Globalization;
2+
3+
namespace ExcelReportGenerator.Tests
4+
{
5+
[SetUpFixture]
6+
public class GlobalSetup
7+
{
8+
[OneTimeSetUp]
9+
public void SetUp()
10+
{
11+
var culture = new CultureInfo("ka-GE");
12+
13+
CultureInfo.CurrentCulture = culture;
14+
CultureInfo.CurrentUICulture = culture;
15+
16+
culture.DateTimeFormat.ShortTimePattern = "H:mm:ss";
17+
culture.DateTimeFormat.LongTimePattern = "H:mm:ss";
18+
19+
Thread.CurrentThread.CurrentCulture = culture;
20+
Thread.CurrentThread.CurrentUICulture = culture;
21+
}
22+
}
23+
}

ExcelReportGenerator.Tests/Rendering/DefaultReportGeneratorTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public void TestGetPanelsNamedRanges()
166166
var method = reportGenerator.GetType()
167167
.GetMethod("GetPanelsNamedRanges", BindingFlags.Instance | BindingFlags.NonPublic);
168168

169-
var result = (IList<IXLNamedRange>) method.Invoke(reportGenerator, new object[] {ws.NamedRanges});
169+
var result = (IList<IXLDefinedName>) method.Invoke(reportGenerator, new object[] {ws.NamedRanges});
170170

171171
Assert.AreEqual(6, result.Count);
172172
Assert.AreEqual("s_Panel1", result[0].Name);
@@ -193,7 +193,7 @@ public void TestGetRootRange()
193193
Assert.AreEqual(ws.Range(ws.FirstCell(), ws.Cell(10, 10)),
194194
method.Invoke(reportGenerator, new object[] {ws, null}));
195195

196-
var namedRanges = new List<IXLNamedRange>();
196+
var namedRanges = new List<IXLDefinedName>();
197197
Assert.AreEqual(ws.Range(ws.FirstCell(), ws.Cell(10, 10)),
198198
method.Invoke(reportGenerator, new object[] {ws, namedRanges}));
199199

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void TestGroupResultVertical()
221221
ws.Range(6, 12, 7, 12).Merge();
222222
ws.Range(9, 12, 10,12).Merge();
223223

224-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
224+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
225225
Substitute.For<ITemplateProcessor>())
226226
{
227227
GroupBy = "1,2, 3 , 4,5,6,7,8,9,10,11",
@@ -291,7 +291,7 @@ public void TestGroupResultVertical_WithoutGroupingBlankValues()
291291

292292
ws.Range(2, 7, 3, 7).Merge();
293293

294-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
294+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
295295
Substitute.For<ITemplateProcessor>())
296296
{
297297
GroupBy = "1,2, 3 , 4,5,6",
@@ -414,7 +414,7 @@ public void TestGroupResultHorizontal()
414414
ws.Range(12, 6, 12, 7).Merge();
415415
ws.Range(12, 9, 12, 10).Merge();
416416

417-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
417+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
418418
Substitute.For<ITemplateProcessor>())
419419
{
420420
GroupBy = "1,2, 3 , 4,5,6,7,8,9,10,11",
@@ -485,7 +485,7 @@ public void TestGroupResultHorizontal_WithoutGroupingBlankValues()
485485

486486
ws.Range(7, 2, 7, 3).Merge();
487487

488-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
488+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
489489
Substitute.For<ITemplateProcessor>())
490490
{
491491
GroupBy = "1,2, 3 , 4,5,6",
@@ -527,7 +527,7 @@ public void TestIfGroupByPropertyIsEmpty()
527527
ws.Cell(8, 3).Value = "Pear";
528528
ws.Cell(9, 3).Value = "Pear";
529529

530-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
530+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
531531
Substitute.For<ITemplateProcessor>()) {GroupBy = null};
532532

533533
var method = panel.GetType().GetMethod("GroupResult", BindingFlags.Instance | BindingFlags.NonPublic);
@@ -536,14 +536,14 @@ public void TestIfGroupByPropertyIsEmpty()
536536

537537
Assert.AreEqual(0, ws.MergedRanges.Count);
538538

539-
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
539+
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
540540
Substitute.For<ITemplateProcessor>()) {GroupBy = string.Empty};
541541
SetResultRange(panel, range);
542542
method.Invoke(panel, null);
543543

544544
Assert.AreEqual(0, ws.MergedRanges.Count);
545545

546-
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
546+
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
547547
Substitute.For<ITemplateProcessor>()) {GroupBy = " "};
548548
SetResultRange(panel, range);
549549
method.Invoke(panel, null);
@@ -563,15 +563,15 @@ public void TestIfGroupByPropertyIsInvalid()
563563
ws.Cell(2, 2).Value = "One";
564564
ws.Cell(3, 2).Value = "One";
565565

566-
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
566+
var panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
567567
Substitute.For<ITemplateProcessor>()) {GroupBy = "str"};
568568
var method = panel.GetType().GetMethod("GroupResult", BindingFlags.Instance | BindingFlags.NonPublic);
569569
SetResultRange(panel, range);
570570

571571
ExceptionAssert.ThrowsBaseException<InvalidCastException>(() => method.Invoke(panel, null),
572572
$"Parse \"GroupBy\" property failed. Cannot convert value \"str\" to {nameof(Int32)}");
573573

574-
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLNamedRange>(), new object(),
574+
panel = new ExcelDataSourcePanel("Stub", Substitute.For<IXLDefinedName>(), new object(),
575575
Substitute.For<ITemplateProcessor>()) {GroupBy = "1, 1.4"};
576576
SetResultRange(panel, range);
577577

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public void TestDoAggregation()
132132
dataTable.Rows.Add(null, null, null, null);
133133
dataTable.Rows.Add(2, 30.9m, "def", false);
134134

135-
var totalPanel = new ExcelTotalsPanel(dataTable, Substitute.For<IXLNamedRange>(), Substitute.For<object>(),
135+
var totalPanel = new ExcelTotalsPanel(dataTable, Substitute.For<IXLDefinedName>(), Substitute.For<object>(),
136136
new TestReport().TemplateProcessor);
137137
IEnumerator enumerator = EnumeratorFactory.Create(dataTable);
138138
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>
@@ -208,7 +208,7 @@ public void TestDoAggregation()
208208
public void TestDoAggregationWithEmptyData()
209209
{
210210
var data = new List<Test>();
211-
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLNamedRange>(), Substitute.For<object>(),
211+
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLDefinedName>(), Substitute.For<object>(),
212212
Substitute.For<ITemplateProcessor>());
213213
IEnumerator enumerator = EnumeratorFactory.Create(data);
214214
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>
@@ -235,7 +235,7 @@ public void TestDoAggregationWithIntData()
235235
{
236236
var data = new DataProvider().GetIntData();
237237

238-
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLNamedRange>(), Substitute.For<object>(),
238+
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLDefinedName>(), Substitute.For<object>(),
239239
new TestReport().TemplateProcessor);
240240
IEnumerator enumerator = EnumeratorFactory.Create(data);
241241
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>
@@ -256,7 +256,7 @@ public void TestDoAggregationWithBadData()
256256
{
257257
var data = GetTestData();
258258

259-
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLNamedRange>(), Substitute.For<object>(),
259+
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLDefinedName>(), Substitute.For<object>(),
260260
new TestReport().TemplateProcessor);
261261
IEnumerator enumerator = EnumeratorFactory.Create(data);
262262
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>
@@ -292,7 +292,7 @@ public void TestCustomAggregation()
292292
{
293293
var data = GetTestData();
294294

295-
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLNamedRange>(), new TestReportForAggregation(),
295+
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLDefinedName>(), new TestReportForAggregation(),
296296
new TestReport().TemplateProcessor);
297297
IEnumerator enumerator = EnumeratorFactory.Create(data);
298298
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>
@@ -337,7 +337,7 @@ public void TestAggregationPostOperation()
337337
{
338338
var data = GetTestData();
339339

340-
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLNamedRange>(), new TestReportForAggregation(),
340+
var totalPanel = new ExcelTotalsPanel(data, Substitute.For<IXLDefinedName>(), new TestReportForAggregation(),
341341
new TestReport().TemplateProcessor);
342342
IEnumerator enumerator = EnumeratorFactory.Create(data);
343343
IList<ExcelTotalsPanel.ParsedAggregationFunc> totalCells = new List<ExcelTotalsPanel.ParsedAggregationFunc>

ExcelReportGenerator.Tests/Rendering/Panels/ExcelPanels/PanelRenderTests/TotalsPanelRenderTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ private class TestClassForTotals
151151
{
152152
public string Meth(double param1, decimal param2)
153153
{
154-
return ((decimal) param1 + param2).ToString("F");
154+
return ((decimal) param1 + param2).ToString("F2");
155155
}
156156

157157
public decimal Round(decimal input, int precision)

ExcelReportGenerator/Excel/ExcelHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public static RangeCoords GetRangeCoordsRelativeParent(IXLRange parentRange, IXL
6969
return new RangeCoords(firstCell, lastCell);
7070
}
7171

72-
public static IXLNamedRange CopyNamedRange(IXLNamedRange namedRange, IXLCell cell, string name)
72+
public static IXLDefinedName CopyNamedRange(IXLDefinedName namedRange, IXLCell cell, string name)
7373
{
7474
IXLRange newRange = CopyRange(namedRange.Ranges.ElementAt(0), cell);
7575
newRange.AddToNamed(name, XLScope.Worksheet);
@@ -219,7 +219,7 @@ public static IXLRange MoveRange(IXLRange range, IXLCell cell)
219219
}
220220
}
221221

222-
public static IXLNamedRange MoveNamedRange(IXLNamedRange namedRange, IXLCell cell)
222+
public static IXLDefinedName MoveNamedRange(IXLDefinedName namedRange, IXLCell cell)
223223
{
224224
string name = namedRange.Name;
225225
IXLRange newRange = MoveRange(namedRange.Ranges.ElementAt(0), cell);

ExcelReportGenerator/ExcelReportGenerator.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
</PropertyGroup>
2929

3030
<ItemGroup>
31-
<PackageReference Include="ClosedXML" Version="0.102.2" />
31+
<PackageReference Include="ClosedXML" Version="0.105.0" />
3232
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
3333
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
3434
<None Include="..\README.md" Pack="true" PackagePath="\" />

ExcelReportGenerator/Rendering/DefaultReportGenerator.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public XLWorkbook Render(XLWorkbook reportTemplate, IXLWorksheet[] worksheets =
163163
return reportTemplate;
164164
}
165165

166-
IList<IXLNamedRange> workbookPanels = GetPanelsNamedRanges(reportTemplate.NamedRanges);
166+
IList<IXLDefinedName> workbookPanels = GetPanelsNamedRanges(reportTemplate.NamedRanges);
167167
foreach (IXLWorksheet ws in worksheets)
168168
{
169169
SystemVariableProvider.SheetName = ws.Name;
@@ -176,8 +176,8 @@ public XLWorkbook Render(XLWorkbook reportTemplate, IXLWorksheet[] worksheets =
176176
continue;
177177
}
178178

179-
IList<IXLNamedRange> worksheetPanels = GetPanelsNamedRanges(ws.NamedRanges);
180-
foreach (IXLNamedRange workbookPanel in workbookPanels)
179+
IList<IXLDefinedName> worksheetPanels = GetPanelsNamedRanges(ws.NamedRanges);
180+
foreach (IXLDefinedName workbookPanel in workbookPanels)
181181
{
182182
if (workbookPanel.Ranges.First().Worksheet == ws
183183
&& !worksheetPanels.Any(p => p.Name.Trim().Equals(workbookPanel.Name.Trim(), StringComparison.CurrentCultureIgnoreCase)))
@@ -213,26 +213,26 @@ private void InitDataItemValueProvider()
213213
}
214214
}
215215

216-
private IXLRange GetRootRange(IXLWorksheet ws, IList<IXLNamedRange> worksheetPanels)
216+
private IXLRange GetRootRange(IXLWorksheet ws, IList<IXLDefinedName> worksheetPanels)
217217
{
218-
return ws.Range(ws.FirstCell(), GetRootRangeLastCell(ws.LastCellUsed(), worksheetPanels ?? new List<IXLNamedRange>()));
218+
return ws.Range(ws.FirstCell(), GetRootRangeLastCell(ws.LastCellUsed(), worksheetPanels ?? new List<IXLDefinedName>()));
219219
}
220220

221-
private IXLCell GetRootRangeLastCell(IXLCell lastWorksheetCellUsed, IList<IXLNamedRange> worksheetPanels)
221+
private IXLCell GetRootRangeLastCell(IXLCell lastWorksheetCellUsed, IList<IXLDefinedName> worksheetPanels)
222222
{
223223
return ExcelHelper.GetMaxCell(worksheetPanels.SelectMany(p => p.Ranges.First().Cells()).Concat(new[] { lastWorksheetCellUsed }).ToArray());
224224
}
225225

226-
private IList<IXLNamedRange> GetPanelsNamedRanges(IXLNamedRanges namedRanges)
226+
private IList<IXLDefinedName> GetPanelsNamedRanges(IXLDefinedNames namedRanges)
227227
{
228228
return namedRanges.Where(r => Regex.IsMatch(r.Name, PanelsRegexPattern, RegexOptions.IgnoreCase)).ToList();
229229
}
230230

231-
private IDictionary<string, (IExcelPanel, string)> GetPanelsFlatView(IEnumerable<IXLNamedRange> panelsNamedRanges)
231+
private IDictionary<string, (IExcelPanel, string)> GetPanelsFlatView(IEnumerable<IXLDefinedName> panelsNamedRanges)
232232
{
233233
var panelFactory = new ExcelPanelFactory(Report, TemplateProcessor, PanelParsingSettings);
234234
IDictionary<string, (IExcelPanel, string)> panels = new Dictionary<string, (IExcelPanel, string)>();
235-
foreach (IXLNamedRange namedRange in panelsNamedRanges)
235+
foreach (IXLDefinedName namedRange in panelsNamedRanges)
236236
{
237237
IDictionary<string, string> panelProperties = PanelPropertiesParser.Parse(namedRange.Comment);
238238
IExcelPanel panel = panelFactory.Create(namedRange, panelProperties);

0 commit comments

Comments
 (0)