DrawingsTest.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
  3. use PhpOffice\PhpSpreadsheet\Comment;
  4. use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
  5. use PhpOffice\PhpSpreadsheet\IOFactory;
  6. use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  7. use PhpOffice\PhpSpreadsheet\Shared\File;
  8. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  9. use PhpOffice\PhpSpreadsheet\Worksheet\BaseDrawing;
  10. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  11. use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
  12. use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
  13. class DrawingsTest extends AbstractFunctional
  14. {
  15. /**
  16. * Test save and load XLSX file with drawing on 2nd worksheet.
  17. */
  18. public function testSaveLoadWithDrawingOn2ndWorksheet(): void
  19. {
  20. // Read spreadsheet from file
  21. $inputFilename = 'tests/data/Writer/XLSX/drawing_on_2nd_page.xlsx';
  22. $reader = new Xlsx();
  23. $spreadsheet = $reader->load($inputFilename);
  24. // Save spreadsheet to file and read it back
  25. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
  26. // Fake assert. The only thing we need is to ensure the file is loaded without exception
  27. self::assertNotNull($reloadedSpreadsheet);
  28. $spreadsheet->disconnectWorksheets();
  29. $reloadedSpreadsheet->disconnectWorksheets();
  30. }
  31. /**
  32. * Test save and load XLSX file with drawing with the same file name.
  33. */
  34. public function testSaveLoadWithDrawingWithSamePath(): void
  35. {
  36. // Read spreadsheet from file
  37. $originalFileName = 'tests/data/Writer/XLSX/saving_drawing_with_same_path.xlsx';
  38. $originalFile = file_get_contents($originalFileName);
  39. $tempFileName = File::sysGetTempDir() . '/saving_drawing_with_same_path';
  40. file_put_contents($tempFileName, $originalFile);
  41. $reader = new Xlsx();
  42. $spreadsheet = $reader->load($tempFileName);
  43. $spreadsheet->getActiveSheet()->setCellValue('D5', 'foo');
  44. // Save spreadsheet to file to the same path. Success test case won't
  45. // throw exception here
  46. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  47. $writer->save($tempFileName);
  48. $reloadedSpreadsheet = $reader->load($tempFileName);
  49. unlink($tempFileName);
  50. // Fake assert. The only thing we need is to ensure the file is loaded without exception
  51. self::assertNotNull($reloadedSpreadsheet);
  52. $spreadsheet->disconnectWorksheets();
  53. $reloadedSpreadsheet->disconnectWorksheets();
  54. }
  55. /**
  56. * Test save and load XLSX file with drawing in comment.
  57. */
  58. public function testSaveLoadWithDrawingInComment(): void
  59. {
  60. // Read spreadsheet from file
  61. $originalFileName = 'tests/data/Writer/XLSX/drawing_in_comment.xlsx';
  62. $originalFile = file_get_contents($originalFileName);
  63. $tempFileName = File::sysGetTempDir() . '/drawing_in_comment.xlsx';
  64. file_put_contents($tempFileName, $originalFile);
  65. // Load native xlsx file with drawing in comment background
  66. $reader = new Xlsx();
  67. $spreadsheet = $reader->load($tempFileName);
  68. $sheet = $spreadsheet->getActiveSheet();
  69. $comment = $sheet->getComment('A1');
  70. self::assertInstanceOf(Comment::class, $comment);
  71. self::assertTrue($comment->hasBackgroundImage());
  72. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  73. self::assertEquals($comment->getBackgroundImage()->getWidth(), 178);
  74. self::assertEquals($comment->getBackgroundImage()->getHeight(), 140);
  75. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_JPEG);
  76. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  77. $writer->save($tempFileName);
  78. $reloadedSpreadsheet = $reader->load($tempFileName);
  79. unlink($tempFileName);
  80. self::assertNotNull($reloadedSpreadsheet);
  81. $spreadsheet->disconnectWorksheets();
  82. $reloadedSpreadsheet->disconnectWorksheets();
  83. }
  84. /**
  85. * Test save and load XLSX file with drawing in comment, image in BMP/GIF format saved as PNG.
  86. */
  87. public function testDrawingInCommentImageFormatsConversions(): void
  88. {
  89. $reader = new Xlsx();
  90. $spreadsheet = new Spreadsheet();
  91. $sheet = $spreadsheet->getActiveSheet();
  92. // Add gif image to comment background
  93. $sheet->setCellValue('A1', '.gif');
  94. $drawing = new Drawing();
  95. $drawing->setName('Green Square');
  96. $drawing->setPath('tests/data/Writer/XLSX/green_square.gif');
  97. self::assertEquals($drawing->getWidth(), 150);
  98. self::assertEquals($drawing->getHeight(), 150);
  99. $comment = $sheet->getComment('A1');
  100. $comment->setBackgroundImage($drawing);
  101. $comment->setSizeAsBackgroundImage();
  102. self::assertEquals($comment->getWidth(), '112.5pt');
  103. self::assertEquals($comment->getHeight(), '112.5pt');
  104. self::assertInstanceOf(Comment::class, $comment);
  105. self::assertTrue($comment->hasBackgroundImage());
  106. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  107. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_GIF);
  108. // Add bmp image to comment background
  109. $sheet->setCellValue('A2', '.bmp 16 colors');
  110. $drawing = new Drawing();
  111. $drawing->setName('Yellow Square');
  112. $drawing->setPath('tests/data/Writer/XLSX/yellow_square_16.bmp');
  113. self::assertEquals($drawing->getWidth(), 70);
  114. self::assertEquals($drawing->getHeight(), 70);
  115. $comment = $sheet->getComment('A2');
  116. $comment->setBackgroundImage($drawing);
  117. $comment->setSizeAsBackgroundImage();
  118. self::assertEquals($comment->getWidth(), '52.5pt');
  119. self::assertEquals($comment->getHeight(), '52.5pt');
  120. self::assertInstanceOf(Comment::class, $comment);
  121. self::assertTrue($comment->hasBackgroundImage());
  122. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  123. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_BMP);
  124. // Write file
  125. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  126. $tempFileName = File::sysGetTempDir() . '/drawings_in_comments_conversions.xlsx';
  127. $writer->save($tempFileName);
  128. // Read new file
  129. $reloadedSpreadsheet = $reader->load($tempFileName);
  130. $sheet = $reloadedSpreadsheet->getActiveSheet();
  131. // Check first image in comment background
  132. $comment = $sheet->getComment('A1');
  133. self::assertEquals($comment->getWidth(), '112.5pt');
  134. self::assertEquals($comment->getHeight(), '112.5pt');
  135. self::assertInstanceOf(Comment::class, $comment);
  136. self::assertTrue($comment->hasBackgroundImage());
  137. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  138. self::assertEquals($comment->getBackgroundImage()->getWidth(), 150);
  139. self::assertEquals($comment->getBackgroundImage()->getHeight(), 150);
  140. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  141. // Check second image in comment background
  142. $comment = $sheet->getComment('A2');
  143. self::assertEquals($comment->getWidth(), '52.5pt');
  144. self::assertEquals($comment->getHeight(), '52.5pt');
  145. self::assertInstanceOf(Comment::class, $comment);
  146. self::assertTrue($comment->hasBackgroundImage());
  147. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  148. self::assertEquals($comment->getBackgroundImage()->getWidth(), 70);
  149. self::assertEquals($comment->getBackgroundImage()->getHeight(), 70);
  150. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  151. unlink($tempFileName);
  152. $spreadsheet->disconnectWorksheets();
  153. $reloadedSpreadsheet->disconnectWorksheets();
  154. }
  155. /**
  156. * Test build and save XLSX with drawings in comments with comment size correction.
  157. */
  158. public function testBuildWithDifferentImageFormats(): void
  159. {
  160. $reader = new Xlsx();
  161. $spreadsheet = new Spreadsheet();
  162. $sheet = $spreadsheet->getActiveSheet();
  163. // Add png image to comment background
  164. $sheet->setCellValue('A1', '.png');
  165. $drawing = new Drawing();
  166. $drawing->setName('Blue Square');
  167. $drawing->setPath('tests/data/Writer/XLSX/blue_square.png');
  168. self::assertEquals($drawing->getWidth(), 100);
  169. self::assertEquals($drawing->getHeight(), 100);
  170. $comment = $sheet->getComment('A1');
  171. $comment->setBackgroundImage($drawing);
  172. $comment->setSizeAsBackgroundImage();
  173. self::assertEquals($comment->getWidth(), '75pt');
  174. self::assertEquals($comment->getHeight(), '75pt');
  175. $comment = $sheet->getComment('A1');
  176. self::assertInstanceOf(Comment::class, $comment);
  177. self::assertTrue($comment->hasBackgroundImage());
  178. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  179. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  180. // Add gif image to comment background
  181. $sheet->setCellValue('A2', '.gif');
  182. $drawing = new Drawing();
  183. $drawing->setName('Green Square');
  184. $drawing->setPath('tests/data/Writer/XLSX/green_square.gif');
  185. self::assertEquals($drawing->getWidth(), 150);
  186. self::assertEquals($drawing->getHeight(), 150);
  187. $comment = $sheet->getComment('A2');
  188. $comment->setBackgroundImage($drawing);
  189. $comment->setSizeAsBackgroundImage();
  190. self::assertEquals($comment->getWidth(), '112.5pt');
  191. self::assertEquals($comment->getHeight(), '112.5pt');
  192. $comment = $sheet->getComment('A2');
  193. self::assertInstanceOf(Comment::class, $comment);
  194. self::assertTrue($comment->hasBackgroundImage());
  195. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  196. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_GIF);
  197. // Add jpeg image to comment background
  198. $sheet->setCellValue('A3', '.jpeg');
  199. $drawing = new Drawing();
  200. $drawing->setName('Red Square');
  201. $drawing->setPath('tests/data/Writer/XLSX/red_square.jpeg');
  202. self::assertEquals($drawing->getWidth(), 50);
  203. self::assertEquals($drawing->getHeight(), 50);
  204. $comment = $sheet->getComment('A3');
  205. $comment->setBackgroundImage($drawing);
  206. $comment->setSizeAsBackgroundImage();
  207. self::assertEquals($comment->getWidth(), '37.5pt');
  208. self::assertEquals($comment->getHeight(), '37.5pt');
  209. $comment = $sheet->getComment('A3');
  210. self::assertInstanceOf(Comment::class, $comment);
  211. self::assertTrue($comment->hasBackgroundImage());
  212. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  213. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_JPEG);
  214. // Add bmp image to comment background
  215. $sheet->setCellValue('A4', '.bmp 16 colors');
  216. $drawing = new Drawing();
  217. $drawing->setName('Yellow Square');
  218. $drawing->setPath('tests/data/Writer/XLSX/yellow_square_16.bmp');
  219. self::assertEquals($drawing->getWidth(), 70);
  220. self::assertEquals($drawing->getHeight(), 70);
  221. $comment = $sheet->getComment('A4');
  222. $comment->setBackgroundImage($drawing);
  223. $comment->setSizeAsBackgroundImage();
  224. self::assertEquals($comment->getWidth(), '52.5pt');
  225. self::assertEquals($comment->getHeight(), '52.5pt');
  226. $comment = $sheet->getComment('A4');
  227. self::assertInstanceOf(Comment::class, $comment);
  228. self::assertTrue($comment->hasBackgroundImage());
  229. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  230. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_BMP);
  231. // Add bmp image to comment background
  232. $sheet->setCellValue('A5', '.bmp 256 colors');
  233. $drawing = new Drawing();
  234. $drawing->setName('Brown Square');
  235. $drawing->setPath('tests/data/Writer/XLSX/brown_square_256.bmp');
  236. self::assertEquals($drawing->getWidth(), 70);
  237. self::assertEquals($drawing->getHeight(), 70);
  238. $comment = $sheet->getComment('A5');
  239. $comment->setBackgroundImage($drawing);
  240. $comment->setSizeAsBackgroundImage();
  241. self::assertEquals($comment->getWidth(), '52.5pt');
  242. self::assertEquals($comment->getHeight(), '52.5pt');
  243. $comment = $sheet->getComment('A5');
  244. self::assertInstanceOf(Comment::class, $comment);
  245. self::assertTrue($comment->hasBackgroundImage());
  246. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  247. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_BMP);
  248. // Add bmp image to comment background
  249. $sheet->setCellValue('A6', '.bmp 24 bit');
  250. $drawing = new Drawing();
  251. $drawing->setName('Orange Square');
  252. $drawing->setPath('tests/data/Writer/XLSX/orange_square_24_bit.bmp');
  253. self::assertEquals($drawing->getWidth(), 70);
  254. self::assertEquals($drawing->getHeight(), 70);
  255. self::assertSame(IMAGETYPE_PNG, $drawing->getImageTypeForSave());
  256. $comment = $sheet->getComment('A6');
  257. $comment->setBackgroundImage($drawing);
  258. $comment->setSizeAsBackgroundImage();
  259. self::assertEquals($comment->getWidth(), '52.5pt');
  260. self::assertEquals($comment->getHeight(), '52.5pt');
  261. $comment = $sheet->getComment('A6');
  262. self::assertInstanceOf(Comment::class, $comment);
  263. self::assertTrue($comment->hasBackgroundImage());
  264. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  265. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_BMP);
  266. // Add unsupported tiff image to comment background
  267. $sheet->setCellValue('A7', '.tiff');
  268. $drawing = new Drawing();
  269. $drawing->setName('Purple Square');
  270. $drawing->setPath('tests/data/Writer/XLSX/purple_square.tiff');
  271. self::assertStringContainsString('purple_square.tiff', $drawing->getFilename());
  272. self::assertFalse($drawing->getIsUrl());
  273. $comment = $sheet->getComment('A7');
  274. self::assertInstanceOf(Comment::class, $comment);
  275. self::assertFalse($comment->hasBackgroundImage());
  276. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  277. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_UNKNOWN);
  278. try {
  279. $comment->setBackgroundImage($drawing);
  280. self::fail('Should throw exception when attempting to add tiff');
  281. } catch (PhpSpreadsheetException $e) {
  282. self::assertInstanceOf(PhpSpreadsheetException::class, $e);
  283. self::assertEquals($e->getMessage(), 'Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
  284. }
  285. try {
  286. $drawing->getImageTypeForSave();
  287. self::fail('Should throw exception when attempting to get image type for tiff');
  288. } catch (PhpSpreadsheetException $e) {
  289. self::assertInstanceOf(PhpSpreadsheetException::class, $e);
  290. self::assertEquals($e->getMessage(), 'Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
  291. }
  292. try {
  293. $drawing->getMediaFilename();
  294. self::fail('Should throw exception when attempting to get media file name for tiff');
  295. } catch (PhpSpreadsheetException $e) {
  296. self::assertInstanceOf(PhpSpreadsheetException::class, $e);
  297. self::assertEquals($e->getMessage(), 'Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
  298. }
  299. try {
  300. $drawing->getImageFileExtensionForSave();
  301. self::fail('Should throw exception when attempting to get image file extention for tiff');
  302. } catch (PhpSpreadsheetException $e) {
  303. self::assertInstanceOf(PhpSpreadsheetException::class, $e);
  304. self::assertEquals($e->getMessage(), 'Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
  305. }
  306. try {
  307. $drawing->getImageMimeType();
  308. self::fail('Should throw exception when attempting to get image mime type for tiff');
  309. } catch (PhpSpreadsheetException $e) {
  310. self::assertInstanceOf(PhpSpreadsheetException::class, $e);
  311. self::assertEquals($e->getMessage(), 'Unsupported image type in comment background. Supported types: PNG, JPEG, BMP, GIF.');
  312. }
  313. // Write file
  314. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  315. $tempFileName = File::sysGetTempDir() . '/drawings_in_comments.xlsx';
  316. $writer->save($tempFileName);
  317. // Read new file
  318. $reloadedSpreadsheet = $reader->load($tempFileName);
  319. $sheet = $reloadedSpreadsheet->getActiveSheet();
  320. // Check first image in comment background
  321. $comment = $sheet->getComment('A1');
  322. self::assertEquals($comment->getWidth(), '75pt');
  323. self::assertEquals($comment->getHeight(), '75pt');
  324. self::assertInstanceOf(Comment::class, $comment);
  325. self::assertTrue($comment->hasBackgroundImage());
  326. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  327. self::assertEquals($comment->getBackgroundImage()->getWidth(), 100);
  328. self::assertEquals($comment->getBackgroundImage()->getHeight(), 100);
  329. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  330. // Check second image in comment background
  331. $comment = $sheet->getComment('A2');
  332. self::assertEquals($comment->getWidth(), '112.5pt');
  333. self::assertEquals($comment->getHeight(), '112.5pt');
  334. self::assertInstanceOf(Comment::class, $comment);
  335. self::assertTrue($comment->hasBackgroundImage());
  336. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  337. self::assertEquals($comment->getBackgroundImage()->getWidth(), 150);
  338. self::assertEquals($comment->getBackgroundImage()->getHeight(), 150);
  339. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  340. // Check third image in comment background
  341. $comment = $sheet->getComment('A3');
  342. self::assertEquals($comment->getWidth(), '37.5pt');
  343. self::assertEquals($comment->getHeight(), '37.5pt');
  344. self::assertInstanceOf(Comment::class, $comment);
  345. self::assertTrue($comment->hasBackgroundImage());
  346. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  347. self::assertEquals($comment->getBackgroundImage()->getWidth(), 50);
  348. self::assertEquals($comment->getBackgroundImage()->getHeight(), 50);
  349. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_JPEG);
  350. // Check fourth image in comment background
  351. $comment = $sheet->getComment('A4');
  352. self::assertEquals($comment->getWidth(), '52.5pt');
  353. self::assertEquals($comment->getHeight(), '52.5pt');
  354. self::assertInstanceOf(Comment::class, $comment);
  355. self::assertTrue($comment->hasBackgroundImage());
  356. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  357. self::assertEquals($comment->getBackgroundImage()->getWidth(), 70);
  358. self::assertEquals($comment->getBackgroundImage()->getHeight(), 70);
  359. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  360. // Check fifth image in comment background
  361. $comment = $sheet->getComment('A5');
  362. self::assertEquals($comment->getWidth(), '52.5pt');
  363. self::assertEquals($comment->getHeight(), '52.5pt');
  364. self::assertInstanceOf(Comment::class, $comment);
  365. self::assertTrue($comment->hasBackgroundImage());
  366. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  367. self::assertEquals($comment->getBackgroundImage()->getWidth(), 70);
  368. self::assertEquals($comment->getBackgroundImage()->getHeight(), 70);
  369. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  370. // Check sixth image in comment background
  371. $comment = $sheet->getComment('A6');
  372. self::assertEquals($comment->getWidth(), '52.5pt');
  373. self::assertEquals($comment->getHeight(), '52.5pt');
  374. self::assertInstanceOf(Comment::class, $comment);
  375. self::assertTrue($comment->hasBackgroundImage());
  376. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  377. self::assertEquals($comment->getBackgroundImage()->getWidth(), 70);
  378. self::assertEquals($comment->getBackgroundImage()->getHeight(), 70);
  379. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_PNG);
  380. // Check seventh image in comment background
  381. $comment = $sheet->getComment('A7');
  382. self::assertInstanceOf(Comment::class, $comment);
  383. self::assertFalse($comment->hasBackgroundImage());
  384. self::assertTrue($comment->getBackgroundImage() instanceof Drawing);
  385. self::assertEquals($comment->getBackgroundImage()->getWidth(), 0);
  386. self::assertEquals($comment->getBackgroundImage()->getHeight(), 0);
  387. self::assertEquals($comment->getBackgroundImage()->getType(), IMAGETYPE_UNKNOWN);
  388. unlink($tempFileName);
  389. $spreadsheet->disconnectWorksheets();
  390. $reloadedSpreadsheet->disconnectWorksheets();
  391. }
  392. /**
  393. * Test save and load XLSX file with drawing image that coordinate is two cell anchor.
  394. */
  395. public function testTwoCellAnchorDrawing(): void
  396. {
  397. $spreadsheet = new Spreadsheet();
  398. $sheet = $spreadsheet->getActiveSheet();
  399. // Add gif image that coordinates is two cell anchor.
  400. $drawing = new Drawing();
  401. $drawing->setName('Green Square');
  402. $drawing->setPath('tests/data/Writer/XLSX/green_square.gif');
  403. self::assertEquals($drawing->getWidth(), 150);
  404. self::assertEquals($drawing->getHeight(), 150);
  405. $drawing->setCoordinates('A1');
  406. $drawing->setOffsetX(30);
  407. $drawing->setOffsetY(10);
  408. $drawing->setCoordinates2('E8');
  409. $drawing->setOffsetX2(-50);
  410. $drawing->setOffsetY2(-20);
  411. $drawing->setWorksheet($sheet);
  412. // Write file
  413. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
  414. $spreadsheet->disconnectWorksheets();
  415. $rsheet = $reloadedSpreadsheet->getActiveSheet();
  416. // Check image coordinates.
  417. $drawingCollection = $rsheet->getDrawingCollection();
  418. self::assertCount(1, $drawingCollection);
  419. $drawing = $drawingCollection[0];
  420. self::assertNotNull($drawing);
  421. self::assertSame(150, $drawing->getWidth());
  422. self::assertSame(150, $drawing->getHeight());
  423. self::assertSame('A1', $drawing->getCoordinates());
  424. self::assertSame(30, $drawing->getOffsetX());
  425. self::assertSame(10, $drawing->getOffsetY());
  426. self::assertSame('E8', $drawing->getCoordinates2());
  427. self::assertSame(-50, $drawing->getOffsetX2());
  428. self::assertSame(-20, $drawing->getOffsetY2());
  429. self::assertSame($rsheet, $drawing->getWorksheet());
  430. $reloadedSpreadsheet->disconnectWorksheets();
  431. }
  432. /**
  433. * Test editAs attribute for two-cell anchors.
  434. *
  435. * @dataProvider providerEditAs
  436. */
  437. public function testTwoCellEditAs(string $editAs, ?string $expectedResult = null): void
  438. {
  439. if ($expectedResult === null) {
  440. $expectedResult = $editAs;
  441. }
  442. $spreadsheet = new Spreadsheet();
  443. $sheet = $spreadsheet->getActiveSheet();
  444. // Add gif image that coordinates is two cell anchor.
  445. $drawing = new Drawing();
  446. $drawing->setName('Green Square');
  447. $drawing->setPath('tests/data/Writer/XLSX/green_square.gif');
  448. self::assertEquals($drawing->getWidth(), 150);
  449. self::assertEquals($drawing->getHeight(), 150);
  450. $drawing->setCoordinates('A1');
  451. $drawing->setOffsetX(30);
  452. $drawing->setOffsetY(10);
  453. $drawing->setCoordinates2('E8');
  454. $drawing->setOffsetX2(-50);
  455. $drawing->setOffsetY2(-20);
  456. if ($editAs !== '') {
  457. $drawing->setEditAs($editAs);
  458. }
  459. $drawing->setWorksheet($sheet);
  460. // Write file
  461. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
  462. $spreadsheet->disconnectWorksheets();
  463. $rsheet = $reloadedSpreadsheet->getActiveSheet();
  464. // Check image coordinates.
  465. $drawingCollection = $rsheet->getDrawingCollection();
  466. $drawing = $drawingCollection[0];
  467. self::assertNotNull($drawing);
  468. self::assertSame(150, $drawing->getWidth());
  469. self::assertSame(150, $drawing->getHeight());
  470. self::assertSame('A1', $drawing->getCoordinates());
  471. self::assertSame(30, $drawing->getOffsetX());
  472. self::assertSame(10, $drawing->getOffsetY());
  473. self::assertSame('E8', $drawing->getCoordinates2());
  474. self::assertSame(-50, $drawing->getOffsetX2());
  475. self::assertSame(-20, $drawing->getOffsetY2());
  476. self::assertSame($rsheet, $drawing->getWorksheet());
  477. self::assertSame($expectedResult, $drawing->getEditAs());
  478. $reloadedSpreadsheet->disconnectWorksheets();
  479. }
  480. public function providerEditAs(): array
  481. {
  482. return [
  483. 'absolute' => ['absolute'],
  484. 'onecell' => ['oneCell'],
  485. 'twocell' => ['twoCell'],
  486. 'unset (will be treated as twoCell)' => [''],
  487. 'unknown (will be treated as twoCell)' => ['unknown', ''],
  488. ];
  489. }
  490. public function testMemoryDrawingDuplicateResource(): void
  491. {
  492. $gdImage = imagecreatetruecolor(120, 20);
  493. $textColor = ($gdImage === false) ? false : imagecolorallocate($gdImage, 255, 255, 255);
  494. if ($gdImage === false || $textColor === false) {
  495. self::fail('imagecreatetruecolor or imagecolorallocate failed');
  496. } else {
  497. $spreadsheet = new Spreadsheet();
  498. $aSheet = $spreadsheet->getActiveSheet();
  499. imagestring($gdImage, 1, 5, 5, 'Created with PhpSpreadsheet', $textColor);
  500. $listOfModes = [
  501. BaseDrawing::EDIT_AS_TWOCELL,
  502. BaseDrawing::EDIT_AS_ABSOLUTE,
  503. BaseDrawing::EDIT_AS_ONECELL,
  504. ];
  505. foreach ($listOfModes as $i => $mode) {
  506. $drawing = new MemoryDrawing();
  507. $drawing->setName('In-Memory image ' . $i);
  508. $drawing->setDescription('In-Memory image ' . $i);
  509. $drawing->setCoordinates('A' . ((4 * $i) + 1));
  510. $drawing->setCoordinates2('D' . ((4 * $i) + 4));
  511. $drawing->setEditAs($mode);
  512. $drawing->setImageResource($gdImage);
  513. $drawing->setRenderingFunction(
  514. MemoryDrawing::RENDERING_JPEG
  515. );
  516. $drawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT);
  517. $drawing->setWorksheet($aSheet);
  518. }
  519. $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
  520. $spreadsheet->disconnectWorksheets();
  521. foreach ($reloadedSpreadsheet->getActiveSheet()->getDrawingCollection() as $index => $pDrawing) {
  522. self::assertEquals($listOfModes[$index], $pDrawing->getEditAs(), 'functional test drawing twoCellAnchor');
  523. }
  524. $reloadedSpreadsheet->disconnectWorksheets();
  525. }
  526. }
  527. }