104 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
 | 
						|
 | 
						|
use PhpOffice\PhpSpreadsheet\Settings;
 | 
						|
use PhpOffice\PhpSpreadsheet\Shared\File;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
use ZipArchive;
 | 
						|
 | 
						|
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 = new ZipArchive();
 | 
						|
        if ($zip->open($resultFilename) !== false) {
 | 
						|
            $names = [];
 | 
						|
            $dupname = '';
 | 
						|
            for ($index = 0; $index < $zip->numFiles; ++$index) {
 | 
						|
                $filename = $zip->getNameIndex($index);
 | 
						|
                if (in_array($filename, $names)) {
 | 
						|
                    $dupname .= "$filename,";
 | 
						|
                } else {
 | 
						|
                    $names[] = $filename;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            $zip->close();
 | 
						|
        }
 | 
						|
        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());
 | 
						|
    }
 | 
						|
}
 |