UnparsedDataCloneTest.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
  3. use PhpOffice\PhpSpreadsheet\Shared\File;
  4. use PHPUnit\Framework\TestCase;
  5. use ZipArchive;
  6. class UnparsedDataCloneTest extends TestCase
  7. {
  8. /**
  9. * Test load and save Xlsx file with unparsed data (form elements, protected sheets, alternate contents, printer settings,..).
  10. */
  11. public function testLoadSaveXlsxWithUnparsedDataClone(): void
  12. {
  13. $sampleFilename = 'tests/data/Writer/XLSX/drawing_on_2nd_page.xlsx';
  14. $resultFilename = File::temporaryFilename();
  15. $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  16. $spreadsheet = $reader->load($sampleFilename);
  17. $spreadsheet->setActiveSheetIndex(1);
  18. $sheet = $spreadsheet->getActiveSheet();
  19. $drawings = $sheet->getDrawingCollection();
  20. self::assertCount(1, $drawings);
  21. $sheetCodeName = $sheet->getCodeName();
  22. $unparsedLoadedData = $spreadsheet->getUnparsedLoadedData();
  23. self::assertArrayHasKey('printerSettings', $unparsedLoadedData['sheets'][$sheetCodeName]);
  24. self::assertCount(1, $unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings']);
  25. $clonedSheet = clone $spreadsheet->getActiveSheet();
  26. $clonedSheet->setTitle('Clone');
  27. $spreadsheet->addSheet($clonedSheet);
  28. $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  29. $writer->save($resultFilename);
  30. $dupname = 'Unable to open saved file';
  31. $zip = new ZipArchive();
  32. if ($zip->open($resultFilename) !== false) {
  33. $names = [];
  34. $dupname = '';
  35. for ($index = 0; $index < $zip->numFiles; ++$index) {
  36. $filename = $zip->getNameIndex($index);
  37. if (in_array($filename, $names)) {
  38. $dupname .= "$filename,";
  39. } else {
  40. $names[] = $filename;
  41. }
  42. }
  43. $zip->close();
  44. }
  45. unlink($resultFilename);
  46. self::assertEquals('', $dupname);
  47. }
  48. /**
  49. * Test that saving twice with same writer works.
  50. */
  51. public function testSaveTwice(): void
  52. {
  53. $sampleFilename = 'tests/data/Writer/XLSX/drawing_on_2nd_page.xlsx';
  54. $resultFilename1 = File::temporaryFilename();
  55. $resultFilename2 = File::temporaryFilename();
  56. self::assertNotEquals($resultFilename1, $resultFilename2);
  57. $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  58. $spreadsheet = $reader->load($sampleFilename);
  59. $sheet = $spreadsheet->setActiveSheetIndex(1);
  60. $sheet->setTitle('Original');
  61. $clonedSheet = clone $spreadsheet->getActiveSheet();
  62. $clonedSheet->setTitle('Clone');
  63. $spreadsheet->addSheet($clonedSheet);
  64. $clonedSheet->getCell('A8')->setValue('cloned');
  65. $sheet->getCell('A8')->setValue('original');
  66. $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  67. $writer->save($resultFilename1);
  68. $reader1 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  69. $spreadsheet1 = $reader1->load($resultFilename1);
  70. unlink($resultFilename1);
  71. $sheet1c = $spreadsheet1->getSheetByNameOrThrow('Clone');
  72. $sheet1o = $spreadsheet1->getSheetByNameOrThrow('Original');
  73. $writer->save($resultFilename2);
  74. $reader2 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  75. $spreadsheet2 = $reader2->load($resultFilename2);
  76. unlink($resultFilename2);
  77. $sheet2c = $spreadsheet2->getSheetByNameOrThrow('Clone');
  78. $sheet2o = $spreadsheet2->getSheetByNameOrThrow('Original');
  79. self::assertEquals($spreadsheet1->getSheetCount(), $spreadsheet2->getSheetCount());
  80. self::assertCount(1, $sheet1c->getDrawingCollection());
  81. self::assertCount(1, $sheet1o->getDrawingCollection());
  82. self::assertCount(1, $sheet2c->getDrawingCollection());
  83. self::assertCount(1, $sheet2o->getDrawingCollection());
  84. self::assertEquals('original', $sheet1o->getCell('A8')->getValue());
  85. self::assertEquals('original', $sheet2o->getCell('A8')->getValue());
  86. self::assertEquals('cloned', $sheet1c->getCell('A8')->getValue());
  87. self::assertEquals('cloned', $sheet2c->getCell('A8')->getValue());
  88. }
  89. }