add DPRODUCT function support

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1901277 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2022-05-26 10:25:32 +00:00
parent 3d57a45f65
commit 83134076ed
4 changed files with 133 additions and 1 deletions

View File

@ -201,7 +201,7 @@ public final class FunctionEval {
retval[183] = AggregateFunction.PRODUCT;
retval[184] = NumericFunction.FACT;
// 189: DPRODUCT
retval[189] = new DStarRunner(DStarRunner.DStarAlgorithmEnum.DPRODUCT);
retval[190] = LogicalFunction.ISNONTEXT;
retval[194] = AggregateFunction.VARP;

View File

@ -0,0 +1,53 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.ss.formula.functions;
import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.NumericValueEval;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.util.NumberToTextConverter;
import java.math.BigDecimal;
import java.util.ArrayList;
/**
* Implementation of the DProduct function:
* Gets the product value of a column in an area with given conditions.
*/
public final class DProduct implements IDStarAlgorithm {
private double product;
private boolean initDone = false;
@Override
public boolean processMatch(ValueEval eval) {
if (eval instanceof NumericValueEval) {
if (initDone) {
product *= ((NumericValueEval) eval).getNumberValue();
} else {
product = ((NumericValueEval) eval).getNumberValue();
initDone = true;
}
}
return true;
}
@Override
public ValueEval getResult() {
return new NumberEval(product);
}
}

View File

@ -65,6 +65,8 @@ public final class DStarRunner implements Function3Arg {
DSTDEV(DStdev::new),
/** @see DVar */
DVAR(DVar::new),
/** @see DProduct */
DPRODUCT(DProduct::new),
;
private final Supplier<IDStarAlgorithm> implSupplier;

View File

@ -0,0 +1,77 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.ss.formula.functions;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import static org.apache.poi.ss.util.Utils.addRow;
import static org.apache.poi.ss.util.Utils.assertDouble;
/**
* Testcase for function DPRODUCT()
*/
public class TestDProduct {
//https://support.microsoft.com/en-us/office/dproduct-function-4f96b13e-d49c-47a7-b769-22f6d017cb31
@Test
void testMicrosoftExample1() throws IOException {
try (HSSFWorkbook wb = initWorkbook1(false)) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
assertDouble(fe, cell, "DPRODUCT(A5:E11, \"Yield\", A1:F3)", 800, 0.0000000001);
}
}
@Test
void testNoMatch() throws IOException {
try (HSSFWorkbook wb = initWorkbook1(true)) {
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(wb);
HSSFCell cell = wb.getSheetAt(0).getRow(0).createCell(12);
assertDouble(fe, cell, "DPRODUCT(A5:E11, \"Yield\", A1:A2)", 0);
assertDouble(fe, cell, "DPRODUCT(A5:E11, \"Yield\", A1:A3)", 604800);
}
}
private HSSFWorkbook initWorkbook1(boolean noMatch) {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
addRow(sheet, 0, "Tree", "Height", "Age", "Yield", "Profit", "Height");
if (noMatch) {
addRow(sheet, 1, "=NoMatch");
addRow(sheet, 2);
} else {
addRow(sheet, 1, "=Apple", ">10", null, null, null, "<16");
addRow(sheet, 2, "=Pear");
}
addRow(sheet, 3);
addRow(sheet, 4, "Tree", "Height", "Age", "Yield", "Profit");
addRow(sheet, 5, "Apple", 18, 20, 14, 105);
addRow(sheet, 6, "Pear", 12, 12, 10, 96);
addRow(sheet, 7, "Cherry", 13, 14, 9, 105);
addRow(sheet, 8, "Apple", 14, 15, 10, 75);
addRow(sheet, 9, "Pear", 9, 8, 8, 77);
addRow(sheet, 10, "Apple", 8, 9, 6, 45);
return wb;
}
}