UnparsedDataTest.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
  3. use Exception;
  4. use PhpOffice\PhpSpreadsheet\Settings;
  5. use PhpOffice\PhpSpreadsheet\Shared\File;
  6. use PHPUnit\Framework\TestCase;
  7. use ZipArchive;
  8. class UnparsedDataTest extends TestCase
  9. {
  10. /**
  11. * Test load and save Xlsx file with unparsed data (form elements, protected sheets, alternate contents, printer settings,..).
  12. */
  13. public function testLoadSaveXlsxWithUnparsedData(): void
  14. {
  15. $sampleFilename = 'tests/data/Writer/XLSX/form_pass_print.xlsm';
  16. $resultFilename = File::temporaryFilename();
  17. $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  18. $excel = $reader->load($sampleFilename);
  19. $excel->getSheet(1)->setCellValue('B1', '222');
  20. $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($excel);
  21. $writer->save($resultFilename);
  22. self::assertFileExists($resultFilename);
  23. $resultZip = new ZipArchive();
  24. $resultZip->open($resultFilename);
  25. $resultContentTypesRaw = $resultZip->getFromName('[Content_Types].xml');
  26. $resultControlPropRaw = $resultZip->getFromName('xl/ctrlProps/ctrlProp1.xml');
  27. $resultDrawingRaw = $resultZip->getFromName('xl/drawings/drawing1.xml');
  28. $resultVmlDrawingRaw = $resultZip->getFromName('xl/drawings/vmlDrawing1.vml');
  29. $resultPrinterSettingsRaw = $resultZip->getFromName('xl/printerSettings/printerSettings1.bin');
  30. $resultVbaProjectRaw = $resultZip->getFromName('xl/vbaProject.bin');
  31. $resultWorkbookRaw = $resultZip->getFromName('xl/workbook.xml');
  32. $resultSheet1RelsRaw = $resultZip->getFromName('xl/worksheets/_rels/sheet1.xml.rels');
  33. $resultSheet1Raw = $resultZip->getFromName('xl/worksheets/sheet1.xml');
  34. $resultSheet2Raw = $resultZip->getFromName('xl/worksheets/sheet2.xml');
  35. if (false === $resultZip->close()) {
  36. throw new Exception("Could not close zip file \"{$resultFilename}\".");
  37. }
  38. unlink($resultFilename);
  39. // [Content_Types].xml
  40. self::assertStringContainsString('application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings', $resultContentTypesRaw, 'Content type for printerSettings not found!');
  41. self::assertStringContainsString('application/vnd.ms-office.vbaProject', $resultContentTypesRaw, 'Content type for VbaProject not found!');
  42. self::assertStringContainsString('application/vnd.ms-excel.controlproperties+xml', $resultContentTypesRaw, 'Content type for ctrlProp not found!');
  43. // xl/ctrlProps/ctrlProp1.xml
  44. self::assertNotEmpty($resultControlPropRaw, 'ctrlProp not found!');
  45. // xl/drawings/drawing1.xml
  46. self::assertStringContainsString('<mc:AlternateContent', $resultDrawingRaw, 'AlternateContent at drawing.xml not found!');
  47. // xl/drawings/vmlDrawing1.vml
  48. self::assertNotEmpty($resultVmlDrawingRaw, 'vmlDrawing not found!');
  49. // xl/printerSettings/printerSettings1.bin
  50. self::assertNotEmpty($resultPrinterSettingsRaw, 'printerSettings.bin not found!');
  51. // xl/vbaProject.bin
  52. self::assertNotEmpty($resultVbaProjectRaw, 'vbaProject.bin not found!');
  53. // xl/workbook.xml
  54. $xmlWorkbook = simplexml_load_string($resultWorkbookRaw ?: '', 'SimpleXMLElement', Settings::getLibXmlLoaderOptions());
  55. self::assertNotFalse($xmlWorkbook);
  56. if (!$xmlWorkbook->workbookProtection) {
  57. self::fail('workbook.xml/workbookProtection not found!');
  58. } else {
  59. self::assertEquals($xmlWorkbook->workbookProtection['workbookPassword'], 'CBEB', 'workbook.xml/workbookProtection[workbookPassword] is wrong!');
  60. self::assertEquals($xmlWorkbook->workbookProtection['lockStructure'], 'true', 'workbook.xml/workbookProtection[lockStructure] is wrong!');
  61. self::assertNotNull($xmlWorkbook->sheets->sheet[0]);
  62. self::assertEquals($xmlWorkbook->sheets->sheet[0]['state'], '', 'workbook.xml/sheets/sheet[0][state] is wrong!');
  63. self::assertNotNull($xmlWorkbook->sheets->sheet[1]);
  64. self::assertEquals($xmlWorkbook->sheets->sheet[1]['state'], 'hidden', 'workbook.xml/sheets/sheet[1][state] is wrong!');
  65. }
  66. unset($xmlWorkbook);
  67. // xl/worksheets/_rels/sheet1.xml.rels
  68. self::assertStringContainsString('http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings', $resultSheet1RelsRaw, 'Sheet relation with printerSettings not found!');
  69. self::assertStringContainsString('http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', $resultSheet1RelsRaw, 'Sheet relation with vmlDrawing not found!');
  70. self::assertStringContainsString('http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp', $resultSheet1RelsRaw, 'Sheet relation with ctrlProp not found!');
  71. // xl/worksheets/sheet1.xml
  72. self::assertStringContainsString('<mc:AlternateContent', $resultSheet1Raw, 'AlternateContent at sheet1.xml not found!');
  73. $xmlWorksheet = simplexml_load_string($resultSheet1Raw ?: '', 'SimpleXMLElement', Settings::getLibXmlLoaderOptions());
  74. self::assertNotFalse($xmlWorksheet);
  75. $pageSetupAttributes = $xmlWorksheet->pageSetup->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  76. self::assertTrue(isset($pageSetupAttributes->id), 'sheet1.xml/pageSetup[r:id] not found!');
  77. if (!$xmlWorksheet->sheetProtection) {
  78. self::fail('sheet1.xml/sheetProtection not found!');
  79. } else {
  80. self::assertEquals($xmlWorksheet->sheetProtection['password'], 'CBEB', 'sheet1.xml/sheetProtection[password] is wrong!');
  81. self::assertEquals($xmlWorksheet->sheetProtection['sheet'], 'true', 'sheet1.xml/sheetProtection[sheet] is wrong!');
  82. self::assertEquals($xmlWorksheet->sheetProtection['objects'], 'true', 'sheet1.xml/sheetProtection[objects] is wrong!');
  83. self::assertEquals($xmlWorksheet->sheetProtection['scenarios'], 'true', 'sheet1.xml/sheetProtection[scenarios] is wrong!');
  84. }
  85. unset($xmlWorksheet);
  86. // xl/worksheets/sheet2.xml
  87. self::assertNotEmpty($resultSheet2Raw, 'sheet2.xml not found!');
  88. }
  89. }