HtmlNumberFormatTest.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Html;
  3. use DOMDocument;
  4. use PhpOffice\PhpSpreadsheet\Settings;
  5. use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheet\Writer\Html;
  8. use PhpOffice\PhpSpreadsheetTests\Functional;
  9. class HtmlNumberFormatTest extends Functional\AbstractFunctional
  10. {
  11. /**
  12. * @var string
  13. */
  14. private $currency;
  15. /**
  16. * @var string
  17. */
  18. private $decsep;
  19. /**
  20. * @var string
  21. */
  22. private $thosep;
  23. protected function setUp(): void
  24. {
  25. $this->currency = StringHelper::getCurrencyCode();
  26. StringHelper::setCurrencyCode('$');
  27. $this->decsep = StringHelper::getDecimalSeparator();
  28. StringHelper::setDecimalSeparator('.');
  29. $this->thosep = StringHelper::getThousandsSeparator();
  30. StringHelper::setThousandsSeparator(',');
  31. }
  32. protected function tearDown(): void
  33. {
  34. StringHelper::setCurrencyCode($this->currency);
  35. StringHelper::setDecimalSeparator($this->decsep);
  36. StringHelper::setThousandsSeparator($this->thosep);
  37. }
  38. public function testColorNumberFormat(): void
  39. {
  40. $spreadsheet = new Spreadsheet();
  41. $sheet = $spreadsheet->getActiveSheet();
  42. $sheet->setCellValue('A1', -50);
  43. $sheet->setCellValue('A2', 3000);
  44. $sheet->setCellValue('A3', 0);
  45. $sheet->setCellValue('A4', '<br>');
  46. $fmt = '[Blue]$#,##0;[Red]$#,##0;$#,##0';
  47. $sheet->getStyle('A1:A4')->getNumberFormat()->setFormatCode($fmt);
  48. $writer = new Html($spreadsheet);
  49. $html = $writer->generateHTMLAll();
  50. $dom = new DOMDocument();
  51. $dom->loadHTML($html);
  52. $body = $dom->getElementsByTagName('body')[0];
  53. $divs = $body->getElementsByTagName('div');
  54. $tabl = $divs[0]->getElementsByTagName('table');
  55. $tbod = $tabl[0]->getElementsByTagName('tbody');
  56. $rows = $tbod[0]->getElementsByTagName('tr');
  57. self::assertCount(4, $rows);
  58. $tds = $rows[0]->getElementsByTagName('td');
  59. self::assertCount(1, $tds);
  60. $spans = $tds[0]->getElementsByTagName('span');
  61. self::assertCount(1, $spans);
  62. $style = $spans[0]->getAttribute('style');
  63. self::assertEquals(1, preg_match('/color:red/', $style));
  64. self::assertEquals('$50', $spans[0]->textContent);
  65. $tds = $rows[1]->getElementsByTagName('td');
  66. self::assertCount(1, $tds);
  67. $spans = $tds[0]->getElementsByTagName('span');
  68. self::assertCount(1, $spans);
  69. $style = $spans[0]->getAttribute('style');
  70. self::assertEquals(1, preg_match('/color:blue/', $style));
  71. self::assertEquals('$3,000', $spans[0]->textContent);
  72. $tds = $rows[2]->getElementsByTagName('td');
  73. self::assertCount(1, $tds);
  74. $spans = $tds[0]->getElementsByTagName('span');
  75. self::assertCount(0, $spans);
  76. self::assertEquals('$0', $tds[0]->textContent);
  77. $tds = $rows[3]->getElementsByTagName('td');
  78. self::assertCount(1, $tds);
  79. $spans = $tds[0]->getElementsByTagName('span');
  80. self::assertCount(0, $spans);
  81. self::assertEquals('<br>', $tds[0]->textContent);
  82. $this->writeAndReload($spreadsheet, 'Html');
  83. }
  84. public function testColorNumberFormatComplex(): void
  85. {
  86. $spreadsheet = new Spreadsheet();
  87. $sheet = $spreadsheet->getActiveSheet();
  88. $sheet->setCellValue('A1', -50);
  89. $sheet->setCellValue('A2', 3000.75);
  90. $sheet->setCellValue('A3', 0);
  91. $sheet->setCellValue('A4', 3000.25);
  92. $fmt = '[Blue][>=3000.5]$#,##0.00;[Red][<0]$#,##0.00;$#,##0.00';
  93. $sheet->getStyle('A1:A4')->getNumberFormat()->setFormatCode($fmt);
  94. $writer = new Html($spreadsheet);
  95. $html = $writer->generateHTMLAll();
  96. $dom = new DOMDocument();
  97. $dom->loadHTML($html);
  98. $body = $dom->getElementsByTagName('body')[0];
  99. $divs = $body->getElementsByTagName('div');
  100. $tabl = $divs[0]->getElementsByTagName('table');
  101. $tbod = $tabl[0]->getElementsByTagName('tbody');
  102. $rows = $tbod[0]->getElementsByTagName('tr');
  103. self::assertCount(4, $rows);
  104. $tds = $rows[0]->getElementsByTagName('td');
  105. self::assertCount(1, $tds);
  106. $spans = $tds[0]->getElementsByTagName('span');
  107. self::assertCount(1, $spans);
  108. $style = $spans[0]->getAttribute('style');
  109. self::assertEquals(1, preg_match('/color:red/', $style));
  110. self::assertEquals('$50.00', $spans[0]->textContent);
  111. $tds = $rows[1]->getElementsByTagName('td');
  112. self::assertCount(1, $tds);
  113. $spans = $tds[0]->getElementsByTagName('span');
  114. self::assertCount(1, $spans);
  115. $style = $spans[0]->getAttribute('style');
  116. self::assertEquals(1, preg_match('/color:blue/', $style));
  117. self::assertEquals('$3,000.75', $spans[0]->textContent);
  118. $tds = $rows[2]->getElementsByTagName('td');
  119. self::assertCount(1, $tds);
  120. $spans = $tds[0]->getElementsByTagName('span');
  121. self::assertCount(0, $spans);
  122. self::assertEquals('$0.00', $tds[0]->textContent);
  123. $tds = $rows[3]->getElementsByTagName('td');
  124. self::assertCount(1, $tds);
  125. $spans = $tds[0]->getElementsByTagName('span');
  126. self::assertCount(0, $spans);
  127. self::assertEquals('$3,000.25', $tds[0]->textContent);
  128. $this->writeAndReload($spreadsheet, 'Html');
  129. }
  130. /**
  131. * @dataProvider providerNumberFormat
  132. *
  133. * @param mixed $expectedResult
  134. * @param mixed $val
  135. * @param mixed $fmt
  136. */
  137. public function testFormatValueWithMask($expectedResult, $val, $fmt): void
  138. {
  139. $spreadsheet = new Spreadsheet();
  140. $sheet = $spreadsheet->getActiveSheet();
  141. $sheet->getCell('A1')->setValue($val)->getStyle()->getNumberFormat()->setFormatCode($fmt);
  142. $writer = new Html($spreadsheet);
  143. $html = $writer->generateHTMLAll();
  144. $dom = new DOMDocument();
  145. $dom->loadHTML($html);
  146. $body = $dom->getElementsByTagName('body')[0];
  147. $divs = $body->getElementsByTagName('div');
  148. $tabl = $divs[0]->getElementsByTagName('table');
  149. $tbod = $tabl[0]->getElementsByTagName('tbody');
  150. $rows = $tbod[0]->getElementsByTagName('tr');
  151. $tds = $rows[0]->getElementsByTagName('td');
  152. $nbsp = html_entity_decode('&nbsp;', Settings::htmlEntityFlags());
  153. self::assertEquals($expectedResult, str_replace($nbsp, ' ', $tds[0]->textContent));
  154. $this->writeAndReload($spreadsheet, 'Html');
  155. }
  156. public function providerNumberFormat(): array
  157. {
  158. return require __DIR__ . '/../../../data/Style/NumberFormat.php';
  159. }
  160. /**
  161. * @dataProvider providerNumberFormatDates
  162. *
  163. * @param mixed $expectedResult
  164. * @param mixed $val
  165. * @param mixed $fmt
  166. */
  167. public function testFormatValueWithMaskDate($expectedResult, $val, $fmt): void
  168. {
  169. $spreadsheet = new Spreadsheet();
  170. $sheet = $spreadsheet->getActiveSheet();
  171. $sheet->getCell('A1')->setValue($val)->getStyle()->getNumberFormat()->setFormatCode($fmt);
  172. $writer = new Html($spreadsheet);
  173. $html = $writer->generateHTMLAll();
  174. $dom = new DOMDocument();
  175. $dom->loadHTML($html);
  176. $body = $dom->getElementsByTagName('body')[0];
  177. $divs = $body->getElementsByTagName('div');
  178. $tabl = $divs[0]->getElementsByTagName('table');
  179. $tbod = $tabl[0]->getElementsByTagName('tbody');
  180. $rows = $tbod[0]->getElementsByTagName('tr');
  181. $tds = $rows[0]->getElementsByTagName('td');
  182. $nbsp = html_entity_decode('&nbsp;', Settings::htmlEntityFlags());
  183. self::assertEquals($expectedResult, str_replace($nbsp, ' ', $tds[0]->textContent));
  184. $this->writeAndReload($spreadsheet, 'Html');
  185. }
  186. public function providerNumberFormatDates(): array
  187. {
  188. return require __DIR__ . '/../../../data/Style/NumberFormatDates.php';
  189. }
  190. }