Browse Source

Fixes bug #61468, caused by a confusing OOXML spec design as noted in JavaDocs added in r1795648.

pull/1600/head
Antony Liu 3 weeks ago
parent
commit
1088c04c79
  1. 14
      main/SS/Formula/FormulaParser.cs
  2. 12
      testcases/ooxml/XSSF/UserModel/TestXSSFFormulaEvaluation.cs
  3. 2
      testcases/ooxml/XSSF/UserModel/TestXSSFTable.cs
  4. BIN
      testcases/test-data/spreadsheet/simple-monthly-budget.xlsx

14
main/SS/Formula/FormulaParser.cs

@ -863,7 +863,7 @@ using Cysharp.Text;
// Done reading from input stream
// Ok to return now
if (isTotalsSpec && !tbl.IsHasTotalsRow)
if (isTotalsSpec && tbl.TotalsRowCount == 0)
{
return new ParseNode(ErrPtg.REF_INVALID);
}
@ -895,7 +895,7 @@ using Cysharp.Text;
}
else if (isDataSpec && isHeadersSpec)
{
if (tbl.IsHasTotalsRow)
if (tbl.TotalsRowCount > 0)
{
actualEndRow = endRow - 1;
}
@ -907,7 +907,7 @@ using Cysharp.Text;
else if (nSpecQuantifiers == 1 && isDataSpec)
{
actualStartRow = startRow + 1;
if (tbl.IsHasTotalsRow)
if (tbl.TotalsRowCount > 0)
{
actualEndRow = endRow - 1;
}
@ -933,13 +933,17 @@ using Cysharp.Text;
else
{
if (isThisRow)
{ // there is a @
{
// there is a @
actualStartRow = _rowIndex; //The rowNum is 0 based
actualEndRow = _rowIndex;
}
else
{ // Really no special quantifiers
{
// Really no special quantifiers
actualStartRow++;
if (tbl.TotalsRowCount > 0)
actualEndRow--;
}
}
//Selecting cols

12
testcases/ooxml/XSSF/UserModel/TestXSSFFormulaEvaluation.cs

@ -756,6 +756,18 @@ namespace TestCases.XSSF.UserModel
wb.Close();
}
[Test]
public void TestBug61468()
{
IWorkbook wb = XSSFTestDataSamples.OpenSampleWorkbook("simple-monthly-budget.xlsx");
IFormulaEvaluator evaluator = wb.GetCreationHelper().CreateFormulaEvaluator();
ICell cell = wb.GetSheetAt(0).GetRow(8).GetCell(4);
ClassicAssert.AreEqual(3750, cell.NumericCellValue, 0.001);
CellValue value = evaluator.Evaluate(cell);
ClassicAssert.AreEqual(3750, value.NumberValue, 0.001);
}
[Test]
public void TestNPOIIssue_1057()
{

2
testcases/ooxml/XSSF/UserModel/TestXSSFTable.cs

@ -147,7 +147,7 @@ namespace TestCases.XSSF.UserModel
{
XSSFWorkbook wb = XSSFTestDataSamples.OpenSampleWorkbook("StructuredReferences.xlsx");
XSSFTable table = wb.GetTable("\\_Prime.1");
ClassicAssert.IsFalse(table.IsHasTotalsRow);
ClassicAssert.IsFalse(table.TotalsRowCount > 0);
wb.Close();
}
[Test]

BIN
testcases/test-data/spreadsheet/simple-monthly-budget.xlsx

Loading…
Cancel
Save