Files
oleibman ae4df820bf Xlsx Reader Use Dynamic Arrays if Spreadsheet Did So
By default, when an Xlsx spreadsheet is read, its calculation engine is set to `RETURN_ARRAY_AS_VALUE` for array formulas. The user does have the option to change this. However, the presence of certain metadata in the file indicates that it was saved as if `RETURN_ARRAY_AS_ARRAY` was in use. This PR tests for the metadata, and, if present, sets `...ARRAY` rather than `...VALUE`. This eliminates the need for any extra action on the user's part.
2025-07-10 18:11:41 -07:00

72 lines
2.3 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class ReadDynamTest extends AbstractFunctional
{
public function writeCse(XlsxWriter $writer): void
{
$writer->setUseCSEArrays(true);
}
public function testCse(): void
{
$spreadsheetOld = new Spreadsheet();
$sheetOld = $spreadsheetOld->getActiveSheet();
$calcOld = Calculation::getInstance($spreadsheetOld);
$calcOld->setInstanceArrayReturnType(
Calculation::RETURN_ARRAY_AS_ARRAY
);
$sheetOld->fromArray(
[1, 2, 2, 4, 3, 2, 1, 3, 3, 3, 5],
null,
'A14',
true
);
$sheetOld->setCellValue('A15', '=UNIQUE(A14:K14, TRUE)');
/** @var callable */
$callableWriter = [$this, 'writeCse'];
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Xlsx', null, $callableWriter);
$spreadsheetOld->disconnectWorksheets();
$calc = Calculation::getInstance($spreadsheet);
self::assertSame(
Calculation::RETURN_ARRAY_AS_VALUE,
$calc->getInstanceArrayReturnType()
);
$spreadsheet->disconnectWorksheets();
}
public function testDynam(): void
{
$spreadsheetOld = new Spreadsheet();
$sheetOld = $spreadsheetOld->getActiveSheet();
$calcOld = Calculation::getInstance($spreadsheetOld);
$calcOld->setInstanceArrayReturnType(
Calculation::RETURN_ARRAY_AS_ARRAY
);
$sheetOld->fromArray(
[1, 2, 2, 4, 3, 2, 1, 3, 3, 3, 5],
null,
'A14',
true
);
$sheetOld->setCellValue('A15', '=UNIQUE(A14:K14, TRUE)');
$reloadedSpreadsheet = $this->writeAndReload($spreadsheetOld, 'Xlsx');
$spreadsheet = $this->writeAndReload($spreadsheetOld, 'Xlsx');
$spreadsheetOld->disconnectWorksheets();
$calc = Calculation::getInstance($spreadsheet);
self::assertSame(
Calculation::RETURN_ARRAY_AS_ARRAY,
$calc->getInstanceArrayReturnType()
);
$spreadsheet->disconnectWorksheets();
}
}