Skip to content

Commit b0002ca

Browse files
authored
Merge pull request #2324 from EPPlusSoftware/bug/issue2322_2323
Bug/issue2322 2323
2 parents 90089d7 + 10662f8 commit b0002ca

5 files changed

Lines changed: 56 additions & 7 deletions

File tree

src/EPPlus/FormulaParsing/Excel/Functions/Logical/Ifs.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ public override CompileResult Execute(IList<FunctionArgument> arguments, Parsing
5656
}
5757
public override bool ReturnsReference => true;
5858
public override bool IsVolatile => true;
59+
public override ExcelFunctionArrayBehaviour ArrayBehaviour => ExcelFunctionArrayBehaviour.Custom;
60+
public override void ConfigureArrayBehaviour(ArrayBehaviourConfig config)
61+
{
62+
var ixArray = new int[127];
63+
for (var ix = 0; ix < 254; ix += 2)
64+
{
65+
ixArray[ix / 2] = ix;
66+
}
67+
config.SetArrayParameterIndexes(ixArray);
68+
}
5969
public override ExcelFunctionParametersInfo ParametersInfo => new ExcelFunctionParametersInfo(new Func<int, FunctionParameterInformation>((argumentIndex) =>
6070
{
6171
if (argumentIndex % 2 == 0)

src/EPPlus/FormulaParsing/Excel/Functions/RefAndLookup/SortBy.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public override CompileResult Execute(IList<FunctionArgument> arguments, Parsing
7777
}
7878
sortOrders.Add((short)sortOrder);
7979
}
80+
sortOrders.Add((short)1); //row order as last sort criteria to ensure same order as Excel.
8081
var sortByImpl = new SortByImpl(range, byRanges, sortOrders, direction);
8182
var sortedRange = sortByImpl.Sort();
8283
return CreateDynamicArrayResult(sortedRange, DataType.ExcelRange);

src/EPPlus/FormulaParsing/Excel/Functions/RefAndLookup/Sorting/SortByImpl.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Date Author Change
1010
*************************************************************************************************
1111
22/3/2023 EPPlus Software AB EPPlus v7
1212
*************************************************************************************************/
13+
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateAndTime;
1314
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup.LookupUtils;
1415
using OfficeOpenXml.FormulaParsing.Ranges;
1516
using System;
@@ -100,6 +101,7 @@ private List<SortInfo> GetSortedRows()
100101
{
101102
cols.CompareData.Add(_byRanges[byRange].GetOffset(row, 0));
102103
}
104+
cols.CompareData.Add(row); //Sort by original row order as last criteria to ensure same order as Excel.
103105
rows.Add(cols);
104106
}
105107
rows.Sort((a, b) =>
@@ -136,6 +138,7 @@ private List<SortInfo> GetSortedCols()
136138
{
137139
rows.CompareData.Add(_byRanges[byRange].GetOffset(0, col));
138140
}
141+
rows.CompareData.Add(col); //Sort by original row order as last criteria to ensure same order as Excel.
139142
cols.Add(rows);
140143
}
141144
cols.Sort((a, b) =>

src/EPPlusTest/FormulaParsing/Excel/Functions/RefAndLookup/SortByTests.cs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
using Microsoft.VisualStudio.TestTools.UnitTesting;
22
using OfficeOpenXml;
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Text;
73

84
namespace EPPlusTest.FormulaParsing.Excel.Functions.RefAndLookup
95
{
@@ -131,7 +127,7 @@ public void SortByColAscending_NullValues_1()
131127
Assert.AreEqual("Street 1", _sheet.Cells["B4"].Value);
132128
Assert.AreEqual("Phil", _sheet.Cells["A5"].Value);
133129
Assert.AreEqual("Steve", _sheet.Cells["A6"].Value);
134-
130+
135131
}
136132

137133
[TestMethod]
@@ -153,9 +149,33 @@ public void SortByColAscending_NullValues_2()
153149
_sheet.Calculate();
154150
Assert.AreEqual("Phil", _sheet.Cells["A4"].Value);
155151
Assert.AreEqual("Street 3", _sheet.Cells["B4"].Value);
156-
Assert.AreEqual("Steve", _sheet.Cells["A5"].Value);
157-
Assert.AreEqual("Bob", _sheet.Cells["A6"].Value);
152+
Assert.AreEqual("Bob", _sheet.Cells["A5"].Value);
153+
Assert.AreEqual("Steve", _sheet.Cells["A6"].Value);
154+
}
155+
[TestMethod]
156+
public void SortByColShould()
157+
{
158+
_sheet.Cells["A1"].Value = "Bob";
159+
_sheet.Cells["B1"].Value = "Street 2";
160+
_sheet.Cells["A2"].Value = "Bob";
161+
_sheet.Cells["B2"].Value = "Street 1";
162+
_sheet.Cells["A3"].Value = "Steve";
163+
_sheet.Cells["B3"].Value = "Street 3";
164+
_sheet.Cells["A4"].Value = "Bob";
165+
_sheet.Cells["B4"].Value = "Street 3";
166+
_sheet.Cells["A5"].Value = "Steve";
167+
_sheet.Cells["B5"].Value = "Street 4";
168+
_sheet.Cells["A6"].Value = "Bob";
169+
_sheet.Cells["B6"].Value = "Street 0";
158170

171+
_sheet.Cells["A7"].Formula = "SORTBY(A1:B6,A1:A6)";
172+
_sheet.Calculate();
173+
Assert.AreEqual("Street 2", _sheet.Cells["B7"].Value);
174+
Assert.AreEqual("Street 1", _sheet.Cells["B8"].Value);
175+
Assert.AreEqual("Street 3", _sheet.Cells["B9"].Value);
176+
Assert.AreEqual("Street 0", _sheet.Cells["B10"].Value);
177+
Assert.AreEqual("Street 3", _sheet.Cells["B11"].Value);
178+
Assert.AreEqual("Street 4", _sheet.Cells["B12"].Value);
159179
}
160180
}
161181
}

src/EPPlusTest/Issues/FormulaCalculationIssues.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,6 +1528,21 @@ public void s1023NegNumericString()
15281528
Assert.AreEqual(-11150d, s.Cells["A1"].Value);
15291529
}
15301530
}
1531+
[TestMethod]
1532+
public void s1029()
1533+
{
1534+
using var p = OpenTemplatePackage("AR Aging Analysis.xlsx");
1535+
var wb = p.Workbook;
1536+
var ws = wb.Worksheets["Filtered data"];
1537+
wb.FullCalcOnLoad = false;
1538+
wb.CalcMode = ExcelCalcMode.Manual;
1539+
ws.Cells["Q2"].Calculate();
1540+
Assert.AreEqual("365" ,ws.Cells["Q2"].Value);
1541+
Assert.AreEqual("181-365", ws.Cells["Q45"].Value);
1542+
Assert.AreEqual("90", ws.Cells["Q55"].Value);
1543+
Assert.AreEqual(6D, ws.Cells["A34"].Value);
1544+
SaveAndCleanup(p);
1545+
}
15311546
}
15321547
}
15331548

0 commit comments

Comments
 (0)