mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-02 13:41:21 +00:00
1cdc6cd2fb
* Breaking Change to toFormattedString and 3 toArray Methods DocBlock says `toFormattedString` returns string, but code can return int, float, bool, null, or RichText. I think the DocBlock is correct (function name clearly indicates "to string"), and the code needs to change to match it. This is not that big a deal on its own. However, some methods in `Worksheet` call this function by default - `rangeToArray`, `toArray`, and `namedRangeToArray`. All 3 can be called with a parameter so that they don't call `toFormattedString`, but, by default, they do call, and so are affected by this change. Some unit test results are changed as a result of this code change. In all those cases, an additional test is added which would match the previous result. * Update Change Log I often skip this till later, but, since it's a breaking change ... * Scrutinizer, Plus Strange Cast to -0 Avoid Scrutinizer complaint by casting string to float, but ... Php decides resulted should sometimes be `-0`? That caused test failures. Very odd.
173 lines
5.6 KiB
PHP
173 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
|
|
|
class MergeBehaviourTest extends AbstractFunctional
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
private $testDataRaw = [
|
|
[1.1, 2.2, '=ROUND(A1+B1, 1)'],
|
|
[4.4, 5.5, '=ROUND(A2+B2, 1)'],
|
|
['=ROUND(A1+A2, 1)', '=ROUND(B1+B2, 1)', '=ROUND(A3+B3, 1)'],
|
|
];
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
private $testDataFormatted = [
|
|
['=DATE(1960, 12, 19)', '=DATE(2022, 09, 15)'],
|
|
];
|
|
|
|
public function testMergeCellsDefaultBehaviour(): void
|
|
{
|
|
$expectedResult = [
|
|
[1.1, null, null],
|
|
[null, null, null],
|
|
[null, null, null],
|
|
];
|
|
|
|
$mergeRange = 'A1:C3';
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($this->testDataRaw, null, 'A1', true);
|
|
$worksheet->mergeCells($mergeRange);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, false, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testMergeCellsDefaultBehaviourFormatted(): void
|
|
{
|
|
$expectedResult = [
|
|
['1960-12-19', null],
|
|
];
|
|
|
|
$mergeRange = 'A1:B1';
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
|
|
$worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
|
|
$worksheet->mergeCells($mergeRange);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, true, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testMergeCellsHideBehaviour(): void
|
|
{
|
|
$expectedResult = [
|
|
[1.1, 2.2, 3.3],
|
|
[4.4, 5.5, 9.9],
|
|
[5.5, 7.7, 13.2],
|
|
];
|
|
|
|
$mergeRange = 'A1:C3';
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($this->testDataRaw, null, 'A1', true);
|
|
$worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, false, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function testMergeCellsHideBehaviourFormatted(): void
|
|
{
|
|
$expectedResult = [
|
|
['1960-12-19', '2022-09-15'],
|
|
];
|
|
|
|
$mergeRange = 'A1:B1';
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
|
|
$worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
|
|
$worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, true, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
/**
|
|
* @dataProvider mergeCellsMergeBehaviourProvider
|
|
*/
|
|
public function testMergeCellsMergeBehaviour(array $testData, string $mergeRange, array $expectedResult): void
|
|
{
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($testData, null, 'A1', true);
|
|
// Force a precalculation to populate the calculation cache, so that we can verify that it is being cleared
|
|
$worksheet->toArray();
|
|
$worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_MERGE);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, true, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
|
|
public function mergeCellsMergeBehaviourProvider(): array
|
|
{
|
|
return [
|
|
'With Calculated Values' => [
|
|
$this->testDataRaw,
|
|
'A1:C3',
|
|
[
|
|
['1.1 2.2 1.1 4.4 5.5 0 1.1 0 0', null, null],
|
|
[null, null, null],
|
|
[null, null, null],
|
|
],
|
|
],
|
|
'With Empty Cells' => [
|
|
[
|
|
[1, '', 2],
|
|
[null, 3, null],
|
|
[4, null, 5],
|
|
],
|
|
'A1:C3',
|
|
[
|
|
['1 2 3 4 5', null, null],
|
|
[null, null, null],
|
|
[null, null, null],
|
|
],
|
|
],
|
|
[
|
|
[
|
|
[12, '=5+1', '=A1/A2'],
|
|
],
|
|
'A1:C1',
|
|
[
|
|
['12 6 #DIV/0!', null, null],
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
public function testMergeCellsMergeBehaviourFormatted(): void
|
|
{
|
|
$expectedResult = [
|
|
['1960-12-19 2022-09-15', null],
|
|
];
|
|
|
|
$mergeRange = 'A1:B1';
|
|
$spreadsheet = new Spreadsheet();
|
|
$worksheet = $spreadsheet->getActiveSheet();
|
|
$worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
|
|
$worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
|
|
$worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_MERGE);
|
|
|
|
$mergeResult = $worksheet->toArray(null, true, true, false);
|
|
self::assertSame($expectedResult, $mergeResult);
|
|
$spreadsheet->disconnectWorksheets();
|
|
}
|
|
}
|