102 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | 
 | ||
|  | namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx; | ||
|  | 
 | ||
|  | use PhpOffice\PhpSpreadsheet\Settings; | ||
|  | use PhpOffice\PhpSpreadsheet\Shared\File; | ||
|  | use PHPUnit\Framework\TestCase; | ||
|  | 
 | ||
|  | 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'; | ||
|  |         $zip = zip_open($resultFilename); | ||
|  |         if (is_resource($zip)) { | ||
|  |             $names = []; | ||
|  |             $dupname = ''; | ||
|  |             while ($zip_entry = zip_read($zip)) { | ||
|  |                 $zipname = zip_entry_name($zip_entry); | ||
|  |                 if (in_array($zipname, $names)) { | ||
|  |                     $dupname .= "$zipname,"; | ||
|  |                 } else { | ||
|  |                     $names[] = $zipname; | ||
|  |                 } | ||
|  |             } | ||
|  |             zip_close($zip); | ||
|  |         } | ||
|  |         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()); | ||
|  |     } | ||
|  | } |