mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-15 04:26:25 +00:00
ae4df820bf
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.
72 lines
2.3 KiB
PHP
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();
|
|
}
|
|
}
|