Просмотр исходного кода

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

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1806623 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_3_17_FINAL
Greg Woolsey 6 лет назад
Родитель
Сommit
d68912db25

+ 4
- 4
src/java/org/apache/poi/ss/formula/FormulaParser.java Просмотреть файл

// Done reading from input stream // Done reading from input stream
// Ok to return now // Ok to return now


if (isTotalsSpec && !tbl.isHasTotalsRow()) {
if (isTotalsSpec && tbl.getTotalsRowCount() == 0) {
return new ParseNode(ErrPtg.REF_INVALID); return new ParseNode(ErrPtg.REF_INVALID);
} }
if ((isThisRow || isThisRowSpec) && (_rowIndex < startRow || endRow < _rowIndex)) { if ((isThisRow || isThisRowSpec) && (_rowIndex < startRow || endRow < _rowIndex)) {
if (nSpecQuantifiers == 1 && isAllSpec) { if (nSpecQuantifiers == 1 && isAllSpec) {
//do nothing //do nothing
} else if (isDataSpec && isHeadersSpec) { } else if (isDataSpec && isHeadersSpec) {
if (tbl.isHasTotalsRow()) {
if (tbl.getTotalsRowCount() > 0) {
actualEndRow = endRow - 1; actualEndRow = endRow - 1;
} }
} else if (isDataSpec && isTotalsSpec) { } else if (isDataSpec && isTotalsSpec) {
actualStartRow = startRow + 1; actualStartRow = startRow + 1;
} else if (nSpecQuantifiers == 1 && isDataSpec) { } else if (nSpecQuantifiers == 1 && isDataSpec) {
actualStartRow = startRow + 1; actualStartRow = startRow + 1;
if (tbl.isHasTotalsRow()) {
if (tbl.getTotalsRowCount() > 0) {
actualEndRow = endRow - 1; actualEndRow = endRow - 1;
} }
} else if (nSpecQuantifiers == 1 && isHeadersSpec) { } else if (nSpecQuantifiers == 1 && isHeadersSpec) {
actualEndRow = _rowIndex; actualEndRow = _rowIndex;
} else { // Really no special quantifiers } else { // Really no special quantifiers
actualStartRow++; actualStartRow++;
if (tbl.isHasTotalsRow()) actualEndRow--;
if (tbl.getTotalsRowCount() > 0) actualEndRow--;
} }
} }



+ 11
- 0
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java Просмотреть файл

assertSame(cell, same); assertSame(cell, same);
wb.close(); wb.close();
} }
@Test
public void testBug61468() {
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("simple-monthly-budget.xlsx");
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
Cell cell = wb.getSheetAt(0).getRow(8).getCell(4);
assertEquals(3750, cell.getNumericCellValue(), 0.001);

CellValue value = evaluator.evaluate(cell);
assertEquals(3750, value.getNumberValue(), 0.001);
}
} }

+ 1
- 1
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java Просмотреть файл

public void isHasTotalsRow() throws IOException { public void isHasTotalsRow() throws IOException {
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("StructuredReferences.xlsx"); XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("StructuredReferences.xlsx");
XSSFTable table = wb.getTable("\\_Prime.1"); XSSFTable table = wb.getTable("\\_Prime.1");
assertFalse(table.isHasTotalsRow());
assertFalse(table.getTotalsRowCount() > 0);
wb.close(); wb.close();
} }



Двоичные данные
test-data/spreadsheet/simple-monthly-budget.xlsx Просмотреть файл


Загрузка…
Отмена
Сохранить