Charts32XmlTest.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Chart;
  3. use PhpOffice\PhpSpreadsheet\Chart\Properties;
  4. use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
  5. use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
  6. use PHPUnit\Framework\TestCase;
  7. class Charts32XmlTest extends TestCase
  8. {
  9. // These tests can only be performed by examining xml.
  10. private const DIRECTORY = 'samples' . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR;
  11. /**
  12. * @dataProvider providerScatterCharts
  13. */
  14. public function testBezierCount(int $expectedCount, string $inputFile): void
  15. {
  16. $file = self::DIRECTORY . $inputFile;
  17. $reader = new XlsxReader();
  18. $reader->setIncludeCharts(true);
  19. $spreadsheet = $reader->load($file);
  20. $sheet = $spreadsheet->getActiveSheet();
  21. $charts = $sheet->getChartCollection();
  22. self::assertCount(1, $charts);
  23. $chart = $charts[0];
  24. self::assertNotNull($chart);
  25. $writer = new XlsxWriter($spreadsheet);
  26. $writer->setIncludeCharts(true);
  27. $writerChart = new XlsxWriter\Chart($writer);
  28. $data = $writerChart->writeChart($chart);
  29. $spreadsheet->disconnectWorksheets();
  30. self::assertSame(1, substr_count($data, '<c:scatterStyle val='));
  31. self::assertSame($expectedCount ? 1 : 0, substr_count($data, '<c:scatterStyle val="smoothMarker"/>'));
  32. self::assertSame($expectedCount, substr_count($data, '<c:smooth val="1"/>'));
  33. }
  34. public function providerScatterCharts(): array
  35. {
  36. return [
  37. 'no line' => [0, '32readwriteScatterChart1.xlsx'],
  38. 'smooth line (Bezier)' => [3, '32readwriteScatterChart2.xlsx'],
  39. 'straight line' => [0, '32readwriteScatterChart3.xlsx'],
  40. ];
  41. }
  42. public function testAreaPercentageNoCat(): void
  43. {
  44. $file = self::DIRECTORY . '32readwriteAreaPercentageChart1.xlsx';
  45. $reader = new XlsxReader();
  46. $reader->setIncludeCharts(true);
  47. $spreadsheet = $reader->load($file);
  48. $sheet = $spreadsheet->getActiveSheet();
  49. $charts = $sheet->getChartCollection();
  50. self::assertCount(1, $charts);
  51. $chart = $charts[0];
  52. self::assertNotNull($chart);
  53. $writer = new XlsxWriter($spreadsheet);
  54. $writer->setIncludeCharts(true);
  55. $writerChart = new XlsxWriter\Chart($writer);
  56. $data = $writerChart->writeChart($chart);
  57. $spreadsheet->disconnectWorksheets();
  58. // confirm that file contains expected tags
  59. self::assertSame(0, substr_count($data, '<c:cat>'));
  60. }
  61. /**
  62. * @dataProvider providerCatAxValAx
  63. */
  64. public function testCatAxValAx(?bool $numeric): void
  65. {
  66. $file = self::DIRECTORY . '32readwriteScatterChart1.xlsx';
  67. $reader = new XlsxReader();
  68. $reader->setIncludeCharts(true);
  69. $spreadsheet = $reader->load($file);
  70. $sheet = $spreadsheet->getActiveSheet();
  71. $charts = $sheet->getChartCollection();
  72. self::assertCount(1, $charts);
  73. $chart = $charts[0];
  74. self::assertNotNull($chart);
  75. $xAxis = $chart->getChartAxisX();
  76. $yAxis = $chart->getChartAxisY();
  77. self::assertSame(Properties::FORMAT_CODE_GENERAL, $xAxis->getAxisNumberFormat());
  78. if (is_bool($numeric)) {
  79. $xAxis->setAxisNumberProperties(Properties::FORMAT_CODE_GENERAL, true);
  80. }
  81. self::assertSame('valAx', $yAxis->getAxisType());
  82. self::assertSame('valAx', $xAxis->getAxisType());
  83. self::assertSame(Properties::FORMAT_CODE_GENERAL, $yAxis->getAxisNumberFormat());
  84. $xAxis->setAxisType('');
  85. $yAxis->setAxisType('');
  86. if (is_bool($numeric)) {
  87. $xAxis->setAxisNumberProperties(Properties::FORMAT_CODE_GENERAL, $numeric);
  88. $yAxis->setAxisNumberProperties(Properties::FORMAT_CODE_GENERAL, $numeric);
  89. }
  90. $writer = new XlsxWriter($spreadsheet);
  91. $writer->setIncludeCharts(true);
  92. $writerChart = new XlsxWriter\Chart($writer);
  93. $data = $writerChart->writeChart($chart);
  94. $spreadsheet->disconnectWorksheets();
  95. if ($numeric === true) {
  96. self::assertSame(0, substr_count($data, '<c:catAx>'));
  97. self::assertSame(2, substr_count($data, '<c:valAx>'));
  98. } else {
  99. self::assertSame(1, substr_count($data, '<c:catAx>'));
  100. self::assertSame(1, substr_count($data, '<c:valAx>'));
  101. }
  102. }
  103. public function providerCatAxValAx(): array
  104. {
  105. return [
  106. [true],
  107. [false],
  108. [null],
  109. ];
  110. }
  111. public function testCatAxValAxFromRead(): void
  112. {
  113. $file = self::DIRECTORY . '32readwriteScatterChart1.xlsx';
  114. $reader = new XlsxReader();
  115. $reader->setIncludeCharts(true);
  116. $spreadsheet = $reader->load($file);
  117. $sheet = $spreadsheet->getActiveSheet();
  118. $charts = $sheet->getChartCollection();
  119. self::assertCount(1, $charts);
  120. $chart = $charts[0];
  121. self::assertNotNull($chart);
  122. $xAxis = $chart->getChartAxisX();
  123. $yAxis = $chart->getChartAxisY();
  124. self::assertSame(Properties::FORMAT_CODE_GENERAL, $xAxis->getAxisNumberFormat());
  125. self::assertSame('valAx', $yAxis->getAxisType());
  126. self::assertSame('valAx', $xAxis->getAxisType());
  127. self::assertSame(Properties::FORMAT_CODE_GENERAL, $yAxis->getAxisNumberFormat());
  128. $writer = new XlsxWriter($spreadsheet);
  129. $writer->setIncludeCharts(true);
  130. $writerChart = new XlsxWriter\Chart($writer);
  131. $data = $writerChart->writeChart($chart);
  132. $spreadsheet->disconnectWorksheets();
  133. self::assertSame(0, substr_count($data, '<c:catAx>'));
  134. self::assertSame(2, substr_count($data, '<c:valAx>'));
  135. }
  136. public function testAreaPrstClr(): void
  137. {
  138. $file = self::DIRECTORY . '32readwriteAreaChart4.xlsx';
  139. $reader = new XlsxReader();
  140. $reader->setIncludeCharts(true);
  141. $spreadsheet = $reader->load($file);
  142. $sheet = $spreadsheet->getActiveSheet();
  143. $charts = $sheet->getChartCollection();
  144. self::assertCount(1, $charts);
  145. $chart = $charts[0];
  146. self::assertNotNull($chart);
  147. $writer = new XlsxWriter($spreadsheet);
  148. $writer->setIncludeCharts(true);
  149. $writerChart = new XlsxWriter\Chart($writer);
  150. $data = $writerChart->writeChart($chart);
  151. $spreadsheet->disconnectWorksheets();
  152. self::assertSame(
  153. 1,
  154. substr_count(
  155. $data,
  156. '</c:tx><c:spPr><a:solidFill><a:prstClr val="red"/>'
  157. )
  158. );
  159. }
  160. public function testDateAx(): void
  161. {
  162. $file = self::DIRECTORY . '32readwriteLineDateAxisChart1.xlsx';
  163. $reader = new XlsxReader();
  164. $reader->setIncludeCharts(true);
  165. $spreadsheet = $reader->load($file);
  166. $sheet = $spreadsheet->getActiveSheet();
  167. $charts = $sheet->getChartCollection();
  168. self::assertCount(2, $charts);
  169. $chart = $charts[1];
  170. self::assertNotNull($chart);
  171. $writer = new XlsxWriter($spreadsheet);
  172. $writer->setIncludeCharts(true);
  173. $writerChart = new XlsxWriter\Chart($writer);
  174. $data = $writerChart->writeChart($chart);
  175. $spreadsheet->disconnectWorksheets();
  176. self::assertSame(
  177. 1,
  178. substr_count(
  179. $data,
  180. '<c:baseTimeUnit val="days"/><c:majorTimeUnit val="months"/><c:minorTimeUnit val="months"/>'
  181. )
  182. );
  183. self::assertSame(
  184. 1,
  185. substr_count(
  186. $data,
  187. '<c:dateAx>'
  188. )
  189. );
  190. self::assertSame(
  191. 1,
  192. substr_count(
  193. $data,
  194. '<c:valAx>'
  195. )
  196. );
  197. }
  198. }