Skip to content

Commit 298f6dc

Browse files
authored
Merge pull request #1171 from EPPlusSoftware/bug/issue1177
Fixed issue #1177
2 parents a5574ee + c4894aa commit 298f6dc

File tree

13 files changed

+91
-39
lines changed

13 files changed

+91
-39
lines changed

src/EPPlus/EPPlus.csproj

+19-3
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,12 @@
445445
<PropertyGroup Condition=" '$(TargetFramework)' == 'net7.0'">
446446
<DefineConstants>Core;NET70</DefineConstants>
447447
</PropertyGroup>
448-
449-
<PropertyGroup Condition=" '$(TargetFramework)' == 'net462'">
448+
449+
<PropertyGroup Condition=" '$(TargetFramework)' == 'net8.0'">
450+
<DefineConstants>Core;NET80</DefineConstants>
451+
</PropertyGroup>
452+
453+
<PropertyGroup Condition=" '$(TargetFramework)' == 'net462'">
450454
<DefineConstants>NET45;NETFULL</DefineConstants>
451455
</PropertyGroup>
452456

@@ -551,8 +555,20 @@
551555
</PackageReference>
552556
</ItemGroup>
553557

558+
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
559+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
560+
<PackageReference Include="System.ComponentModel.Annotations">
561+
<Version>5.0.0</Version>
562+
</PackageReference>
563+
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="8.0.0" />
564+
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
565+
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream">
566+
<Version>2.3.2</Version>
567+
</PackageReference>
568+
</ItemGroup>
569+
554570

555-
<ItemGroup>
571+
<ItemGroup>
556572
<None Remove="resources\DefaultTableStyles.cst" />
557573
<None Remove="resources\fontsize.zip" />
558574
<None Remove="resources\TextMetrics.zip" />

src/EPPlus/ExternalReferences/ExcelExternalWorkbook.cs

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ private void ReadSheetData(XmlTextReader reader, ExcelWorkbook wb)
144144

145145
int row=0, col=0;
146146
string type="";
147+
if (reader.IsEmptyElement) return;
147148
while (reader.Read())
148149
{
149150
if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "sheetData")

src/EPPlus/FormulaParsing/Excel/Functions/FunctionArgument.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public IRangeInfo ValueAsRangeInfo
123123
{
124124
if(_result.Address!=null)
125125
{
126-
return new RangeInfo(_result.Address);
126+
return _result.Address.GetAsRangeInfo();
127127
}
128128
return null;
129129
}

