SpreadsheetTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests;
  3. use PhpOffice\PhpSpreadsheet\Exception as ssException;
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  6. use PHPUnit\Framework\TestCase;
  7. class SpreadsheetTest extends TestCase
  8. {
  9. /** @var ?Spreadsheet */
  10. private $spreadsheet;
  11. protected function tearDown(): void
  12. {
  13. if ($this->spreadsheet !== null) {
  14. $this->spreadsheet->disconnectWorksheets();
  15. $this->spreadsheet = null;
  16. }
  17. }
  18. private function getSpreadsheet(): Spreadsheet
  19. {
  20. $this->spreadsheet = $spreadsheet = new Spreadsheet();
  21. $sheet = $spreadsheet->getActiveSheet();
  22. $sheet->setTitle('someSheet1');
  23. $sheet = new Worksheet();
  24. $sheet->setTitle('someSheet2');
  25. $spreadsheet->addSheet($sheet);
  26. $sheet = new Worksheet();
  27. $sheet->setTitle('someSheet 3');
  28. $spreadsheet->addSheet($sheet);
  29. return $spreadsheet;
  30. }
  31. public function dataProviderForSheetNames(): array
  32. {
  33. $array = [
  34. [0, 'someSheet1'],
  35. [0, "'someSheet1'"],
  36. [1, 'someSheet2'],
  37. [1, "'someSheet2'"],
  38. [2, 'someSheet 3'],
  39. [2, "'someSheet 3'"],
  40. [null, 'someSheet 33'],
  41. ];
  42. return $array;
  43. }
  44. /**
  45. * @dataProvider dataProviderForSheetNames
  46. */
  47. public function testGetSheetByName(?int $index, string $sheetName): void
  48. {
  49. $spreadsheet = $this->getSpreadsheet();
  50. if ($index === null) {
  51. self::assertNull($spreadsheet->getSheetByName($sheetName));
  52. } else {
  53. self::assertSame($spreadsheet->getSheet($index), $spreadsheet->getSheetByName($sheetName));
  54. }
  55. }
  56. public function testAddSheetDuplicateTitle(): void
  57. {
  58. $spreadsheet = $this->getSpreadsheet();
  59. $this->expectException(ssException::class);
  60. $sheet = new Worksheet();
  61. $sheet->setTitle('someSheet2');
  62. $spreadsheet->addSheet($sheet);
  63. }
  64. public function testAddSheetNoAdjustActive(): void
  65. {
  66. $spreadsheet = $this->getSpreadsheet();
  67. $spreadsheet->setActiveSheetIndex(2);
  68. self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
  69. $sheet = new Worksheet();
  70. $sheet->setTitle('someSheet4');
  71. $spreadsheet->addSheet($sheet);
  72. self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
  73. }
  74. public function testAddSheetAdjustActive(): void
  75. {
  76. $spreadsheet = $this->getSpreadsheet();
  77. $spreadsheet->setActiveSheetIndex(2);
  78. self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
  79. $sheet = new Worksheet();
  80. $sheet->setTitle('someSheet0');
  81. $spreadsheet->addSheet($sheet, 0);
  82. self::assertEquals(3, $spreadsheet->getActiveSheetIndex());
  83. }
  84. public function testRemoveSheetIndexTooHigh(): void
  85. {
  86. $spreadsheet = $this->getSpreadsheet();
  87. $this->expectException(ssException::class);
  88. $spreadsheet->removeSheetByIndex(4);
  89. }
  90. public function testRemoveSheetNoAdjustActive(): void
  91. {
  92. $spreadsheet = $this->getSpreadsheet();
  93. $spreadsheet->setActiveSheetIndex(1);
  94. self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
  95. $spreadsheet->removeSheetByIndex(2);
  96. self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
  97. }
  98. public function testRemoveSheetAdjustActive(): void
  99. {
  100. $spreadsheet = $this->getSpreadsheet();
  101. $spreadsheet->setActiveSheetIndex(2);
  102. self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
  103. $spreadsheet->removeSheetByIndex(1);
  104. self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
  105. }
  106. public function testGetSheetIndexTooHigh(): void
  107. {
  108. $spreadsheet = $this->getSpreadsheet();
  109. $this->expectException(ssException::class);
  110. $spreadsheet->getSheet(4);
  111. }
  112. public function testGetIndexNonExistent(): void
  113. {
  114. $spreadsheet = $this->getSpreadsheet();
  115. $this->expectException(ssException::class);
  116. $sheet = new Worksheet();
  117. $sheet->setTitle('someSheet4');
  118. $spreadsheet->getIndex($sheet);
  119. }
  120. public function testSetIndexByName(): void
  121. {
  122. $spreadsheet = $this->getSpreadsheet();
  123. $spreadsheet->setIndexByName('someSheet1', 1);
  124. self::assertEquals('someSheet2', $spreadsheet->getSheet(0)->getTitle());
  125. self::assertEquals('someSheet1', $spreadsheet->getSheet(1)->getTitle());
  126. self::assertEquals('someSheet 3', $spreadsheet->getSheet(2)->getTitle());
  127. }
  128. public function testRemoveAllSheets(): void
  129. {
  130. $spreadsheet = $this->getSpreadsheet();
  131. $spreadsheet->setActiveSheetIndex(2);
  132. self::assertEquals(2, $spreadsheet->getActiveSheetIndex());
  133. $spreadsheet->removeSheetByIndex(0);
  134. self::assertEquals(1, $spreadsheet->getActiveSheetIndex());
  135. $spreadsheet->removeSheetByIndex(0);
  136. self::assertEquals(0, $spreadsheet->getActiveSheetIndex());
  137. $spreadsheet->removeSheetByIndex(0);
  138. self::assertEquals(-1, $spreadsheet->getActiveSheetIndex());
  139. $sheet = new Worksheet();
  140. $sheet->setTitle('someSheet4');
  141. $spreadsheet->addSheet($sheet);
  142. self::assertEquals(0, $spreadsheet->getActiveSheetIndex());
  143. }
  144. public function testBug1735(): void
  145. {
  146. $spreadsheet1 = new Spreadsheet();
  147. $spreadsheet1->createSheet()->setTitle('addedsheet');
  148. $spreadsheet1->setActiveSheetIndex(1);
  149. $spreadsheet1->removeSheetByIndex(0);
  150. $sheet = $spreadsheet1->getActiveSheet();
  151. self::assertEquals('addedsheet', $sheet->getTitle());
  152. }
  153. public function testSetActiveSheetIndexTooHigh(): void
  154. {
  155. $spreadsheet = $this->getSpreadsheet();
  156. $this->expectException(ssException::class);
  157. $spreadsheet->setActiveSheetIndex(4);
  158. }
  159. public function testSetActiveSheetNoSuchName(): void
  160. {
  161. $spreadsheet = $this->getSpreadsheet();
  162. $this->expectException(ssException::class);
  163. $spreadsheet->setActiveSheetIndexByName('unknown');
  164. }
  165. public function testAddExternal(): void
  166. {
  167. $spreadsheet = $this->getSpreadsheet();
  168. $spreadsheet1 = new Spreadsheet();
  169. $sheet = $spreadsheet1->createSheet()->setTitle('someSheet19');
  170. $sheet->getCell('A1')->setValue(1);
  171. $sheet->getCell('A1')->getStyle()->getFont()->setBold(true);
  172. $sheet->getCell('B1')->getStyle()->getFont()->setSuperscript(true);
  173. $sheet->getCell('C1')->getStyle()->getFont()->setSubscript(true);
  174. self::assertCount(4, $spreadsheet1->getCellXfCollection());
  175. self::assertEquals(1, $sheet->getCell('A1')->getXfIndex());
  176. $spreadsheet->getActiveSheet()->getCell('A1')->getStyle()->getFont()->setBold(true);
  177. self::assertCount(2, $spreadsheet->getCellXfCollection());
  178. $sheet3 = $spreadsheet->addExternalSheet($sheet);
  179. self::assertCount(6, $spreadsheet->getCellXfCollection());
  180. self::assertEquals('someSheet19', $sheet3->getTitle());
  181. self::assertEquals(1, $sheet3->getCell('A1')->getValue());
  182. self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getBold());
  183. // Prove Xf index changed although style is same.
  184. self::assertEquals(3, $sheet3->getCell('A1')->getXfIndex());
  185. }
  186. public function testAddExternalDuplicateName(): void
  187. {
  188. $this->expectException(ssException::class);
  189. $spreadsheet = new Spreadsheet();
  190. $sheet = $spreadsheet->createSheet()->setTitle('someSheet1');
  191. $sheet->getCell('A1')->setValue(1);
  192. $sheet->getCell('A1')->getStyle()->getFont()->setBold(true);
  193. $spreadsheet->addExternalSheet($sheet);
  194. }
  195. public function testAddExternalColumnDimensionStyles(): void
  196. {
  197. $spreadsheet1 = new Spreadsheet();
  198. $sheet1 = $spreadsheet1->createSheet()->setTitle('sheetWithColumnDimension');
  199. $sheet1->getCell('A1')->setValue(1);
  200. $sheet1->getCell('A1')->getStyle()->getFont()->setItalic(true);
  201. $sheet1->getColumnDimension('B')->setWidth(10)->setXfIndex($sheet1->getCell('A1')->getXfIndex());
  202. $index = $sheet1->getColumnDimension('B')->getXfIndex();
  203. self::assertEquals(1, $index);
  204. self::assertCount(2, $spreadsheet1->getCellXfCollection());
  205. $spreadsheet2 = new Spreadsheet();
  206. $sheet2 = $spreadsheet2->createSheet()->setTitle('sheetWithTwoStyles');
  207. $sheet2->getCell('A1')->setValue(1);
  208. $sheet2->getCell('A1')->getStyle()->getFont()->setBold(true);
  209. $sheet2->getCell('B2')->getStyle()->getFont()->setSuperscript(true);
  210. $countXfs = count($spreadsheet2->getCellXfCollection());
  211. self::assertEquals(3, $countXfs);
  212. $sheet3 = $spreadsheet2->addExternalSheet($sheet1);
  213. self::assertCount(5, $spreadsheet2->getCellXfCollection());
  214. self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getItalic());
  215. self::assertTrue($sheet3->getCell('B1')->getStyle()->getFont()->getItalic());
  216. self::assertFalse($sheet3->getCell('B1')->getStyle()->getFont()->getBold());
  217. // Prove Xf index changed although style is same.
  218. self::assertEquals($countXfs + $index, $sheet3->getCell('B1')->getXfIndex());
  219. self::assertEquals($countXfs + $index, $sheet3->getColumnDimension('B')->getXfIndex());
  220. }
  221. public function testAddExternalRowDimensionStyles(): void
  222. {
  223. $spreadsheet1 = new Spreadsheet();
  224. $sheet1 = $spreadsheet1->createSheet()->setTitle('sheetWithColumnDimension');
  225. $sheet1->getCell('A1')->setValue(1);
  226. $sheet1->getCell('A1')->getStyle()->getFont()->setItalic(true);
  227. $sheet1->getRowDimension(2)->setXfIndex($sheet1->getCell('A1')->getXfIndex());
  228. $index = $sheet1->getRowDimension(2)->getXfIndex();
  229. self::assertEquals(1, $index);
  230. self::assertCount(2, $spreadsheet1->getCellXfCollection());
  231. $spreadsheet2 = new Spreadsheet();
  232. $sheet2 = $spreadsheet2->createSheet()->setTitle('sheetWithTwoStyles');
  233. $sheet2->getCell('A1')->setValue(1);
  234. $sheet2->getCell('A1')->getStyle()->getFont()->setBold(true);
  235. $sheet2->getCell('B2')->getStyle()->getFont()->setSuperscript(true);
  236. $countXfs = count($spreadsheet2->getCellXfCollection());
  237. self::assertEquals(3, $countXfs);
  238. $sheet3 = $spreadsheet2->addExternalSheet($sheet1);
  239. self::assertCount(5, $spreadsheet2->getCellXfCollection());
  240. self::assertTrue($sheet3->getCell('A1')->getStyle()->getFont()->getItalic());
  241. self::assertTrue($sheet3->getCell('A2')->getStyle()->getFont()->getItalic());
  242. self::assertFalse($sheet3->getCell('A2')->getStyle()->getFont()->getBold());
  243. // Prove Xf index changed although style is same.
  244. self::assertEquals($countXfs + $index, $sheet3->getCell('A2')->getXfIndex());
  245. self::assertEquals($countXfs + $index, $sheet3->getRowDimension(2)->getXfIndex());
  246. }
  247. }