From c275a77e565d6babf490900d2f074e4b17802379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Fri, 5 Jul 2019 13:52:31 +0200 Subject: [PATCH 1/5] #1056 - replace invalid minif/maxif functions by not implemented minifs/maxifs minif/maxif is not support in Excel, Google Spreadsheets, Libreoffice https://support.office.com/en-us/article/excel-functions-alphabetical-b3944572-255d-4efb-bb96-c6d90033e188#bm13 --- docs/references/function-list-by-category.md | 4 +- docs/references/function-list-by-name.md | 4 +- .../Calculation/Calculation.php | 12 ++-- .../Calculation/Statistical.php | 70 ++++--------------- .../Calculation/functionlist.txt | 2 + .../Calculation/StatisticalTest.php | 43 ++++++++++++ tests/data/Calculation/Statistical/MAXIFS.php | 44 ++++++++++++ tests/data/Calculation/Statistical/MINIFS.php | 44 ++++++++++++ 8 files changed, 155 insertions(+), 68 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php create mode 100644 tests/data/Calculation/Statistical/MAXIFS.php create mode 100644 tests/data/Calculation/Statistical/MINIFS.php diff --git a/docs/references/function-list-by-category.md b/docs/references/function-list-by-category.md index 9dcfea1de8..9e885a7200 100644 --- a/docs/references/function-list-by-category.md +++ b/docs/references/function-list-by-category.md @@ -361,12 +361,12 @@ LOGINV | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::LOGINV LOGNORMDIST | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::LOGNORMDIST MAX | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAX MAXA | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAXA -MAXIF | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAXIF +MAXIFS | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAXIFS MEDIAN | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MEDIAN MEDIANIF | **Not yet Implemented** MIN | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MIN MINA | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MINA -MINIF | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MINIF +MINIFS | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MINIFS MODE | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MODE MODE.SNGL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MODE NEGBINOMDIST | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::NEGBINOMDIST diff --git a/docs/references/function-list-by-name.md b/docs/references/function-list-by-name.md index c3c0406e6c..8ef5ed60bb 100644 --- a/docs/references/function-list-by-name.md +++ b/docs/references/function-list-by-name.md @@ -295,7 +295,7 @@ Excel Function | Category | PhpSpreadsheet Function MATCH | CATEGORY_LOOKUP_AND_REFERENCE | \PhpOffice\PhpSpreadsheet\Calculation\LookupRef::MATCH MAX | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAX MAXA | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAXA -MAXIF | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MAXIF +MAXIFS | CATEGORY_STATISTICAL | **Not yet Implemented** MDETERM | CATEGORY_MATH_AND_TRIG | \PhpOffice\PhpSpreadsheet\Calculation\MathTrig::MDETERM MDURATION | CATEGORY_FINANCIAL | **Not yet Implemented** MEDIAN | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MEDIAN @@ -304,7 +304,7 @@ MID | CATEGORY_TEXT_AND_DATA | \PhpOffice\PhpSpreadsheet MIDB | CATEGORY_TEXT_AND_DATA | \PhpOffice\PhpSpreadsheet\Calculation\TextData::MID MIN | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MIN MINA | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MINA -MINIF | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::MINIF +MINIFS | CATEGORY_STATISTICAL | **Not yet Implemented** MINUTE | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::MINUTE MINVERSE | CATEGORY_MATH_AND_TRIG | \PhpOffice\PhpSpreadsheet\Calculation\MathTrig::MINVERSE MIRR | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::MIRR diff --git a/src/PhpSpreadsheet/Calculation/Calculation.php b/src/PhpSpreadsheet/Calculation/Calculation.php index ae06d654dc..f14d225d86 100644 --- a/src/PhpSpreadsheet/Calculation/Calculation.php +++ b/src/PhpSpreadsheet/Calculation/Calculation.php @@ -1356,10 +1356,10 @@ class Calculation 'functionCall' => [Statistical::class, 'MAXA'], 'argumentCount' => '1+', ], - 'MAXIF' => [ + 'MAXIFS' => [ 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MAXIF'], - 'argumentCount' => '2+', + 'functionCall' => [Statistical::class, 'MAXIFS'], + 'argumentCount' => '3+', ], 'MDETERM' => [ 'category' => Category::CATEGORY_MATH_AND_TRIG, @@ -1401,10 +1401,10 @@ class Calculation 'functionCall' => [Statistical::class, 'MINA'], 'argumentCount' => '1+', ], - 'MINIF' => [ + 'MINIFS' => [ 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MINIF'], - 'argumentCount' => '2+', + 'functionCall' => [Statistical::class, 'MINIFS'], + 'argumentCount' => '3+', ], 'MINUTE' => [ 'category' => Category::CATEGORY_DATE_AND_TIME, diff --git a/src/PhpSpreadsheet/Calculation/Statistical.php b/src/PhpSpreadsheet/Calculation/Statistical.php index 395b46ae7c..5773301759 100644 --- a/src/PhpSpreadsheet/Calculation/Statistical.php +++ b/src/PhpSpreadsheet/Calculation/Statistical.php @@ -2105,45 +2105,22 @@ public static function MAXA(...$args) } /** - * MAXIF. + * MAXIFS. * * Counts the maximum value within a range of cells that contain numbers within the list of arguments * * Excel Function: - * MAXIF(value1[,value2[, ...]],condition) + * MAXIFS(max_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) * - * @category Mathematical and Trigonometric Functions + * @category Statistical Functions * - * @param mixed $aArgs Data values - * @param string $condition the criteria that defines which cells will be checked - * @param mixed $sumArgs + * @param mixed $args Data range and criterias * * @return float */ - public static function MAXIF($aArgs, $condition, $sumArgs = []) + public static function MAXIFS(...$args) { - $returnValue = null; - - $aArgs = Functions::flattenArray($aArgs); - $sumArgs = Functions::flattenArray($sumArgs); - if (empty($sumArgs)) { - $sumArgs = $aArgs; - } - $condition = Functions::ifCondition($condition); - // Loop through arguments - foreach ($aArgs as $key => $arg) { - if (!is_numeric($arg)) { - $arg = Calculation::wrapResult(strtoupper($arg)); - } - $testCondition = '=' . $arg . $condition; - if (Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - if (($returnValue === null) || ($arg > $returnValue)) { - $returnValue = $arg; - } - } - } - - return $returnValue; + return Functions::DUMMY(); } /** @@ -2268,45 +2245,22 @@ public static function MINA(...$args) } /** - * MINIF. + * MINIFS. * * Returns the minimum value within a range of cells that contain numbers within the list of arguments * * Excel Function: - * MINIF(value1[,value2[, ...]],condition) + * MINIFS(min_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) * - * @category Mathematical and Trigonometric Functions + * @category Statistical Functions * - * @param mixed $aArgs Data values - * @param string $condition the criteria that defines which cells will be checked - * @param mixed $sumArgs + * @param mixed $args Data range and criterias * * @return float */ - public static function MINIF($aArgs, $condition, $sumArgs = []) + public static function MINIFS(...$args) { - $returnValue = null; - - $aArgs = Functions::flattenArray($aArgs); - $sumArgs = Functions::flattenArray($sumArgs); - if (empty($sumArgs)) { - $sumArgs = $aArgs; - } - $condition = Functions::ifCondition($condition); - // Loop through arguments - foreach ($aArgs as $key => $arg) { - if (!is_numeric($arg)) { - $arg = Calculation::wrapResult(strtoupper($arg)); - } - $testCondition = '=' . $arg . $condition; - if (Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - if (($returnValue === null) || ($arg < $returnValue)) { - $returnValue = $arg; - } - } - } - - return $returnValue; + return Functions::DUMMY(); } // diff --git a/src/PhpSpreadsheet/Calculation/functionlist.txt b/src/PhpSpreadsheet/Calculation/functionlist.txt index 4a5cd265ba..97a0ceeb69 100644 --- a/src/PhpSpreadsheet/Calculation/functionlist.txt +++ b/src/PhpSpreadsheet/Calculation/functionlist.txt @@ -224,6 +224,7 @@ LOWER MATCH MAX MAXA +MAXIFS MDETERM MDURATION MEDIAN @@ -231,6 +232,7 @@ MID MIDB MIN MINA +MINIFS MINUTE MINVERSE MIRR diff --git a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php new file mode 100644 index 0000000000..bfcaf5cfc8 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php @@ -0,0 +1,43 @@ + Date: Fri, 5 Jul 2019 13:59:23 +0200 Subject: [PATCH 2/5] #1056 - implement minifs/maxifs Copy-pasted sumifs... https://github.com/PHPOffice/PhpSpreadsheet/blob/1.8.1/src/PhpSpreadsheet/Calculation/MathTrig.php#L1254 --- .../Calculation/Statistical.php | 84 ++++++++++++++++++- .../Calculation/StatisticalTest.php | 4 +- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/src/PhpSpreadsheet/Calculation/Statistical.php b/src/PhpSpreadsheet/Calculation/Statistical.php index 5773301759..2e585d5435 100644 --- a/src/PhpSpreadsheet/Calculation/Statistical.php +++ b/src/PhpSpreadsheet/Calculation/Statistical.php @@ -2120,7 +2120,47 @@ public static function MAXA(...$args) */ public static function MAXIFS(...$args) { - return Functions::DUMMY(); + $arrayList = $args; + + // Return value + $returnValue = null; + + $maxArgs = Functions::flattenArray(array_shift($arrayList)); + $aArgsArray = []; + $conditions = []; + + while (count($arrayList) > 0) { + $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); + $conditions[] = Functions::ifCondition(array_shift($arrayList)); + } + + // Loop through each arg and see if arguments and conditions are true + foreach ($maxArgs as $index => $value) { + $valid = true; + + foreach ($conditions as $cidx => $condition) { + $arg = $aArgsArray[$cidx][$index]; + + // Loop through arguments + if (!is_numeric($arg)) { + $arg = Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '=' . $arg . $condition; + if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is not a value within our criteria + $valid = false; + + break; // if false found, don't need to check other conditions + } + } + + if ($valid) { + $returnValue = $returnValue === null ? $value : max($value, $returnValue); + } + } + + // Return + return $returnValue; } /** @@ -2260,7 +2300,47 @@ public static function MINA(...$args) */ public static function MINIFS(...$args) { - return Functions::DUMMY(); + $arrayList = $args; + + // Return value + $returnValue = null; + + $minArgs = Functions::flattenArray(array_shift($arrayList)); + $aArgsArray = []; + $conditions = []; + + while (count($arrayList) > 0) { + $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); + $conditions[] = Functions::ifCondition(array_shift($arrayList)); + } + + // Loop through each arg and see if arguments and conditions are true + foreach ($minArgs as $index => $value) { + $valid = true; + + foreach ($conditions as $cidx => $condition) { + $arg = $aArgsArray[$cidx][$index]; + + // Loop through arguments + if (!is_numeric($arg)) { + $arg = Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '=' . $arg . $condition; + if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is not a value within our criteria + $valid = false; + + break; // if false found, don't need to check other conditions + } + } + + if ($valid) { + $returnValue = $returnValue === null ? $value : min($value, $returnValue); + } + } + + // Return + return $returnValue; } // diff --git a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php index bfcaf5cfc8..4491ec14f0 100644 --- a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php +++ b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php @@ -19,7 +19,7 @@ public function setUp() public function testMAXIFS($expectedResult, ...$args) { $result = Statistical::MAXIFS(...$args); - self::assertEquals('#Not Yet Implemented', $result); + self::assertEquals($expectedResult, $result, '', 1E-12); } public function providerMAXIFS() @@ -33,7 +33,7 @@ public function providerMAXIFS() public function testMINIFS($expectedResult, ...$args) { $result = Statistical::MINIFS(...$args); - self::assertEquals('#Not Yet Implemented', $result); + self::assertEquals($expectedResult, $result, '', 1E-12); } public function providerMINIFS() From 8176ec0e9f370832869e205e751bac8e08a4b209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Fri, 5 Jul 2019 14:26:17 +0200 Subject: [PATCH 3/5] #1056 - implement countifs --- docs/references/function-list-by-category.md | 2 +- docs/references/function-list-by-name.md | 2 +- .../Calculation/Calculation.php | 2 +- .../Calculation/Statistical.php | 62 +++++++++++++++++++ .../Calculation/StatisticalTest.php | 14 +++++ .../data/Calculation/Statistical/COUNTIFS.php | 32 ++++++++++ 6 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 tests/data/Calculation/Statistical/COUNTIFS.php diff --git a/docs/references/function-list-by-category.md b/docs/references/function-list-by-category.md index 9e885a7200..418311bca5 100644 --- a/docs/references/function-list-by-category.md +++ b/docs/references/function-list-by-category.md @@ -333,7 +333,7 @@ COUNT | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNT COUNTA | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTA COUNTBLANK | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTBLANK COUNTIF | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTIF -COUNTIFS | **Not yet Implemented** +COUNTIFS | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTIFS COVAR | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COVAR CRITBINOM | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::CRITBINOM DEVSQ | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::DEVSQ diff --git a/docs/references/function-list-by-name.md b/docs/references/function-list-by-name.md index 8ef5ed60bb..cdbfcc8c35 100644 --- a/docs/references/function-list-by-name.md +++ b/docs/references/function-list-by-name.md @@ -79,7 +79,7 @@ COUNT | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet COUNTA | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTA COUNTBLANK | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTBLANK COUNTIF | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTIF -COUNTIFS | CATEGORY_STATISTICAL | **Not yet Implemented** +COUNTIFS | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::COUNTIFS COUPDAYBS | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::COUPDAYBS COUPDAYS | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::COUPDAYS COUPDAYSNC | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::COUPDAYSNC diff --git a/src/PhpSpreadsheet/Calculation/Calculation.php b/src/PhpSpreadsheet/Calculation/Calculation.php index f14d225d86..f6385acd3b 100644 --- a/src/PhpSpreadsheet/Calculation/Calculation.php +++ b/src/PhpSpreadsheet/Calculation/Calculation.php @@ -527,7 +527,7 @@ class Calculation ], 'COUNTIFS' => [ 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], + 'functionCall' => [Statistical::class, 'COUNTIFS'], 'argumentCount' => '2+', ], 'COUPDAYBS' => [ diff --git a/src/PhpSpreadsheet/Calculation/Statistical.php b/src/PhpSpreadsheet/Calculation/Statistical.php index 2e585d5435..697dec2799 100644 --- a/src/PhpSpreadsheet/Calculation/Statistical.php +++ b/src/PhpSpreadsheet/Calculation/Statistical.php @@ -1134,6 +1134,68 @@ public static function COUNTIF($aArgs, $condition) return $returnValue; } + /** + * COUNTIFS. + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]…) + * + * @category Statistical Functions + * + * @param mixed $args Criterias + * + * @return int + */ + public static function COUNTIFS(...$args) + { + $arrayList = $args; + + // Return value + $returnValue = 0; + + if (!$arrayList) { + return $returnValue; + } + + $aArgsArray = []; + $conditions = []; + + while (count($arrayList) > 0) { + $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); + $conditions[] = Functions::ifCondition(array_shift($arrayList)); + } + + // Loop through each arg and see if arguments and conditions are true + foreach (array_keys($aArgsArray[0]) as $index) { + $valid = true; + + foreach ($conditions as $cidx => $condition) { + $arg = $aArgsArray[$cidx][$index]; + + // Loop through arguments + if (!is_numeric($arg)) { + $arg = Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '=' . $arg . $condition; + if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is not a value within our criteria + $valid = false; + + break; // if false found, don't need to check other conditions + } + } + + if ($valid) { + $returnValue++; + } + } + + // Return + return $returnValue; + } + /** * COVAR. * diff --git a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php index 4491ec14f0..523def4f27 100644 --- a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php +++ b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php @@ -13,6 +13,20 @@ public function setUp() Functions::setCompatibilityMode(Functions::COMPATIBILITY_EXCEL); } + /** + * @dataProvider providerCOUNTIFS + */ + public function testCOUNTIFS($expectedResult, ...$args) + { + $result = Statistical::COUNTIFS(...$args); + self::assertEquals($expectedResult, $result, '', 1E-12); + } + + public function providerCOUNTIFS() + { + return require 'data/Calculation/Statistical/COUNTIFS.php'; + } + /** * @dataProvider providerMAXIFS */ diff --git a/tests/data/Calculation/Statistical/COUNTIFS.php b/tests/data/Calculation/Statistical/COUNTIFS.php new file mode 100644 index 0000000000..3f949b5a71 --- /dev/null +++ b/tests/data/Calculation/Statistical/COUNTIFS.php @@ -0,0 +1,32 @@ + Date: Fri, 5 Jul 2019 14:33:59 +0200 Subject: [PATCH 4/5] #1056 - fix code style composer check composer fix --- src/PhpSpreadsheet/Calculation/Statistical.php | 2 +- tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/PhpSpreadsheet/Calculation/Statistical.php b/src/PhpSpreadsheet/Calculation/Statistical.php index 697dec2799..1a47a3a544 100644 --- a/src/PhpSpreadsheet/Calculation/Statistical.php +++ b/src/PhpSpreadsheet/Calculation/Statistical.php @@ -1188,7 +1188,7 @@ public static function COUNTIFS(...$args) } if ($valid) { - $returnValue++; + ++$returnValue; } } diff --git a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php index 523def4f27..ea25b3f5a3 100644 --- a/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php +++ b/tests/PhpSpreadsheetTests/Calculation/StatisticalTest.php @@ -15,6 +15,8 @@ public function setUp() /** * @dataProvider providerCOUNTIFS + * + * @param mixed $expectedResult */ public function testCOUNTIFS($expectedResult, ...$args) { @@ -29,6 +31,8 @@ public function providerCOUNTIFS() /** * @dataProvider providerMAXIFS + * + * @param mixed $expectedResult */ public function testMAXIFS($expectedResult, ...$args) { @@ -43,6 +47,8 @@ public function providerMAXIFS() /** * @dataProvider providerMINIFS + * + * @param mixed $expectedResult */ public function testMINIFS($expectedResult, ...$args) { From 60a0c3fd0271c54d4986e57c49f4c5f1e904cd1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Fri, 5 Jul 2019 14:39:52 +0200 Subject: [PATCH 5/5] #1056 - update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d029fe7a2..ae21eb05b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Added - When <br> appears in a table cell, set the cell to wrap [Issue #1071](https://github.com/PHPOffice/PhpSpreadsheet/issues/1071) and [PR #1070](https://github.com/PHPOffice/PhpSpreadsheet/pull/1070) +- Add MAXIFS, MINIFS, COUNTIFS and Remove MINIF, MAXIF - [Issue #1056](https://github.com/PHPOffice/PhpSpreadsheet/issues/1056) ### Fixed