mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-31 20:49:55 +00:00
70b4ecd4d3
They aren't quite interchangeable. Both are used in the test suite, with no indication of why one or the other. I think we'd be best off being consistent. Based on the names, I think `_calculateFormulaValue` was intended as a private, or at least internal, method, so favor `calculateFormula`. I do not intend to rename or re-categorize `_calculateFormulaValue`, just remove its usage when it isn't clearly warranted.
146 lines
4.8 KiB
PHP
146 lines
4.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\LookupRef;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
|
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
|
use PhpOffice\PhpSpreadsheet\NamedRange;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
|
|
class HLookupTest extends AllSetupTeardown
|
|
{
|
|
/** @param mixed[] $values */
|
|
#[DataProvider('providerHLOOKUP')]
|
|
public function testHLOOKUP(mixed $expectedResult, mixed $lookup, array $values, mixed $rowIndex, ?bool $rangeLookup = null): void
|
|
{
|
|
$this->setArrayAsValue();
|
|
$sheet = $this->getSheet();
|
|
$maxRow = 0;
|
|
$maxCol = 0;
|
|
$maxColLetter = 'A';
|
|
$row = 0;
|
|
foreach ($values as $rowValues) {
|
|
++$row;
|
|
++$maxRow;
|
|
$col = 0;
|
|
if (!is_array($rowValues)) {
|
|
$rowValues = [$rowValues];
|
|
}
|
|
foreach ($rowValues as $cellValue) {
|
|
++$col;
|
|
$colLetter = Coordinate::stringFromColumnIndex($col);
|
|
if ($col > $maxCol) {
|
|
$maxCol = $col;
|
|
$maxColLetter = $colLetter;
|
|
}
|
|
if ($cellValue !== null) {
|
|
$sheet->getCell("$colLetter$row")->setValue($cellValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
$boolArg = self::parseRangeLookup($rangeLookup);
|
|
$sheet->getCell('ZZ8')->setValue($lookup);
|
|
if (is_array($rowIndex)) {
|
|
$sheet->fromArray($rowIndex, null, 'ZZ10', true);
|
|
$indexarg = 'ZZ10:ZZ' . (string) (9 + count($rowIndex));
|
|
} else {
|
|
$sheet->getCell('ZZ10')->setValue($rowIndex);
|
|
$indexarg = 'ZZ10';
|
|
}
|
|
$sheet->getCell('ZZ1')->setValue("=HLOOKUP(ZZ8, A1:$maxColLetter$maxRow, $indexarg$boolArg)");
|
|
self::assertEquals($expectedResult, $sheet->getCell('ZZ1')->getCalculatedValue());
|
|
}
|
|
|
|
private static function parseRangeLookup(?bool $rangeLookup): string
|
|
{
|
|
if ($rangeLookup === null) {
|
|
return '';
|
|
}
|
|
|
|
return $rangeLookup ? ', true' : ', false';
|
|
}
|
|
|
|
public static function providerHLOOKUP(): array
|
|
{
|
|
return require 'tests/data/Calculation/LookupRef/HLOOKUP.php';
|
|
}
|
|
|
|
#[DataProvider('providerHLookupNamedRange')]
|
|
public function testHLookupNamedRange(string $expectedResult, string $cellAddress): void
|
|
{
|
|
$lookupData = [
|
|
['Rating', 1, 2, 3, 4],
|
|
['Level', 'Poor', 'Average', 'Good', 'Excellent'],
|
|
];
|
|
$formData = [
|
|
['Category', 'Rating', 'Level'],
|
|
['Service', 2, '=HLOOKUP(C5,Lookup_Table,2,FALSE)'],
|
|
['Quality', 3, '=HLOOKUP(C6,Lookup_Table,2,FALSE)'],
|
|
['Value', 4, '=HLOOKUP(C7,Lookup_Table,2,FALSE)'],
|
|
['Cleanliness', 3, '=HLOOKUP(C8,Lookup_Table,2,FALSE)'],
|
|
];
|
|
|
|
$worksheet = $this->getSheet();
|
|
$worksheet->fromArray($lookupData, null, 'F4');
|
|
$worksheet->fromArray($formData, null, 'B4');
|
|
|
|
$this->getSpreadsheet()->addNamedRange(new NamedRange('Lookup_Table', $worksheet, '=$G$4:$J$5'));
|
|
|
|
$result = $worksheet->getCell($cellAddress)->getCalculatedValue();
|
|
self::assertEquals($expectedResult, $result);
|
|
}
|
|
|
|
public static function providerHLookupNamedRange(): array
|
|
{
|
|
return [
|
|
['Average', 'D5'],
|
|
['Good', 'D6'],
|
|
['Excellent', 'D7'],
|
|
['Good', 'D8'],
|
|
];
|
|
}
|
|
|
|
#[DataProvider('providerHLookupArray')]
|
|
public function testHLookupArray(array $expectedResult, string $values, string $database, string $index): void
|
|
{
|
|
$calculation = Calculation::getInstance();
|
|
|
|
$formula = "=HLOOKUP({$values}, {$database}, {$index}, false)";
|
|
$result = $calculation->calculateFormula($formula);
|
|
self::assertSame($expectedResult, $result);
|
|
}
|
|
|
|
public static function providerHLookupArray(): array
|
|
{
|
|
return [
|
|
'row vector #1' => [
|
|
[[4, 9]],
|
|
'{"Axles", "Bolts"}',
|
|
'{"Axles", "Bearings", "Bolts"; 4, 4, 9; 5, 7, 10; 6, 8, 11}',
|
|
'2',
|
|
],
|
|
'row vector #2' => [
|
|
[[5, 7]],
|
|
'{"Axles", "Bearings"}',
|
|
'{"Axles", "Bearings", "Bolts"; 4, 4, 9; 5, 7, 10; 6, 8, 11}',
|
|
'3',
|
|
],
|
|
'row/column vectors' => [
|
|
[[4, 9], [5, 10]],
|
|
'{"Axles", "Bolts"}',
|
|
'{"Axles", "Bearings", "Bolts"; 4, 4, 9; 5, 7, 10; 6, 8, 11}',
|
|
'{2; 3}',
|
|
],
|
|
'issue 3561' => [
|
|
[[8, 9, 8]],
|
|
'6',
|
|
'{1,6,11;2,7,12;3,8,13;4,9,14;5,10,15}',
|
|
'{3,4,3}',
|
|
],
|
|
];
|
|
}
|
|
}
|