MergeBehaviourTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Worksheet;
  3. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  4. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  5. use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
  6. class MergeBehaviourTest extends AbstractFunctional
  7. {
  8. /**
  9. * @var array
  10. */
  11. private $testDataRaw = [
  12. [1.1, 2.2, '=ROUND(A1+B1, 1)'],
  13. [4.4, 5.5, '=ROUND(A2+B2, 1)'],
  14. ['=ROUND(A1+A2, 1)', '=ROUND(B1+B2, 1)', '=ROUND(A3+B3, 1)'],
  15. ];
  16. /**
  17. * @var array
  18. */
  19. private $testDataFormatted = [
  20. ['=DATE(1960, 12, 19)', '=DATE(2022, 09, 15)'],
  21. ];
  22. public function testMergeCellsDefaultBehaviour(): void
  23. {
  24. $expectedResult = [
  25. [1.1, null, null],
  26. [null, null, null],
  27. [null, null, null],
  28. ];
  29. $mergeRange = 'A1:C3';
  30. $spreadsheet = new Spreadsheet();
  31. $worksheet = $spreadsheet->getActiveSheet();
  32. $worksheet->fromArray($this->testDataRaw, null, 'A1', true);
  33. $worksheet->mergeCells($mergeRange);
  34. $mergeResult = $worksheet->toArray(null, true, true, false);
  35. self::assertSame($expectedResult, $mergeResult);
  36. }
  37. public function testMergeCellsDefaultBehaviourFormatted(): void
  38. {
  39. $expectedResult = [
  40. ['1960-12-19', null],
  41. ];
  42. $mergeRange = 'A1:B1';
  43. $spreadsheet = new Spreadsheet();
  44. $worksheet = $spreadsheet->getActiveSheet();
  45. $worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
  46. $worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
  47. $worksheet->mergeCells($mergeRange);
  48. $mergeResult = $worksheet->toArray(null, true, true, false);
  49. self::assertSame($expectedResult, $mergeResult);
  50. }
  51. public function testMergeCellsHideBehaviour(): void
  52. {
  53. $expectedResult = [
  54. [1.1, 2.2, 3.3],
  55. [4.4, 5.5, 9.9],
  56. [5.5, 7.7, 13.2],
  57. ];
  58. $mergeRange = 'A1:C3';
  59. $spreadsheet = new Spreadsheet();
  60. $worksheet = $spreadsheet->getActiveSheet();
  61. $worksheet->fromArray($this->testDataRaw, null, 'A1', true);
  62. $worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
  63. $mergeResult = $worksheet->toArray(null, true, true, false);
  64. self::assertSame($expectedResult, $mergeResult);
  65. }
  66. public function testMergeCellsHideBehaviourFormatted(): void
  67. {
  68. $expectedResult = [
  69. ['1960-12-19', '2022-09-15'],
  70. ];
  71. $mergeRange = 'A1:B1';
  72. $spreadsheet = new Spreadsheet();
  73. $worksheet = $spreadsheet->getActiveSheet();
  74. $worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
  75. $worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
  76. $worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_HIDE);
  77. $mergeResult = $worksheet->toArray(null, true, true, false);
  78. self::assertSame($expectedResult, $mergeResult);
  79. }
  80. /**
  81. * @dataProvider mergeCellsMergeBehaviourProvider
  82. */
  83. public function testMergeCellsMergeBehaviour(array $testData, string $mergeRange, array $expectedResult): void
  84. {
  85. $spreadsheet = new Spreadsheet();
  86. $worksheet = $spreadsheet->getActiveSheet();
  87. $worksheet->fromArray($testData, null, 'A1', true);
  88. // Force a precalculation to populate the calculation cache, so that we can verify that it is being cleared
  89. $worksheet->toArray();
  90. $worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_MERGE);
  91. $mergeResult = $worksheet->toArray(null, true, true, false);
  92. self::assertSame($expectedResult, $mergeResult);
  93. }
  94. public function mergeCellsMergeBehaviourProvider(): array
  95. {
  96. return [
  97. 'With Calculated Values' => [
  98. $this->testDataRaw,
  99. 'A1:C3',
  100. [
  101. ['1.1 2.2 1.1 4.4 5.5 0 1.1 0 0', null, null],
  102. [null, null, null],
  103. [null, null, null],
  104. ],
  105. ],
  106. 'With Empty Cells' => [
  107. [
  108. [1, '', 2],
  109. [null, 3, null],
  110. [4, null, 5],
  111. ],
  112. 'A1:C3',
  113. [
  114. ['1 2 3 4 5', null, null],
  115. [null, null, null],
  116. [null, null, null],
  117. ],
  118. ],
  119. [
  120. [
  121. [12, '=5+1', '=A1/A2'],
  122. ],
  123. 'A1:C1',
  124. [
  125. ['12 6 #DIV/0!', null, null],
  126. ],
  127. ],
  128. ];
  129. }
  130. public function testMergeCellsMergeBehaviourFormatted(): void
  131. {
  132. $expectedResult = [
  133. ['1960-12-19 2022-09-15', null],
  134. ];
  135. $mergeRange = 'A1:B1';
  136. $spreadsheet = new Spreadsheet();
  137. $worksheet = $spreadsheet->getActiveSheet();
  138. $worksheet->fromArray($this->testDataFormatted, null, 'A1', true);
  139. $worksheet->getStyle($mergeRange)->getNumberFormat()->setFormatCode('yyyy-mm-dd');
  140. $worksheet->mergeCells($mergeRange, Worksheet::MERGE_CELL_CONTENT_MERGE);
  141. $mergeResult = $worksheet->toArray(null, true, true, false);
  142. self::assertSame($expectedResult, $mergeResult);
  143. }
  144. }