mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-25 21:00:42 +00:00
990e3ec3a3
Fix #4381. The report refers to COUNTIF, but AVERAGEIF and SUMIF, which are implemented in the same module, exhibit the same behavior. (There may be others, but, for now, I will just fix those 3.) Most methods which implement Excel functions should accept mixed arguments, so that they won't throw exceptions when calculated. Of course, MS often doesn't give much guidance as to how unexpected arguments should be handled. It at least seems clear that MS will often substitute #REF! for some arguments, and will return #REF! as the result in such cases. My test indicates that a formula using, say, #DIV/0! in lieu of #REF! will cause Excel to deem the spreadsheet corrupt. So, I think I am just going to deal with #REF! and let other unexpected values continue to throw exceptions.
59 lines
2.0 KiB
PHP
59 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\MathTrig;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalcException;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
|
|
class SumIfTest extends AllSetupTeardown
|
|
{
|
|
#[DataProvider('providerSUMIF')]
|
|
public function testSUMIF2(mixed $expectedResult, array $array1, mixed $condition, ?array $array2 = null): void
|
|
{
|
|
$this->mightHaveException($expectedResult);
|
|
if ($expectedResult === 'incomplete') {
|
|
self::markTestIncomplete('Raises formula error - researching solution');
|
|
}
|
|
$this->setArrayAsValue();
|
|
$sheet = $this->getSheet();
|
|
$sheet->fromArray($array1, null, 'A1', true);
|
|
$maxARow = count($array1);
|
|
$firstArg = "A1:A$maxARow";
|
|
$this->setCell('B1', $condition);
|
|
$secondArg = 'B1';
|
|
if (empty($array2)) {
|
|
$sheet->getCell('D1')->setValue("=SUMIF($firstArg, $secondArg)");
|
|
} else {
|
|
$sheet->fromArray($array2, null, 'C1', true);
|
|
$maxCRow = count($array2);
|
|
$thirdArg = "C1:C$maxCRow";
|
|
$sheet->getCell('D1')->setValue("=SUMIF($firstArg, $secondArg, $thirdArg)");
|
|
}
|
|
$result = $sheet->getCell('D1')->getCalculatedValue();
|
|
self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
|
|
}
|
|
|
|
public static function providerSUMIF(): array
|
|
{
|
|
return require 'tests/data/Calculation/MathTrig/SUMIF.php';
|
|
}
|
|
|
|
public function testOutliers(): void
|
|
{
|
|
$sheet = $this->getSheet();
|
|
$sheet->getCell('A1')->setValue('=SUMIF(5,"<32")');
|
|
|
|
try {
|
|
$sheet->getCell('A1')->getCalculatedValue();
|
|
self::fail('Should receive exception for non-array arg');
|
|
} catch (CalcException $e) {
|
|
self::assertStringContainsString('Must specify range of cells', $e->getMessage());
|
|
}
|
|
|
|
$sheet->getCell('A4')->setValue('=SUMIF(#REF!,"<32")');
|
|
self::assertSame('#REF!', $sheet->getCell('A4')->getCalculatedValue());
|
|
}
|
|
}
|