Browse Source

fix issue with AVERAGEA function and how it handles string cells

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901351 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_5_2_3
PJ Fanning 2 years ago
parent
commit
1b0fac992c

+ 1
- 1
poi/src/main/java/org/apache/poi/ss/formula/functions/AggregateFunction.java View File

} }


@Override @Override
protected boolean handleLogicalValues() {
protected boolean treatStringsAsZero() {
return true; return true;
} }
} }

+ 14
- 14
poi/src/main/java/org/apache/poi/ss/formula/functions/MultiOperandNumericFunction.java View File



/** /**
* Functions like AVERAGEA() differ from AVERAGE() in the way they handle non-numeric cells. * Functions like AVERAGEA() differ from AVERAGE() in the way they handle non-numeric cells.
* AVERAGEA treats booleans as 1.0 (true) and 0.0 (false). For strings, they should be parsed as numbers.
* When the string is not a number, treat it as 0.0.
* AVERAGEA treats booleans as 1.0 (true) and 0.0 (false). String cells are treated as 0.0
* (AVERAGE() ignores the cell altogether).
* *
* @return whether to parse non-numeric cells * @return whether to parse non-numeric cells
*/ */
protected boolean handleLogicalValues() {
protected boolean treatStringsAsZero() {
return false; return false;
} }


ValueEval ve = ae.getValue(sIx, rrIx, rcIx); ValueEval ve = ae.getValue(sIx, rrIx, rcIx);
if (!isSubtotalCounted() && ae.isSubTotal(rrIx, rcIx)) continue; if (!isSubtotalCounted() && ae.isSubTotal(rrIx, rcIx)) continue;
if (!isHiddenRowCounted() && ae.isRowHidden(rrIx)) continue; if (!isHiddenRowCounted() && ae.isRowHidden(rrIx)) continue;
collectValue(ve, !handleLogicalValues(), temp);
collectValue(ve, !treatStringsAsZero(), temp);
} }
} }
} }
for (int rcIx = 0; rcIx < width; rcIx++) { for (int rcIx = 0; rcIx < width; rcIx++) {
ValueEval ve = ae.getValue(rrIx, rcIx); ValueEval ve = ae.getValue(rrIx, rcIx);
if (!isSubtotalCounted() && ae.isSubTotal(rrIx, rcIx)) continue; if (!isSubtotalCounted() && ae.isSubTotal(rrIx, rcIx)) continue;
collectValue(ve, !handleLogicalValues(), temp);
collectValue(ve, !treatStringsAsZero(), temp);
} }
} }
return; return;
if (operand instanceof RefEval) { if (operand instanceof RefEval) {
RefEval re = (RefEval) operand; RefEval re = (RefEval) operand;
for (int sIx = re.getFirstSheetIndex(); sIx <= re.getLastSheetIndex(); sIx++) { for (int sIx = re.getFirstSheetIndex(); sIx <= re.getLastSheetIndex(); sIx++) {
collectValue(re.getInnerValueEval(sIx), !handleLogicalValues(), temp);
collectValue(re.getInnerValueEval(sIx), !treatStringsAsZero(), temp);
} }
return; return;
} }
// ignore all ref strings // ignore all ref strings
return; return;
} }
String s = ((StringValueEval) ve).getStringValue().trim();
Double d = OperandResolver.parseDouble(s);
if (d == null) {
if (handleLogicalValues()) {
temp.add(0.0);
} else {
if (treatStringsAsZero()) {
temp.add(0.0);
} else {
String s = ((StringValueEval) ve).getStringValue().trim();
Double d = OperandResolver.parseDouble(s);
if (d == null) {
throw new EvaluationException(ErrorEval.VALUE_INVALID); throw new EvaluationException(ErrorEval.VALUE_INVALID);
} else {
temp.add(d.doubleValue());
} }
} else {
temp.add(d.doubleValue());
} }
return; return;
} }

+ 23
- 0
poi/src/test/java/org/apache/poi/ss/formula/functions/TestAverageA.java View File

} }
} }


@Test
void testStringsWithNums() throws IOException {
try (HSSFWorkbook wb = initWorkbook3()) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
assertDouble(fe, cell, "AVERAGEA(A2:A7)", 4.666666666666667, 0.00000000001);
assertDouble(fe, cell, "AVERAGE(A2:A7)", 7, 0.00000000001);
}
}

private HSSFWorkbook initWorkbook1() { private HSSFWorkbook initWorkbook1() {
HSSFWorkbook wb = new HSSFWorkbook(); HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(); HSSFSheet sheet = wb.createSheet();
addRow(sheet, 6, false); addRow(sheet, 6, false);
return wb; return wb;
} }

private HSSFWorkbook initWorkbook3() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
addRow(sheet, 0, "Data");
addRow(sheet, 1, 10);
addRow(sheet, 2, 7);
addRow(sheet, 3, 9);
addRow(sheet, 4, 2);
addRow(sheet, 5, "4.5");
addRow(sheet, 6, "14");
return wb;
}
} }

Loading…
Cancel
Save