DefinedNameFormulaTest.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests;
  3. use PhpOffice\PhpSpreadsheet\DefinedName;
  4. use PhpOffice\PhpSpreadsheet\NamedFormula;
  5. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  6. use PHPUnit\Framework\TestCase;
  7. class DefinedNameFormulaTest extends TestCase
  8. {
  9. /**
  10. * @dataProvider providerRangeOrFormula
  11. */
  12. public function testRangeOrFormula(string $value, bool $expectedResult): void
  13. {
  14. $actualResult = DefinedName::testIfFormula($value);
  15. self::assertSame($expectedResult, $actualResult);
  16. }
  17. public function testAddDefinedNames(): void
  18. {
  19. $spreadSheet = new Spreadsheet();
  20. $workSheet = $spreadSheet->getActiveSheet();
  21. $definedNamesForTest = $this->providerRangeOrFormula();
  22. foreach ($definedNamesForTest as $key => $definedNameData) {
  23. [$value] = $definedNameData;
  24. $name = str_replace([' ', '-'], '_', $key);
  25. $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
  26. }
  27. $allDefinedNames = $spreadSheet->getDefinedNames();
  28. self::assertCount(count($definedNamesForTest), $allDefinedNames);
  29. }
  30. public function testGetNamedRanges(): void
  31. {
  32. $spreadSheet = new Spreadsheet();
  33. $workSheet = $spreadSheet->getActiveSheet();
  34. $rangeOrFormula = [];
  35. $definedNamesForTest = $this->providerRangeOrFormula();
  36. foreach ($definedNamesForTest as $key => $definedNameData) {
  37. [$value, $isFormula] = $definedNameData;
  38. $rangeOrFormula[] = !$isFormula;
  39. $name = str_replace([' ', '-'], '_', $key);
  40. $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
  41. }
  42. $allNamedRanges = $spreadSheet->getNamedRanges();
  43. self::assertCount(count(array_filter($rangeOrFormula)), $allNamedRanges);
  44. }
  45. public function testGetScopedNamedRange(): void
  46. {
  47. $rangeName = 'NAMED_RANGE';
  48. $globalRangeValue = 'A1';
  49. $localRangeValue = 'A2';
  50. $spreadSheet = new Spreadsheet();
  51. $workSheet = $spreadSheet->getActiveSheet();
  52. $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet, $globalRangeValue));
  53. $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet, $localRangeValue, true));
  54. $localScopedRange = $spreadSheet->getNamedRange($rangeName, $workSheet);
  55. self::assertNotNull($localScopedRange);
  56. self::assertSame($localRangeValue, $localScopedRange->getValue());
  57. }
  58. public function testGetGlobalNamedRange(): void
  59. {
  60. $rangeName = 'NAMED_RANGE';
  61. $globalRangeValue = 'A1';
  62. $localRangeValue = 'A2';
  63. $spreadSheet = new Spreadsheet();
  64. $workSheet1 = $spreadSheet->getActiveSheet();
  65. $spreadSheet->createSheet(1);
  66. $workSheet2 = $spreadSheet->getSheet(1);
  67. $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet1, $globalRangeValue));
  68. $spreadSheet->addDefinedName(DefinedName::createInstance($rangeName, $workSheet1, $localRangeValue, true));
  69. $localScopedRange = $spreadSheet->getNamedRange($rangeName, $workSheet2);
  70. self::assertNotNull($localScopedRange);
  71. self::assertSame($globalRangeValue, $localScopedRange->getValue());
  72. }
  73. public function testGetNamedFormulae(): void
  74. {
  75. $spreadSheet = new Spreadsheet();
  76. $workSheet = $spreadSheet->getActiveSheet();
  77. $rangeOrFormula = [];
  78. $definedNamesForTest = $this->providerRangeOrFormula();
  79. foreach ($definedNamesForTest as $key => $definedNameData) {
  80. [$value, $isFormula] = $definedNameData;
  81. $rangeOrFormula[] = $isFormula;
  82. $name = str_replace([' ', '-'], '_', $key);
  83. $spreadSheet->addDefinedName(DefinedName::createInstance($name, $workSheet, $value));
  84. }
  85. $allNamedFormulae = $spreadSheet->getNamedFormulae();
  86. self::assertCount(count(array_filter($rangeOrFormula)), $allNamedFormulae);
  87. }
  88. public function testGetScopedNamedFormula(): void
  89. {
  90. $formulaName = 'GERMAN_VAT_RATE';
  91. $globalFormulaValue = '=19.0%';
  92. $localFormulaValue = '=16.0%';
  93. $spreadSheet = new Spreadsheet();
  94. $workSheet = $spreadSheet->getActiveSheet();
  95. $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet, $globalFormulaValue));
  96. $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet, $localFormulaValue, true));
  97. $localScopedFormula = $spreadSheet->getNamedFormula($formulaName, $workSheet);
  98. self::assertNotNull($localScopedFormula);
  99. self::assertSame($localFormulaValue, $localScopedFormula->getValue());
  100. }
  101. public function testGetGlobalNamedFormula(): void
  102. {
  103. $formulaName = 'GERMAN_VAT_RATE';
  104. $globalFormulaValue = '=19.0%';
  105. $localFormulaValue = '=16.0%';
  106. $spreadSheet = new Spreadsheet();
  107. $workSheet1 = $spreadSheet->getActiveSheet();
  108. $spreadSheet->createSheet(1);
  109. $workSheet2 = $spreadSheet->getSheet(1);
  110. $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet1, $globalFormulaValue));
  111. $spreadSheet->addDefinedName(DefinedName::createInstance($formulaName, $workSheet1, $localFormulaValue, true));
  112. $localScopedFormula = $spreadSheet->getNamedFormula($formulaName, $workSheet2);
  113. self::assertNotNull($localScopedFormula);
  114. self::assertSame($globalFormulaValue, $localScopedFormula->getValue());
  115. }
  116. public function providerRangeOrFormula(): array
  117. {
  118. return [
  119. 'simple range' => ['A1', false],
  120. 'simple absolute range' => ['$A$1', false],
  121. 'simple integer value' => ['42', true],
  122. 'simple float value' => ['12.5', true],
  123. 'simple string value' => ['"HELLO WORLD"', true],
  124. 'range with a worksheet name' => ['Sheet2!$A$1', false],
  125. 'range with a quoted worksheet name' => ["'Work Sheet #2'!\$A\$1:\$E\$1", false],
  126. 'range with a quoted worksheet name containing quotes' => ["'Mark''s WorkSheet'!\$A\$1:\$E\$1", false],
  127. 'range with a utf-8 worksheet name' => ['Γειά!$A$1', false],
  128. 'range with a quoted utf-8 worksheet name' => ["'Γειά σου Κόσμε'!\$A\$1", false],
  129. 'range with a quoted worksheet name with quotes in a formula' => ["'Mark''s WorkSheet'!\$A\$1+5", true],
  130. 'range with a quoted worksheet name in a formula' => ["5*'Work Sheet #2'!\$A\$1", true],
  131. 'multiple ranges with quoted worksheet names with quotes in a formula' => ["'Mark''s WorkSheet'!\$A\$1+'Mark''s WorkSheet'!\$B\$2", true],
  132. 'named range in a formula' => ['NAMED_RANGE_VALUE+12', true],
  133. 'named range and range' => ['NAMED_RANGE_VALUE_1,Sheet2!$A$1', false],
  134. 'range with quoted utf-8 worksheet name and a named range' => ["NAMED_RANGE_VALUE_1,'Γειά σου Κόσμε'!\$A\$1", false],
  135. 'composite named range' => ['NAMED_RANGE_VALUE_1,NAMED_RANGE_VALUE_2 NAMED_RANGE_VALUE_3', false],
  136. 'named ranges in a formula' => ['NAMED_RANGE_VALUE_1/NAMED_RANGE_VALUE_2', true],
  137. 'utf-8 named range' => ['Γειά', false],
  138. 'utf-8 named range in a formula' => ['2*Γειά', true],
  139. 'utf-8 named ranges' => ['Γειά,σου Κόσμε', false],
  140. 'utf-8 named ranges in a formula' => ['Здравствуй+мир', true],
  141. ];
  142. }
  143. public function testEmptyNamedFormula(): void
  144. {
  145. $this->expectException(\PhpOffice\PhpSpreadsheet\Exception::class);
  146. $spreadSheet = new Spreadsheet();
  147. $workSheet1 = $spreadSheet->getActiveSheet();
  148. new NamedFormula('namedformula', $workSheet1);
  149. }
  150. public function testChangeFormula(): void
  151. {
  152. $spreadSheet = new Spreadsheet();
  153. $workSheet1 = $spreadSheet->getActiveSheet();
  154. $namedFormula = new NamedFormula('namedformula', $workSheet1, '=1');
  155. self::assertEquals('=1', $namedFormula->getFormula());
  156. $namedFormula->setFormula('=2');
  157. self::assertEquals('=2', $namedFormula->getFormula());
  158. $namedFormula->setFormula('');
  159. self::assertEquals('=2', $namedFormula->getFormula());
  160. }
  161. }