src/EPPlus/FormulaParsing/FormulaExpressions/CompileResult.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public object ResultValue
227227
if(DataType==DataType.ExcelRange)
228228
{
229229
var r = Result as IRangeInfo;
230-
if (r == null || r.IsMulti)
230+
if (r == null || r.GetNCells()>1)
231231
{
232232
return Result;
233233
}

src/EPPlus/FormulaParsing/FormulaExpressions/FunctionCompilers/CustomArrayBehaviourCompiler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public override CompileResult Compile(IEnumerable<CompileResult> children, Parsi
5050
if(cr.DataType == DataType.ExcelRange && Function.ArrayBehaviourConfig.CanBeArrayArg(ix))
5151
{
5252
var range = cr.Result as IRangeInfo;
53-
if(range.IsMulti)
53+
if(range.GetNCells() > 1)
5454
{
5555
rangeArgs[ix] = range;
5656
}

src/EPPlus/FormulaParsing/FormulaExpressions/RangeExpression.cs

+2-13
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,8 @@ public override CompileResult Compile()
5454
}
5555
else
5656
{
57-
var wb = Context.GetExternalWoorkbook(_addressInfo.ExternalReferenceIx);
58-
IRangeInfo ri;
59-
if(wb?.Package!=null)
60-
{
61-
var ws = wb?.Package.Workbook.GetWorksheetByIndexInList(_addressInfo.WorksheetIx);
62-
ri=new RangeInfo(ws, _addressInfo.FromRow, _addressInfo.FromCol, _addressInfo.ToRow, _addressInfo.ToCol, Context);
63-
}
64-
else
65-
{
66-
ri = new EpplusExcelExternalRangeInfo(wb, _addressInfo, Context);
67-
}
68-
69-
if (ri.IsMulti)
57+
var ri = _addressInfo.GetAsRangeInfo();
58+
if (ri.GetNCells()>1)
7059
{
7160
_cachedCompileResult = new AddressCompileResult(ri, DataType.ExcelRange, _addressInfo);
7261
}

src/EPPlus/FormulaParsing/FormulaExpressions/TableAddressExpression.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public override CompileResult Compile()
2424
}
2525

2626
var ri = Context.ExcelDataProvider.GetRange(_addressInfo);
27-
if (ri.IsMulti)
27+
if (ri.GetNCells() > 1)
2828
{
2929
return new AddressCompileResult(ri, DataType.ExcelRange, _addressInfo);
3030
}

src/EPPlus/FormulaParsing/IRangeInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public interface IRangeInfo : IAddressInfo, IEnumerator<ICellInfo>, IEnumerable<
2929
/// </summary>
3030
bool IsEmpty { get; }
3131
/// <summary>
32-
/// If the contains more than one cell with a value.
32+
/// If the range contains more than one cell with a value.
3333
/// </summary>
3434
bool IsMulti { get; }
3535
/// <summary>

src/EPPlus/FormulaParsing/LexicalAnalysis/FormulaAddress.cs

+41-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Linq;
1313
using OfficeOpenXml.Utils;
1414
using System.Net;
15+
using OfficeOpenXml.FormulaParsing.Ranges;
1516

1617
namespace OfficeOpenXml.FormulaParsing.LexicalAnalysis
1718
{
@@ -833,6 +834,36 @@ internal ulong GetTopLeftCellId()
833834
return ExcelCellBase.GetCellId(WorksheetIx, FromRow, FromCol);
834835
}
835836

837+
internal IRangeInfo GetAsRangeInfo()
838+
{
839+
if(ExternalReferenceIx>0)
840+
{
841+
return GetAsExternalRangeInfo();
842+
}
843+
else
844+
{
845+
return new RangeInfo(this);
846+
}
847+
}
848+
849+
internal IRangeInfo GetAsExternalRangeInfo()
850+
{
851+
var wb = _context.GetExternalWoorkbook(ExternalReferenceIx);
852+
if(wb==null)
853+
{
854+
return new RangeInfo(null, -1, -1, -1, -1, _context, ExternalReferenceIx);
855+
}
856+
else if (wb.Package == null)
857+
{
858+
return new EpplusExcelExternalRangeInfo(wb, this, _context);
859+
}
860+
else
861+
{
862+
var ws = wb.Package.Workbook.GetWorksheetByIndexInList(WorksheetIx);
863+
return new RangeInfo(ws, FromRow, FromCol, ToRow, ToCol, _context);
864+
}
865+
}
866+
836867
public FormulaRangeAddress Address => this;
837868
}
838869
public class FormulaTableAddress : FormulaRangeAddress
@@ -904,11 +935,6 @@ internal void SetTableAddress(ExcelPackage package)
904935
{
905936
FixedFlag = FixedFlag.All;
906937

907-
FromRow = table.ShowHeader ? table.Address._fromRow + 1 : table.Address._fromRow;
908-
ToRow = table.ShowTotal ? table.Address._toRow - 1 : table.Address._toRow;
909-
FromCol = table.Address._fromCol;
910-
ToCol = table.Address._toCol;
911-
912938
if (string.IsNullOrEmpty(TablePart1) == false)
913939
{
914940
SetRowFromTablePart(TablePart1, table, ref FromRow, ref ToRow, ref FixedFlag);
@@ -917,6 +943,11 @@ internal void SetTableAddress(ExcelPackage package)
917943
SetRowFromTablePart(TablePart2, table, ref FromRow, ref ToRow, ref FixedFlag);
918944
}
919945
}
946+
else
947+
{
948+
FromRow = table.ShowHeader ? table.Address._fromRow + 1 : table.Address._fromRow;
949+
ToRow = table.ShowTotal ? table.Address._toRow - 1 : table.Address._toRow;
950+
}
920951

921952
if (string.IsNullOrEmpty(ColumnName1) == false)
922953
{
@@ -926,6 +957,11 @@ internal void SetTableAddress(ExcelPackage package)
926957
SetColFromTablePart(ColumnName2, table, ref FromCol, ref ToCol, true);
927958
}
928959
}
960+
else
961+
{
962+
FromCol = table.Address._fromCol;
963+
ToCol = table.Address._toCol;
964+
}
929965
}
930966
}
931967
private void SetColFromTablePart(string value, ExcelTable table, ref int fromCol, ref int toCol, bool lastColon)

