| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use PhpOffice\PhpSpreadsheet\Settings; | 
					
						
							|  |  |  | use PhpOffice\PhpSpreadsheet\Shared\File; | 
					
						
							|  |  |  | use PHPUnit\Framework\TestCase; | 
					
						
							| 
									
										
										
										
											2020-10-09 14:08:20 +00:00
										 |  |  | use ZipArchive; | 
					
						
							| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class UnparsedDataCloneTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Test load and save Xlsx file with unparsed data (form elements, protected sheets, alternate contents, printer settings,..). | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function testLoadSaveXlsxWithUnparsedDataClone(): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sampleFilename = 'tests/data/Writer/XLSX/drawing_on_2nd_page.xlsx'; | 
					
						
							|  |  |  |         $resultFilename = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test'); | 
					
						
							|  |  |  |         Settings::setLibXmlLoaderOptions(null); // reset to default options
 | 
					
						
							|  |  |  |         $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); | 
					
						
							|  |  |  |         $spreadsheet = $reader->load($sampleFilename); | 
					
						
							|  |  |  |         $spreadsheet->setActiveSheetIndex(1); | 
					
						
							|  |  |  |         $sheet = $spreadsheet->getActiveSheet(); | 
					
						
							|  |  |  |         $drawings = $sheet->getDrawingCollection(); | 
					
						
							|  |  |  |         self::assertCount(1, $drawings); | 
					
						
							|  |  |  |         $sheetCodeName = $sheet->getCodeName(); | 
					
						
							|  |  |  |         $unparsedLoadedData = $spreadsheet->getUnparsedLoadedData(); | 
					
						
							|  |  |  |         self::assertArrayHasKey('printerSettings', $unparsedLoadedData['sheets'][$sheetCodeName]); | 
					
						
							|  |  |  |         self::assertCount(1, $unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $clonedSheet = clone $spreadsheet->getActiveSheet(); | 
					
						
							|  |  |  |         $clonedSheet->setTitle('Clone'); | 
					
						
							|  |  |  |         $spreadsheet->addSheet($clonedSheet); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); | 
					
						
							|  |  |  |         $writer->save($resultFilename); | 
					
						
							|  |  |  |         $dupname = 'Unable to open saved file'; | 
					
						
							| 
									
										
										
										
											2020-10-09 10:58:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 14:08:20 +00:00
										 |  |  |         $zip = new ZipArchive(); | 
					
						
							| 
									
										
										
										
											2020-10-09 10:58:33 +00:00
										 |  |  |         if ($zip->open($resultFilename) !== false) { | 
					
						
							| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  |             $names = []; | 
					
						
							|  |  |  |             $dupname = ''; | 
					
						
							| 
									
										
										
										
											2020-10-09 10:58:33 +00:00
										 |  |  |             for ($index = 0; $index < $zip->numFiles; ++$index) { | 
					
						
							|  |  |  |                 $filename = $zip->getNameIndex($index); | 
					
						
							|  |  |  |                 if (in_array($filename, $names)) { | 
					
						
							|  |  |  |                     $dupname .= "$filename,"; | 
					
						
							| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  |                 } else { | 
					
						
							| 
									
										
										
										
											2020-10-09 10:58:33 +00:00
										 |  |  |                     $names[] = $filename; | 
					
						
							| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-10-09 10:58:33 +00:00
										 |  |  |             $zip->close(); | 
					
						
							| 
									
										
										
										
											2020-06-19 18:26:02 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         unlink($resultFilename); | 
					
						
							|  |  |  |         self::assertEquals('', $dupname); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Test that saving twice with same writer works. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function testSaveTwice(): void | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sampleFilename = 'tests/data/Writer/XLSX/drawing_on_2nd_page.xlsx'; | 
					
						
							|  |  |  |         $resultFilename1 = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test1'); | 
					
						
							|  |  |  |         $resultFilename2 = tempnam(File::sysGetTempDir(), 'phpspreadsheet-test2'); | 
					
						
							|  |  |  |         self::assertNotEquals($resultFilename1, $resultFilename2); | 
					
						
							|  |  |  |         Settings::setLibXmlLoaderOptions(null); // reset to default options
 | 
					
						
							|  |  |  |         $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); | 
					
						
							|  |  |  |         $spreadsheet = $reader->load($sampleFilename); | 
					
						
							|  |  |  |         $sheet = $spreadsheet->setActiveSheetIndex(1); | 
					
						
							|  |  |  |         $sheet->setTitle('Original'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $clonedSheet = clone $spreadsheet->getActiveSheet(); | 
					
						
							|  |  |  |         $clonedSheet->setTitle('Clone'); | 
					
						
							|  |  |  |         $spreadsheet->addSheet($clonedSheet); | 
					
						
							|  |  |  |         $clonedSheet->getCell('A8')->setValue('cloned'); | 
					
						
							|  |  |  |         $sheet->getCell('A8')->setValue('original'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); | 
					
						
							|  |  |  |         $writer->save($resultFilename1); | 
					
						
							|  |  |  |         $reader1 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); | 
					
						
							|  |  |  |         $spreadsheet1 = $reader1->load($resultFilename1); | 
					
						
							|  |  |  |         unlink($resultFilename1); | 
					
						
							|  |  |  |         $sheet1c = $spreadsheet1->getSheetByName('Clone'); | 
					
						
							|  |  |  |         $sheet1o = $spreadsheet1->getSheetByName('Original'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $writer->save($resultFilename2); | 
					
						
							|  |  |  |         $reader2 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); | 
					
						
							|  |  |  |         $spreadsheet2 = $reader2->load($resultFilename2); | 
					
						
							|  |  |  |         unlink($resultFilename2); | 
					
						
							|  |  |  |         $sheet2c = $spreadsheet2->getSheetByName('Clone'); | 
					
						
							|  |  |  |         $sheet2o = $spreadsheet2->getSheetByName('Original'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self::assertEquals($spreadsheet1->getSheetCount(), $spreadsheet2->getSheetCount()); | 
					
						
							|  |  |  |         self::assertCount(1, $sheet1c->getDrawingCollection()); | 
					
						
							|  |  |  |         self::assertCount(1, $sheet1o->getDrawingCollection()); | 
					
						
							|  |  |  |         self::assertCount(1, $sheet2c->getDrawingCollection()); | 
					
						
							|  |  |  |         self::assertCount(1, $sheet2o->getDrawingCollection()); | 
					
						
							|  |  |  |         self::assertEquals('original', $sheet1o->getCell('A8')->getValue()); | 
					
						
							|  |  |  |         self::assertEquals('original', $sheet2o->getCell('A8')->getValue()); | 
					
						
							|  |  |  |         self::assertEquals('cloned', $sheet1c->getCell('A8')->getValue()); | 
					
						
							|  |  |  |         self::assertEquals('cloned', $sheet2c->getCell('A8')->getValue()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |