Skip to content

Commit 777101c

Browse files
vbondarevPankraty
andauthored
Bump closedxml to v.0.100.3 (#307)
* Updated dependencies * Bump to ClosedXML 0.100.3 * Fix assigning formulas in group totals * Disable test for formula with tags; fix template for not using formulas with tags inside Upgrading to ClosedXML 0.100 broke this functionality: previously it was possible to put a formula inside a cell and then to retrieve an original value it had (e.g. &="Total:"<<sum>>). Now this does not work (which is correct) and making it right would require somewhat major refactoring for which no one has time Co-authored-by: Aleksei <pankraty@gmail.com>
1 parent 870f43d commit 777101c

20 files changed

+147
-107
lines changed

ClosedXML.Report/ClosedXML.Report.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
</PropertyGroup>
5151

5252
<ItemGroup>
53-
<PackageReference Include="ClosedXML" Version="0.97.0" />
54-
<PackageReference Include="morelinq" Version="3.3.2" />
53+
<PackageReference Include="ClosedXML" Version="0.100.3" />
54+
<PackageReference Include="morelinq" Version="3.4.1" />
5555
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />
5656
</ItemGroup>
5757

ClosedXML.Report/Excel/Subtotal.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public void AddHeaders(int column)
131131
.ForEach(g =>
132132
{
133133
g.HeaderRow = _range.Row(g.Range.RangeAddress.FirstAddress.RowNumber - _range.RangeAddress.FirstAddress.RowNumber);
134-
g.HeaderRow.Clear(XLClearOptions.Contents | XLClearOptions.DataType); // ClosedXML issue 844
134+
g.HeaderRow.Clear(XLClearOptions.Contents);
135135
g.HeaderRow.Cell(column).Value = g.GroupTitle;
136136
});
137137

@@ -237,7 +237,7 @@ private void MoveSummary(MoveData moveData)
237237
return;
238238

239239
trgtRng.Clear();
240-
fcell.Value = srcRng;
240+
fcell.CopyFrom(srcRng);
241241
srcRng.Clear(XLClearOptions.AllContents);
242242

243243
foreach (var cell in trgtRng.CellsUsed(c => c.HasFormula))
@@ -250,10 +250,10 @@ private void MoveRange(MoveData moveData)
250250
{
251251
var srcRng = Sheet.Range(moveData.SourceAddress);
252252
_tempSheet.Clear();
253-
_tempSheet.Cell(1, 1).Value = srcRng;
253+
_tempSheet.Cell(1, 1).CopyFrom(srcRng);
254254
srcRng.Clear(XLClearOptions.AllContents);
255255
Sheet.Range(moveData.TargetAddress).Clear();
256-
Sheet.Cell(moveData.TargetAddress.FirstAddress).Value = _tempSheet.Range(1, 1, srcRng.RowCount(), srcRng.ColumnCount());
256+
Sheet.Cell(moveData.TargetAddress.FirstAddress).CopyFrom(_tempSheet.Range(1, 1, srcRng.RowCount(), srcRng.ColumnCount()));
257257
}
258258

259259
private SubtotalGroup CreateGroup(IXLRange groupRng, int groupClmn, int level, string title, SummaryFuncTag[] summaries, bool pageBreaks,bool isGrandTotal=false)
@@ -275,7 +275,7 @@ private SubtotalGroup CreateGroup(IXLRange groupRng, int groupClmn, int level, s
275275
summRow.CopyStylesFrom(fr);
276276
}
277277

278-
summRow.Clear(XLClearOptions.Contents | XLClearOptions.DataType); //TODO Check if the issue persists (ClosedXML issue 844)
278+
summRow.Clear(XLClearOptions.Contents);
279279
//TODO: Remove the extra space if we can change the existing gauge files
280280
//summRow.Cell(groupClmn).Value = _getGroupLabel != null ? _getGroupLabel(title) : title + (isGrandTotal?null: (string.IsNullOrWhiteSpace(groups?.Where(x => x.Column == groupClmn).Select(x => x.TotalLabel).FirstOrDefault())?null:" ") + (groups?.Where(x => x.Column == groupClmn).Select(x=>x.TotalLabel).FirstOrDefault()??TotalLabel));
281281
summRow.Cell(groupClmn).Value = _getGroupLabel != null ? _getGroupLabel(title) : title + (isGrandTotal ? null : " " + (_groupTags?.Where(x => x.Column == groupClmn).Select(x => x.TotalLabel).FirstOrDefault() ?? TotalLabel));

ClosedXML.Report/Excel/TempSheetBuffer.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using ClosedXML.Excel;
21
using System;
3-
using System.Collections.Generic;
42
using System.Linq;
3+
using ClosedXML.Excel;
4+
using ClosedXML.Report.Utils;
55

66
namespace ClosedXML.Report.Excel
77
{
@@ -53,7 +53,8 @@ public IXLCell WriteValue(object value, IXLCell settingCell)
5353

5454
try
5555
{
56-
xlCell.SetValue(value);
56+
var cellValue = XLCellValueConverter.FromObject(value);
57+
xlCell.SetValue(cellValue);
5758
}
5859
catch (ArgumentException)
5960
{

ClosedXML.Report/Excel/XlExtensions.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public static void Subtotal(this IXLRange range, int groupBy, string function, i
186186
subtotal.GroupBy(groupBy, summaries, pageBreaks);
187187
}
188188
}
189-
189+
190190
public static void Subtotal(this IXLRange range, int groupBy, Dictionary<int, string> totalListWithFunctions, bool replace = true, bool pageBreaks = false, bool summaryAbove = false)
191191
{
192192
using (var subtotal = new Subtotal(range, summaryAbove))
@@ -196,9 +196,9 @@ public static void Subtotal(this IXLRange range, int groupBy, Dictionary<int, st
196196
var summaries = totalListWithFunctions.Select(x => new SummaryFuncTag { Name = x.Value.ToLower(), Cell = new TemplateCell { Column = x.Key } }).ToArray();
197197
subtotal.AddGrandTotal(summaries);
198198
subtotal.GroupBy(groupBy, summaries, pageBreaks);
199-
}
200-
}
201-
199+
}
200+
}
201+
202202
public static bool IsSummary(this IXLRangeRow row)
203203
{
204204
return row.Cells(x => x.HasFormula && x.FormulaA1.ToLower().Contains("subtotal(")).Any();
@@ -247,25 +247,24 @@ internal static string GetFormulaA1(this IXLCell cell, string value)
247247
private static PropertyInfo _xlCellInnerText;
248248
internal static string GetInnerText(this IXLCell cell)
249249
{
250-
_xlCellInnerText = _xlCellInnerText ??
251-
cell.GetType()
252-
.GetProperty("InnerText", BindingFlags.Instance | BindingFlags.Public);
253-
return (string)_xlCellInnerText.GetValue(cell, null);
250+
_xlCellInnerText ??= cell
251+
.GetType()
252+
.GetProperty("InnerText", BindingFlags.Instance | BindingFlags.Public);
253+
254+
return (string)_xlCellInnerText?.GetValue(cell, null);
254255
}
255256
internal static string GetCellText(this IXLCell cell)
256257
{
257-
var field = cell.GetType().GetField("_cellValue",
258-
BindingFlags.NonPublic |
259-
BindingFlags.Instance);
260-
return (string)field.GetValue(cell);
258+
return cell.GetValue<string>();
261259
}
260+
262261
internal static void CopyRelative(this IXLConditionalFormat format, IXLRangeBase fromRange, IXLRangeBase toRange, bool expand)
263262
{
264263
foreach (var sourceFmtRange in format.Ranges)
265264
{
266265
var frmtRng = Intersection(sourceFmtRange, fromRange)
267266
.Relative(fromRange, toRange)
268-
as IXLRange;
267+
as IXLRange;
269268
if (expand &&
270269
frmtRng.RangeAddress.RowCount() == fromRange.RangeAddress.RowCount() &&
271270
frmtRng.RangeAddress.RowCount() != toRange.RangeAddress.RowCount())

ClosedXML.Report/Options/GroupTag.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ OPTION PARAMS OBJECTS RNG Priority
2121
r - range
2222
t - root range
2323
m - master range
24-
d - detail range
24+
d - detail range
2525
*/
2626

2727
using System;
@@ -123,7 +123,7 @@ private void Process(ProcessingContext context, GroupTag[] groups, bool summaryA
123123
{
124124
var total = subtotal.AddGrandTotal(summaries);
125125
total.SummaryRow.Cell(2).Value = total.SummaryRow.Cell(1).Value;
126-
total.SummaryRow.Cell(1).Value = null;
126+
total.SummaryRow.Cell(1).Value = Blank.Value;
127127
level++;
128128
}
129129

@@ -182,7 +182,9 @@ private static void FormatHeaderFooter(SubtotalGroup subGroup, IXLRangeRow group
182182
{
183183
foreach (var cell in groupRow.Cells(c => c.HasFormula && !(c.GetCellText()?.Contains("<<sum>>")??false)))
184184
{
185-
subGroup.SummaryRow.Cell(cell.Address.ColumnNumber - groupRow.RangeAddress.FirstAddress.ColumnNumber + 1).Value = cell;
185+
subGroup.SummaryRow
186+
.Cell(cell.Address.ColumnNumber - groupRow.RangeAddress.FirstAddress.ColumnNumber + 1)
187+
.FormulaR1C1 = cell.FormulaR1C1;
186188
}
187189

188190
subGroup.SummaryRow.Clear(XLClearOptions.AllFormats);

ClosedXML.Report/Options/SummaryFuncTag.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public override void Execute(ProcessingContext context)
3535

3636
if (summ.FuncNum == 0)
3737
{
38-
summRow.Cell(summ.Column).Value = summ.Calculate((IDataSource)context.Value);
38+
var value = summ.Calculate((IDataSource)context.Value);
39+
summRow.Cell(summ.Column).Value = XLCellValueConverter.FromObject(value);
3940
}
4041
else if (summ.FuncNum > 0)
4142
{

ClosedXML.Report/RangeInterpreter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,10 @@ public virtual void EvaluateValues(IXLRange range, params Parameter[] pars)
113113
if (value.StartsWith("&="))
114114
cell.FormulaA1 = _evaluator.Evaluate(value.Substring(2), pars).ToString();
115115
else
116-
cell.SetValue(_evaluator.Evaluate(value, pars));
116+
{
117+
var cellValue = XLCellValueConverter.FromObject(_evaluator.Evaluate(value, pars));
118+
cell.SetValue(cellValue);
119+
}
117120
}
118121
catch (ParseException ex)
119122
{

ClosedXML.Report/TemplateCell.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class TemplateCell
99
public int Row { get; internal set; }
1010
public int Column { get; internal set; }
1111
public string Formula { get; set; }
12-
public object Value { get; set; }
12+
public XLCellValue Value { get; set; }
1313
public IXLCell XLCell { get; internal set; }
1414

1515
public TemplateCell()
@@ -34,11 +34,11 @@ public TemplateCell(int row, int column, IXLCell xlCell)
3434
{
3535
CellType = TemplateCellType.Value;
3636
var strVal = xlCell.GetString();
37-
if (strVal.StartsWith("&="))
38-
{
39-
CellType = TemplateCellType.Formula;
40-
Formula = strVal.Substring(2);
41-
}
37+
if (strVal.StartsWith("&="))
38+
{
39+
CellType = TemplateCellType.Formula;
40+
Formula = strVal.Substring(2);
41+
}
4242
if (strVal.Contains("{{"))
4343
{
4444
IsCalculated = true;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using ClosedXML.Excel;
3+
4+
namespace ClosedXML.Report.Utils;
5+
6+
internal static class XLCellValueConverter
7+
{
8+
public static XLCellValue FromObject(object obj, IFormatProvider provider = null)
9+
{
10+
return obj switch
11+
{
12+
null => Blank.Value,
13+
XLCellValue cellValue => cellValue,
14+
Blank blank => blank,
15+
bool logical => logical,
16+
string text => text,
17+
XLError error => error,
18+
DateTime dateTime => dateTime,
19+
TimeSpan timeSpan => timeSpan,
20+
sbyte number => number,
21+
byte number => number,
22+
short number => number,
23+
ushort number => number,
24+
int number => number,
25+
uint number => number,
26+
long number => number,
27+
ulong number => number,
28+
float number => number,
29+
double number => number,
30+
decimal number => number,
31+
_ => Convert.ToString(obj, provider)
32+
};
33+
}
34+
}

tests/ClosedXML.Report.Tests/ClosedXML.Report.Tests.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,18 @@
2525

2626
<ItemGroup>
2727
<PackageReference Include="Bogus" Version="34.0.2" />
28-
<PackageReference Include="DocumentFormat.OpenXml" Version="2.16.0" />
29-
<PackageReference Include="FluentAssertions" Version="6.7.0" />
30-
<PackageReference Include="linq2db" Version="4.3.0" />
31-
<PackageReference Include="linq2db.SQLite" Version="4.3.0" />
32-
<PackageReference Include="linq2db.t4models" Version="4.3.0" />
28+
<PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
29+
<PackageReference Include="FluentAssertions" Version="6.10.0" />
30+
<PackageReference Include="linq2db" Version="5.1.1" />
31+
<PackageReference Include="linq2db.SQLite" Version="5.1.1" />
32+
<PackageReference Include="linq2db.t4models" Version="5.1.1" />
3333
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
34-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
35-
<PackageReference Include="NSubstitute" Version="4.4.0" />
34+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
35+
<PackageReference Include="NSubstitute" Version="5.0.0" />
3636
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
37-
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.20" />
37+
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.1" />
3838
<PackageReference Include="System.Resources.Extensions" Version="6.0.0" />
39-
<PackageReference Include="System.ServiceModel.Primitives" Version="4.10.0" />
39+
<PackageReference Include="System.ServiceModel.Primitives" Version="4.10.2" />
4040
<PackageReference Include="xunit" Version="2.4.2" />
4141
<PackageReference Include="xunit.assert" Version="2.4.2" />
4242
<PackageReference Include="xunit.extensibility.execution" Version="2.4.2" />

0 commit comments

Comments
 (0)