src/EPPlus/FormulaParsing/ParsingContext.cs

+8-11
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,14 @@ internal ExcelExternalWorkbook GetExternalWoorkbook(int externalReferenceIx)
145145
}
146146

147147
internal HashSet<ulong> SubtotalAddresses { get; private set; }
148-
internal FormulaCellAddress CurrentCell { get; set; }
149-
internal FormulaCellAddress CurrentName { get; set; }
150-
internal string CurrentCellFullAddress
151-
{
152-
get
153-
{
154-
var ws = CurrentCell.WorksheetIx < 0 || CurrentCell.WorksheetIx>=Package.Workbook.Worksheets.Count ? "" : Package.Workbook.Worksheets[CurrentCell.WorksheetIx].Name+"!";
155-
return ws + CurrentCell.Address;
156-
}
157-
}
158-
internal ExcelWorksheet CurrentWorksheet
148+
/// <summary>
149+
/// Represents the current cell
150+
/// </summary>
151+
public FormulaCellAddress CurrentCell { get; set; }
152+
/// <summary>
153+
/// The worksheet where the current formula is located.
154+
/// </summary>
155+
public ExcelWorksheet CurrentWorksheet
159156
{
160157
get
161158
{

src/EPPlus/FormulaParsing/Ranges/EpplusExcelExternalRangeInfo.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public EpplusExcelExternalRangeInfo(ExcelExternalWorkbook externalWb, FormulaRan
102102
}
103103
}
104104
}
105+
106+
105107
/// <summary>
106108
/// Get the number of cells in the range
107109
/// </summary>
@@ -190,7 +192,7 @@ public ICellInfo Current
190192
get { return _cell; }
191193
}
192194
/// <summary>
193-
/// Not applicable for external ranges.. Returns null
195+
/// Not applicable for external ranges. Returns null
194196
/// </summary>
195197
public ExcelWorksheet Worksheet
196198
{

src/EPPlus/FormulaParsing/Ranges/RangeInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public int GetNCells()
117117
}
118118

119119
/// <summary>
120-
/// Returns true if the range represents a reference
120+
/// Returns true if the range represents an invalid reference
121121
/// </summary>
122122
public bool IsRef
123123
{

src/EPPlusTest/Issues.cs

+11
Original file line numberDiff line numberDiff line change
@@ -5830,5 +5830,16 @@ public void s554()
58305830
SaveAndCleanup(package);
58315831
}
58325832
}
5833+
[TestMethod]
5834+
public void s551()
5835+
{
5836+
using (var p = OpenTemplatePackage("s551.xlsx"))
5837+
{
5838+
var ws = p.Workbook.Worksheets[0];
5839+
ws.Cells["AA2"].Calculate();
5840+
5841+
Assert.AreEqual(3535399.86606, ws.Cells["AA2"].Value);
5842+
}
5843+
}
58335844
}
58345845
}

0 commit comments

Comments
 (0)