From b7322b61567aec8730773c5831951e4f1ebd6e32 Mon Sep 17 00:00:00 2001 From: Igor Date: Sat, 4 Nov 2023 11:16:51 +0300 Subject: [PATCH 1/6] DisableSubtotalLine for grouping. New Tag - "\DisableSubtotalLine" --- ClosedXML.Report/Excel/Subtotal.cs | 21 +++++++++++++++++- ClosedXML.Report/Options/GroupTag.cs | 20 +++++++++++++++-- tests/ClosedXML.Report.Tests/GroupTagTests.cs | 1 + ...TagTests_DisableSubTotals_MergeLabels.xlsx | Bin 0 -> 43041 bytes ...TagTests_DisableSubTotals_MergeLabels.xlsx | Bin 0 -> 22288 bytes 5 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 tests/Gauges/GroupTagTests_DisableSubTotals_MergeLabels.xlsx create mode 100644 tests/Templates/GroupTagTests_DisableSubTotals_MergeLabels.xlsx diff --git a/ClosedXML.Report/Excel/Subtotal.cs b/ClosedXML.Report/Excel/Subtotal.cs index 37949f2..77169c9 100644 --- a/ClosedXML.Report/Excel/Subtotal.cs +++ b/ClosedXML.Report/Excel/Subtotal.cs @@ -351,8 +351,15 @@ private MoveData[] ScanRange(int groupBy) var val = row.Cell(groupBy).GetString(); var isSummaryRow = row.IsSummary(); + var isLeftGroupEndLine = false; + if (false == isSummaryRow) + { + isLeftGroupEndLine = _groups.SingleOrDefault(gr => gr.Column == groupBy - 1 && + gr.SummaryRow == null && + gr.Range.RangeAddress.LastAddress.RowNumber == row.RowNumber()) != null; + } - if (string.IsNullOrEmpty(val) && !isSummaryRow) + if (string.IsNullOrEmpty(val) && !isSummaryRow) { if (groupStart > 0) { @@ -364,6 +371,18 @@ private MoveData[] ScanRange(int groupBy) continue; } + if (isLeftGroupEndLine) + { + var localGroupStart = groupStart == 0 + ? row.RangeAddress.Relative(_range.RangeAddress).FirstAddress.RowNumber + : groupStart; + + groups.Add(CreateMoveTask(groupBy, prevVal, _range.Cell(localGroupStart, 1), row.LastCell(), RangeType.DataRange)); + prevVal = null; + groupStart = 0; + continue; + } + if (val != prevVal) { if (groupStart > 0) diff --git a/ClosedXML.Report/Options/GroupTag.cs b/ClosedXML.Report/Options/GroupTag.cs index 5eb8bb6..1da36e6 100644 --- a/ClosedXML.Report/Options/GroupTag.cs +++ b/ClosedXML.Report/Options/GroupTag.cs @@ -12,6 +12,7 @@ OPTION PARAMS OBJECTS RNG Priority "\PageBreaks" "\TotalLabel" "\GrandLabel" + "\DisableSubtotalLine" "SummaryAbove" Range rD Normal @@ -40,6 +41,7 @@ public class GroupTag : SortTag public bool PageBreaks => Parameters.ContainsKey("pagebreaks"); public bool DisableSubtotals => Parameters.ContainsKey("disablesubtotals"); + public bool DisableSubtotalLine => Parameters.ContainsKey("disablesubtotalline"); public bool Collapse => Parameters.ContainsKey("collapse"); public bool DisableOutLine => Parameters.ContainsKey("disableoutline"); public bool OutLine => !Parameters.ContainsKey("disableoutline"); @@ -129,9 +131,18 @@ private void Process(ProcessingContext context, GroupTag[] groups, bool summaryA foreach (var g in groups.OrderBy(x => x.Column)) { + // Todo: New Feature Group Without Subtotal. Only Merge. + if (g.DisableSubtotalLine) + { + subtotal.ScanForGroups(g.Column); + g.Level = ++level; + + continue; + } + Func labFormat = null; if (!string.IsNullOrEmpty(g.LabelFormat)) - labFormat = title => string.Format(LabelFormat, title); + labFormat = title => string.Format(g.LabelFormat, title); if (g.MergeLabels == MergeMode.Merge2 && summaries.Length == 0) subtotal.ScanForGroups(g.Column); @@ -218,7 +229,12 @@ protected virtual void GroupRender(SubtotalGroup subGroup, GroupTag grData) var rng = subGroup.Range.Column(subGroup.Column); if (subGroup.Range.RowCount() > 1) { - int cellIdx = _maxLevel - subGroup.Level + 1; + // TODO: Wrong Style apply for merged cells if on right has grouped total + // But in first cell i expect already cell with value and style + // Plus with DisableSubtotalLine feature this became totally wrong + int cellIdx = 1; + //int cellIdx = _maxLevel - subGroup.Level + 1; // TODO: Comment for future investigation + var style = rng.Cell(cellIdx).Style; rng.Merge(); rng.Style = style; diff --git a/tests/ClosedXML.Report.Tests/GroupTagTests.cs b/tests/ClosedXML.Report.Tests/GroupTagTests.cs index 1737856..43e117c 100644 --- a/tests/ClosedXML.Report.Tests/GroupTagTests.cs +++ b/tests/ClosedXML.Report.Tests/GroupTagTests.cs @@ -79,6 +79,7 @@ public void EmptyDataSource(string templateFile) InlineData("GroupTagTests_MultiRanges.xlsx"), //InlineData("GroupTagTests_FormulasWithTagsInGroupRow.xlsx"), // Formulas with tags got broken after upgrading to ClosedXML 0.100 InlineData("GroupTagTests_TotalLabel.xlsx"), + InlineData("GroupTagTests_DisableSubTotals_MergeLabels.xlsx") ] public void Customers(string templateFile) { diff --git a/tests/Gauges/GroupTagTests_DisableSubTotals_MergeLabels.xlsx b/tests/Gauges/GroupTagTests_DisableSubTotals_MergeLabels.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d4956878e8044512eeb33ffea7ed97f846fd0a99 GIT binary patch literal 43041 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%0D{#%t9oBU)x4?rtb@7 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 Date: Fri, 5 Apr 2024 14:20:33 +0300 Subject: [PATCH 2/6] Comment Unrelated option --- ClosedXML.Report/ClosedXML.Report.csproj | 1 + ClosedXML.Report/RangeInterpreter.cs | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ClosedXML.Report/ClosedXML.Report.csproj b/ClosedXML.Report/ClosedXML.Report.csproj index 3d22006..8e4faa4 100644 --- a/ClosedXML.Report/ClosedXML.Report.csproj +++ b/ClosedXML.Report/ClosedXML.Report.csproj @@ -30,6 +30,7 @@ snupkg true ClosedXML.Report.snk + 0.2.10-Beta1 diff --git a/ClosedXML.Report/RangeInterpreter.cs b/ClosedXML.Report/RangeInterpreter.cs index 0f5d657..c979ecd 100644 --- a/ClosedXML.Report/RangeInterpreter.cs +++ b/ClosedXML.Report/RangeInterpreter.cs @@ -177,7 +177,13 @@ string EvalString(string str) { var growedRange = rng.GrowToMergedRanges(); var items = nr.RangeData as object[] ?? nr.RangeData.Cast().ToArray(); - if (!items.Any()) + // Comment this section + // Revision: a38eda3a3a7092812c8358a949d4e489635501bf + // Author: Aleksei + // Date: 27.07.2023 23:54:54 + // Message: + // Forcibly remove a range representing a table if its data source is empty (#251) (#323) + /*if (!items.Any()) { if (growedRange.IsOptionsRowEmpty()) { @@ -190,7 +196,7 @@ string EvalString(string str) rangeWithoutOptionsRow.Delete(XLShiftDeletedCells.ShiftCellsUp); } continue; - } + }*/ var tplt = RangeTemplate.Parse(nr.NamedRange.Name, growedRange, _errors, _variables); using (var buff = tplt.Generate(items)) { From 9e6f515d63a60c4ad8c3e2a2f8306e087376342c Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 5 Apr 2024 14:56:27 +0300 Subject: [PATCH 3/6] Custom Package Requisites --- ClosedXML.Report/ClosedXML.Report.csproj | 29 ++++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/ClosedXML.Report/ClosedXML.Report.csproj b/ClosedXML.Report/ClosedXML.Report.csproj index 8e4faa4..f13bcdb 100644 --- a/ClosedXML.Report/ClosedXML.Report.csproj +++ b/ClosedXML.Report/ClosedXML.Report.csproj @@ -1,23 +1,24 @@ - + netstandard2.0;netstandard2.1 10 ClosedXML.Report - ClosedXML.Report + CustomEa.ClosedXML.Report Debug;Release https://github.com/ClosedXML/ClosedXML.Report - https://github.com/ClosedXML/ClosedXML.Report - Alexey Rozhkov, Alexey Pankratev + https://github.com/eagleoriginal/ClosedXML.Report + IOrlov, Alexey Rozhkov, Alexey Pankratev MIT - ClosedXML.Report - See https://github.com/ClosedXML/ClosedXML.Report/releases/tag/$(productVersion) - ClosedXML.Report is a tool for report generation and data analysis in .NET applications through the use of Microsoft Excel. ClosedXML.Report is a .NET-library for report generation Microsoft Excel without requiring Excel to be installed on the machine that's running the code. + CustomEa.ClosedXML.Report + See https://github.com/eagleoriginal/ClosedXML.Report/releases/tag/$(productVersion) + Not Intended for Common Use!!! +Pacakge with Custom Changes in original ClosedXML.Report. +ClosedXML.Report is a tool for report generation and data analysis in .NET applications through the use of Microsoft Excel. ClosedXML.Report is a .NET-library for report generation Microsoft Excel without requiring Excel to be installed on the machine that's running the code. ClosedXML Reporting Excel - ClosedXML - https://github.com/ClosedXML/ClosedXML.Report/raw/develop/Resources/favicon-01.png + CustomEa.ClosedXML MIT - false + True true @@ -31,12 +32,20 @@ true ClosedXML.Report.snk 0.2.10-Beta1 + favicon-01.png true + + + True + \ + + + From f8d24eb3332bef70633d5d978d817ab029902080 Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 12 Apr 2024 12:17:28 +0300 Subject: [PATCH 4/6] GrandTotal For EmptyDataSource(new parameter default for aggregate Fn) --- ClosedXML.Report/ClosedXML.Report.csproj | 2 +- ClosedXML.Report/Excel/SubtotalSummaryFunc.cs | 2 + ClosedXML.Report/Excel/XlExtensions.cs | 8 +++- ClosedXML.Report/Options/GroupTag.cs | 43 +++++++++++++++++- ClosedXML.Report/Options/SummaryFuncTag.cs | 21 ++++++++- tests/ClosedXML.Report.Tests/GroupTagTests.cs | 27 ++++++++++- tests/Gauges/GroupTagTests_Simple_Empty.xlsx | Bin 0 -> 22509 bytes .../Templates/GroupTagTests_Simple_Empty.xlsx | Bin 0 -> 23085 bytes 8 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 tests/Gauges/GroupTagTests_Simple_Empty.xlsx create mode 100644 tests/Templates/GroupTagTests_Simple_Empty.xlsx diff --git a/ClosedXML.Report/ClosedXML.Report.csproj b/ClosedXML.Report/ClosedXML.Report.csproj index f13bcdb..ed54fa6 100644 --- a/ClosedXML.Report/ClosedXML.Report.csproj +++ b/ClosedXML.Report/ClosedXML.Report.csproj @@ -31,7 +31,7 @@ ClosedXML.Report is a tool for report generation and data analysis in .NET appli snupkg true ClosedXML.Report.snk - 0.2.10-Beta1 + 0.2.10-Beta5 favicon-01.png diff --git a/ClosedXML.Report/Excel/SubtotalSummaryFunc.cs b/ClosedXML.Report/Excel/SubtotalSummaryFunc.cs index 8d1bd51..1487754 100644 --- a/ClosedXML.Report/Excel/SubtotalSummaryFunc.cs +++ b/ClosedXML.Report/Excel/SubtotalSummaryFunc.cs @@ -56,6 +56,8 @@ public virtual int FuncNum } } + public object DefaultValueForEmptySource { get; set; } + public Func GetCalculateDelegate; internal object Calculate(IDataSource dataSource) diff --git a/ClosedXML.Report/Excel/XlExtensions.cs b/ClosedXML.Report/Excel/XlExtensions.cs index 90e7115..f98e1ae 100644 --- a/ClosedXML.Report/Excel/XlExtensions.cs +++ b/ClosedXML.Report/Excel/XlExtensions.cs @@ -349,7 +349,13 @@ public static void ReplaceCFFormulaeToA1(this IXLWorksheet worksheet) { foreach (var format in worksheet.ConditionalFormats) { - var target = format.Ranges.OrderBy(x=>x.RangeAddress.FirstAddress.RowNumber) + format.Ranges.RemoveAll(range => false == range.RangeAddress.IsValid); + var validRanges = format.Ranges.Where(range => range.RangeAddress.IsValid).ToList(); + if (false == validRanges.Any()) + continue; + + var target = + validRanges.OrderBy(x=>x.RangeAddress.FirstAddress.RowNumber) .ThenBy(x=> x.RangeAddress.FirstAddress.ColumnNumber) .First().FirstCell(); foreach (var v in format.Values.Where(v => v.Value.Value.StartsWith("&=")).ToList()) diff --git a/ClosedXML.Report/Options/GroupTag.cs b/ClosedXML.Report/Options/GroupTag.cs index 1da36e6..8b61f89 100644 --- a/ClosedXML.Report/Options/GroupTag.cs +++ b/ClosedXML.Report/Options/GroupTag.cs @@ -31,6 +31,8 @@ OPTION PARAMS OBJECTS RNG Priority using ClosedXML.Excel; using ClosedXML.Report.Excel; using ClosedXML.Report.Utils; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml.Spreadsheet; using MoreLinq; namespace ClosedXML.Report.Options @@ -112,11 +114,48 @@ private void Process(ProcessingContext context, GroupTag[] groups, bool summaryA var level = 0; var rows = root.RowCount() - 1; var columns = root.ColumnCount(); - if (rows <= 0 || columns <= 0) + if (columns <= 0) + { return; + } - var r = root.Offset(0, 0, rows, columns); + // Empty Total grand for report + if (rows <= 0) + { + if (disableGrandTotal) + return; + + var r2= root.Offset(0, 0, 1, columns); + using (var subtotal = new Subtotal(r2, summaryAbove, groups, context.Evaluator)) + { + if (TotalLabel != null) subtotal.TotalLabel = TotalLabel; + if (GrandLabel != null) subtotal.GrandLabel = GrandLabel; + if (!disableGrandTotal) + { + var total = subtotal.AddGrandTotal(summaries); + total.SummaryRow.Cell(2).Value = total.SummaryRow.Cell(1).Value; + total.SummaryRow.Cell(1).Value = Blank.Value; + level++; + } + + foreach (var subGroup in subtotal.Groups.OrderBy(x => x.Column).Reverse()) + { + FormatHeaderFooter(subGroup, groupRow); + + GroupRender(subGroup, new GroupTag { Column = 1, Level = 1 }); + } + + r2.Rows().ForEach(r => r.WorksheetRow().OutlineLevel = 0); + } + // Rem DoDeleteSpecialRow + root.LastRow().Delete(XLShiftDeletedCells.ShiftCellsUp); + + return; + } + + var r = root.Offset(0, 0, rows, columns); + using (var subtotal = new Subtotal(r, summaryAbove, groups, context.Evaluator)) { if (TotalLabel != null) subtotal.TotalLabel = TotalLabel; diff --git a/ClosedXML.Report/Options/SummaryFuncTag.cs b/ClosedXML.Report/Options/SummaryFuncTag.cs index 73e64ef..e28f2f6 100644 --- a/ClosedXML.Report/Options/SummaryFuncTag.cs +++ b/ClosedXML.Report/Options/SummaryFuncTag.cs @@ -1,8 +1,11 @@ using System; +using System.Linq; using System.Linq.Expressions; using ClosedXML.Excel; using ClosedXML.Report.Excel; using ClosedXML.Report.Utils; +using DocumentFormat.OpenXml.Math; +using DocumentFormat.OpenXml.Spreadsheet; namespace ClosedXML.Report.Options { @@ -32,8 +35,16 @@ public override void Execute(ProcessingContext context) summRow = context.Range.LastRow(); calculatedRange = context.Range.Offset(0, summ.Column - 1, context.Range.RowCount() - 1, 1); } + var items = summ.DataSource.GetAll(); - if (summ.FuncNum == 0) + if (items == null || items.Length == 0) + { + if (summ.DefaultValueForEmptySource != null) + { + summRow.Cell(summ.Column).Value = XLCellValueConverter.FromObject(summ.DefaultValueForEmptySource); + } + } + else if (summ.FuncNum == 0) { var value = summ.Calculate((IDataSource)context.Value); summRow.Cell(summ.Column).Value = XLCellValueConverter.FromObject(value); @@ -62,6 +73,14 @@ private SubtotalSummaryFunc GetFunc(ProcessingContext context) //return XLDynamicExpressionParser.ParseLambda(new[] {par}, null, GetParameter("Over")); }; func.DataSource = DataSource; + + if (HasParameter("Default")) + { + var dlg = context.Evaluator.ParseExpression(GetParameter("Default"), new ParameterExpression[] {}); + + func.DefaultValueForEmptySource = dlg.DynamicInvoke(); + } + return func; } } diff --git a/tests/ClosedXML.Report.Tests/GroupTagTests.cs b/tests/ClosedXML.Report.Tests/GroupTagTests.cs index 43e117c..a873499 100644 --- a/tests/ClosedXML.Report.Tests/GroupTagTests.cs +++ b/tests/ClosedXML.Report.Tests/GroupTagTests.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Linq; using ClosedXML.Report.Tests.TestModels; using LinqToDB; @@ -38,7 +40,7 @@ public void Simple(string templateFile) { using (var db = new DbDemos()) { - var cust = db.customers.LoadWith(x=>x.Orders.First().Items).OrderBy(c => c.CustNo).First(x=>x.CustNo == 1356); + var cust = db.customers.LoadWith(x => x.Orders.First().Items).OrderBy(c => c.CustNo).First(x => x.CustNo == 1356); cust.Logo = Resource.toms_diving_center; tpl.AddVariable("MoreOrders", cust.Orders.Take(5)); tpl.AddVariable(cust); @@ -52,6 +54,29 @@ public void Simple(string templateFile) }); } + [Xunit.Fact] + public void Simple_EmptyResult() + { + string templateFile = "GroupTagTests_Simple_Empty.xlsx"; + XlTemplateTest(templateFile, + tpl => + { + using (var db = new DbDemos()) + { + var cust = db.customers.LoadWith(x => x.Orders.First().Items).OrderBy(c => c.CustNo).First(x => x.CustNo == 1356); + cust.Orders.Clear(); + cust.Logo = Resource.toms_diving_center; + tpl.AddVariable("MoreOrders", cust.Orders.Take(0)); + tpl.AddVariable(cust); + } + tpl.AddVariable("Tax", 13); + }, + wb => + { + CompareWithGauge(wb, templateFile); + }); + } + [Theory, InlineData("GroupTagTests_SummaryAbove.xlsx"), InlineData("GroupTagTests_MergeLabels.xlsx"), diff --git a/tests/Gauges/GroupTagTests_Simple_Empty.xlsx b/tests/Gauges/GroupTagTests_Simple_Empty.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..875b8da496a11feb1292d98f63e70c856b6f2845 GIT binary patch literal 22509 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 Date: Wed, 9 Jul 2025 20:29:25 +0300 Subject: [PATCH 5/6] Error When Grouping only Empty String --- ClosedXML.Report/ClosedXML.Report.csproj | 2 +- ClosedXML.Report/Excel/Subtotal.cs | 5 +++-- tests/ClosedXML.Report.Tests/GroupTagTests.cs | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ClosedXML.Report/ClosedXML.Report.csproj b/ClosedXML.Report/ClosedXML.Report.csproj index 07f213f..4ba3a48 100644 --- a/ClosedXML.Report/ClosedXML.Report.csproj +++ b/ClosedXML.Report/ClosedXML.Report.csproj @@ -31,7 +31,7 @@ ClosedXML.Report is a tool for report generation and data analysis in .NET appli snupkg true ClosedXML.Report.snk - 0.2.13-Beta7 + 0.2.13-Beta8 favicon-01.png diff --git a/ClosedXML.Report/Excel/Subtotal.cs b/ClosedXML.Report/Excel/Subtotal.cs index cdfb782..7cf7ed4 100644 --- a/ClosedXML.Report/Excel/Subtotal.cs +++ b/ClosedXML.Report/Excel/Subtotal.cs @@ -358,8 +358,9 @@ private MoveData[] ScanRange(int groupBy) gr.SummaryRow == null && gr.Range.RangeAddress.LastAddress.RowNumber == row.RowNumber()) != null; } - - if (string.IsNullOrEmpty(val) && !isSummaryRow) + + if (this._summaryAbove && // TODO: Without _summaryAbove clarification all empty values fall into RangeType.HeaderRow category and as result no groups created + string.IsNullOrEmpty(val) && !isSummaryRow) { if (groupStart > 0) { diff --git a/tests/ClosedXML.Report.Tests/GroupTagTests.cs b/tests/ClosedXML.Report.Tests/GroupTagTests.cs index 8ac7c70..0fadcf0 100644 --- a/tests/ClosedXML.Report.Tests/GroupTagTests.cs +++ b/tests/ClosedXML.Report.Tests/GroupTagTests.cs @@ -114,6 +114,7 @@ public void Customers(string templateFile) using (var db = new DbDemos()) { var orders = db.orders.LoadWith(x => x.Customer).ToList(); + //orders.ForEach(order => order.Customer.Company = order.Customer.Company == "Adventure Undersea"? "": order.Customer.Company); tpl.AddVariable("Orders", orders); } }, @@ -130,7 +131,12 @@ public void WithHeader() tpl => { using (var db = new DbDemos()) - tpl.AddVariable("Orders", db.orders.LoadWith(x => x.Customer).OrderBy(c => c.OrderNo).ToArray()); + { + db.orders.LoadWith(x => x.Customer); + var orders = db.orders.LoadWith(x => x.Customer).ToList(); + //orders.ForEach(order => order.Customer.Company = order.Customer.Company == "Adventure Undersea" ? "" : ""); + tpl.AddVariable("Orders", orders.OrderBy(c => c.OrderNo).ToArray()); + } }, wb => { From ce1e6fcead2f3f78e34623dfa1547b56b014fa58 Mon Sep 17 00:00:00 2001 From: eagleoriginal Date: Sun, 16 Nov 2025 20:45:41 +0300 Subject: [PATCH 6/6] FixBug: Summary without Grouping NullReferenceException --- ClosedXML.Report/ClosedXML.Report.csproj | 4 ++-- ClosedXML.Report/Options/SummaryFuncTag.cs | 11 ++++++++++- .../Templates/GroupTagTests_Simple_Empty.xlsx | Bin 23085 -> 23088 bytes 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/ClosedXML.Report/ClosedXML.Report.csproj b/ClosedXML.Report/ClosedXML.Report.csproj index 4ba3a48..386b4b4 100644 --- a/ClosedXML.Report/ClosedXML.Report.csproj +++ b/ClosedXML.Report/ClosedXML.Report.csproj @@ -4,7 +4,7 @@ netstandard2.0;netstandard2.1 10 ClosedXML.Report - ClosedXML.Report + CustomEa.ClosedXML.Report Debug;Release https://github.com/ClosedXML/ClosedXML.Report https://github.com/eagleoriginal/ClosedXML.Report @@ -31,7 +31,7 @@ ClosedXML.Report is a tool for report generation and data analysis in .NET appli snupkg true ClosedXML.Report.snk - 0.2.13-Beta8 + 0.2.13-Beta9 favicon-01.png diff --git a/ClosedXML.Report/Options/SummaryFuncTag.cs b/ClosedXML.Report/Options/SummaryFuncTag.cs index e28f2f6..a852112 100644 --- a/ClosedXML.Report/Options/SummaryFuncTag.cs +++ b/ClosedXML.Report/Options/SummaryFuncTag.cs @@ -35,7 +35,16 @@ public override void Execute(ProcessingContext context) summRow = context.Range.LastRow(); calculatedRange = context.Range.Offset(0, summ.Column - 1, context.Range.RowCount() - 1, 1); } - var items = summ.DataSource.GetAll(); + + object[] items; + if (summ.DataSource != null) + { + items = summ.DataSource.GetAll(); + } + else + { + items = (context.Value as IDataSource).GetAll(); + } if (items == null || items.Length == 0) { diff --git a/tests/Templates/GroupTagTests_Simple_Empty.xlsx b/tests/Templates/GroupTagTests_Simple_Empty.xlsx index e15328ec391b562f45f1500527ead6c481be9b08..058765c408559e2ae9d94bd8bcb9b492312faa07 100644 GIT binary patch delta 1448 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