From e7a0e8092d186998852598a27a50840912bdc010 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Wed, 28 Dec 2022 08:01:53 -0800 Subject: [PATCH] Limited Support for Form Controls V2 (ListBox, Buttons, etc.) (#3130) * WIP Limited Support for Form Controls V2 (ListBox, Buttons, etc.) This is a replacement for draft PR #2455 and draft PR #3127. There is some useful commentary in those PRs which I have mostly, but not entirely, duplicated below. Fix #2396. Fix #1770. Fix #2388. A related problem is that the vml files used for the form controls sometimes contain invalid xml. Fix #3125 (rejected previous PR #1181 as too risky, issue was also reported as #170). Vml file should be valid Xml, but Excel can generate unclosed `
` tags, preventing Xlsx reader from reading file correctly. I believe a very narrowly targeted fix, changing `
` to `
`, and only when reading vml files, probably mitigates the risk. The sample file formscomments.xlsx which is part of this change shows this problem with `Button 1` on sheet `Forms`; the spreadsheet was created with Excel 365, so the problem is not restricted to Excel 2013 as originally reported. A comment on PR 3127 indicates that other tags might be involved, but, without a file demonstrating that, I will restrict this change to br tags for now. I am starting this out in draft status, and will probably leave it that way for some time. I'm not sure where we want to go with this. It fixes some problems, but in a limited manner, and creates some others. I'm not sure the pain of the others is balanced considering the limitations of the fix. If enough interest is generated as a result of this ticket being out there, we can proceed; if not, it probably isn't worth it. This fix allows form control elements to be read in and written out. It does not allow you to add such elements, nor even to locate them or determine their properties (so you can't modify or delete them). Although it handles reading and writing of sheets containing both form controls and comments, it will probably create a corrupt spreadsheet if you try adding a new comment to a sheet with form controls - probably quite difficult to solve. Cloning the sheet probably won't work either - probably easier than the other. It is conceivable that we want to add a new property to the Xlsx Reader which turns the reading of form elements on or off (default=off), so that negative effects will be limited to those who have explictly opted in. The change in its current form does not implement such a property. Because of its limitations, the change isn't really testable. As in some other recent installs, I have added a sample to demonstrate that it works correctly. As it turns out, if we have a worksheet which contains both form controls and comments (see formscomments.xlsx which is part of this PR), PhpSpreadsheet already creates a corrupt file when it tries to load and save the spreadsheet with such a worksheet. With this change, the file is saved without corruption. This tilts things in favor of proceeding. I'm still not ready, but this will be an important consideration. A sample file for issue #2621 illustrated a problem with shape files. Since they are involved here, I took a look at how the sample worked with this code. In master, and with this change, a corrupt file results. Fixing that is probably easier than the general problem of handling shape files, but it's an argument against moving this forward until the corruption problem can be addressed. Fix #2661. A template including checkboxes was leading to file corruption solved by this PR. Another argument for moving forward. * Improved Sample File, and Documentation Add more realistic worksheet to spreadsheet. Document new feature, adding caveats to how it can be used. --- docs/topics/reading-and-writing-to-file.md | 16 ++++++++++++++ samples/Reader/22_Reader_formscomments.php | 22 +++++++++++++++++++ samples/Reader/22_Reader_issue1767.php | 1 + samples/Reader/sampleData/formscomments.xlsx | Bin 0 -> 128633 bytes src/PhpSpreadsheet/Reader/Xlsx.php | 17 ++++++++++++-- src/PhpSpreadsheet/Writer/Xlsx.php | 13 +++++++---- src/PhpSpreadsheet/Writer/Xlsx/Rels.php | 4 +++- src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php | 3 ++- 8 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 samples/Reader/22_Reader_formscomments.php create mode 100644 samples/Reader/sampleData/formscomments.xlsx diff --git a/docs/topics/reading-and-writing-to-file.md b/docs/topics/reading-and-writing-to-file.md index e06fa0f1c4..3a9e7f3db9 100644 --- a/docs/topics/reading-and-writing-to-file.md +++ b/docs/topics/reading-and-writing-to-file.md @@ -184,6 +184,22 @@ code: it disables several Office2007 file format options, resulting in a lower-featured Office2007 spreadsheet. +### Form Control Fields + +PhpSpreadsheet offers limited support for Forms Controls (buttons, +checkboxes, etc.). The support is available only for Excel 2007 format, +and is offered solely to allow loading a spreadsheet with such controls +and saving it as a new file. +Support is not available for adding such elements to the spreadsheet, +nor even to locate them to determine their properties +(so you can't modify or delete them). +Modifications to a worksheet with controls are "caveat emptor"; +some modifications will work correctly, +but others are very likely to cause problems, +e.g. adding a comment to the worksheet, +or inserting or deleting rows or columns in a manner that would +cause the controls to change location. + ## Excel 5 (BIFF) file format Xls file format is the old Excel file format, implemented in diff --git a/samples/Reader/22_Reader_formscomments.php b/samples/Reader/22_Reader_formscomments.php new file mode 100644 index 0000000000..3f1dd3c5cb --- /dev/null +++ b/samples/Reader/22_Reader_formscomments.php @@ -0,0 +1,22 @@ +log('Start'); + +$inputFileType = 'Xlsx'; +$inputFileName = __DIR__ . '/sampleData/formscomments.xlsx'; + +$helper->log('Loading file ' . $inputFileName . ' using IOFactory with a defined reader type of ' . $inputFileType); +$reader = IOFactory::createReader($inputFileType); +$helper->log('Loading all WorkSheets'); +$reader->setLoadAllSheets(); +$spreadsheet = $reader->load($inputFileName); + +// Save +$helper->write($spreadsheet, __FILE__, ['Xlsx']); +$spreadsheet->disconnectWorksheets(); + +$helper->log('end'); diff --git a/samples/Reader/22_Reader_issue1767.php b/samples/Reader/22_Reader_issue1767.php index 2c1ce93143..10caef1216 100644 --- a/samples/Reader/22_Reader_issue1767.php +++ b/samples/Reader/22_Reader_issue1767.php @@ -17,5 +17,6 @@ // Save $helper->write($spreadsheet, __FILE__); +$spreadsheet->disconnectWorksheets(); $helper->log('end'); diff --git a/samples/Reader/sampleData/formscomments.xlsx b/samples/Reader/sampleData/formscomments.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..27810586d109004cf8464906597d2bf8499d680f GIT binary patch literal 128633 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 literal 0 HcmV?d00001 diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index a79b25e418..0d769ea159 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -122,9 +122,12 @@ public static function falseToArray($value): array return is_array($value) ? $value : []; } - private function loadZip(string $filename, string $ns = ''): SimpleXMLElement + private function loadZip(string $filename, string $ns = '', bool $replaceUnclosedBr = false): SimpleXMLElement { $contents = $this->getFromZipArchive($this->zip, $filename); + if ($replaceUnclosedBr) { + $contents = str_replace('
', '
', $contents); + } $rels = simplexml_load_string( $this->securityScanner->scan($contents), 'SimpleXMLElement', @@ -1029,6 +1032,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet // later we will remove from it real vmlComments $unparsedVmlDrawings = $vmlComments; + $vmlDrawingContents = []; // Loop through VML comments foreach ($vmlComments as $relName => $relPath) { @@ -1037,7 +1041,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet try { // no namespace okay - processed with Xpath - $vmlCommentsFile = $this->loadZip($relPath, ''); + $vmlCommentsFile = $this->loadZip($relPath, '', true); $vmlCommentsFile->registerXPathNamespace('v', Namespaces::URN_VML); } catch (Throwable $ex) { //Ignore unparsable vmlDrawings. Later they will be moved from $unparsedVmlDrawings to $unparsedLoadedData @@ -1047,6 +1051,7 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet // Locate VML drawings image relations $drowingImages = []; $VMLDrawingsRelations = dirname($relPath) . '/_rels/' . basename($relPath) . '.rels'; + $vmlDrawingContents[$relName] = $this->securityScanner->scan($this->getFromZipArchive($zip, $relPath)); if ($zip->locateName($VMLDrawingsRelations)) { $relsVMLDrawing = $this->loadZip($VMLDrawingsRelations, Namespaces::RELATIONSHIPS); foreach ($relsVMLDrawing->Relationship as $elex) { @@ -1519,6 +1524,14 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet } } } + if ($xmlSheet->legacyDrawing && !$this->readDataOnly) { + foreach ($xmlSheet->legacyDrawing as $drawing) { + $drawingRelId = (string) self::getArrayItem(self::getAttributes($drawing, $xmlNamespaceBase), 'id'); + if (isset($vmlDrawingContents[$drawingRelId])) { + $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['legacyDrawing'] = $vmlDrawingContents[$drawingRelId]; + } + } + } // unparsed drawing AlternateContent $xmlAltDrawing = $this->loadZip((string) $fileDrawing, Namespaces::COMPATIBILITY); diff --git a/src/PhpSpreadsheet/Writer/Xlsx.php b/src/PhpSpreadsheet/Writer/Xlsx.php index 741faf4703..07b790440a 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx.php +++ b/src/PhpSpreadsheet/Writer/Xlsx.php @@ -455,14 +455,17 @@ public function save($filename, int $flags = 0): void } // Add comment relationship parts - if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) { + $legacy = $unparsedLoadedData['sheets'][$this->spreadSheet->getSheet($i)->getCodeName()]['legacyDrawing'] ?? null; + if (count($this->spreadSheet->getSheet($i)->getComments()) > 0 || $legacy !== null) { // VML Comments relationships $zipContent['xl/drawings/_rels/vmlDrawing' . ($i + 1) . '.vml.rels'] = $this->getWriterPartRels()->writeVMLDrawingRelationships($this->spreadSheet->getSheet($i)); // VML Comments - $zipContent['xl/drawings/vmlDrawing' . ($i + 1) . '.vml'] = $this->getWriterPartComments()->writeVMLComments($this->spreadSheet->getSheet($i)); + $zipContent['xl/drawings/vmlDrawing' . ($i + 1) . '.vml'] = $legacy ?? $this->getWriterPartComments()->writeVMLComments($this->spreadSheet->getSheet($i)); + } - // Comments + // Comments + if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) { $zipContent['xl/comments' . ($i + 1) . '.xml'] = $this->getWriterPartComments()->writeComments($this->spreadSheet->getSheet($i)); // Media @@ -477,7 +480,9 @@ public function save($filename, int $flags = 0): void // Add unparsed relationship parts if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['vmlDrawings'])) { foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['vmlDrawings'] as $vmlDrawing) { - $zipContent[$vmlDrawing['filePath']] = $vmlDrawing['content']; + if (!isset($zipContent[$vmlDrawing['filePath']])) { + $zipContent[$vmlDrawing['filePath']] = $vmlDrawing['content']; + } } } diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Rels.php b/src/PhpSpreadsheet/Writer/Xlsx/Rels.php index 96a0e3bcdc..9337d8477c 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Rels.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Rels.php @@ -239,14 +239,16 @@ public function writeWorksheetRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\ // Write comments relationship? $i = 1; - if (count($worksheet->getComments()) > 0) { + if (count($worksheet->getComments()) > 0 || isset($unparsedLoadedData['sheets'][$worksheet->getCodeName()]['legacyDrawing'])) { $this->writeRelationship( $objWriter, '_comments_vml' . $i, Namespaces::VML, '../drawings/vmlDrawing' . $worksheetId . '.vml' ); + } + if (count($worksheet->getComments()) > 0) { $this->writeRelationship( $objWriter, '_comments' . $i, diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index 61b1264422..966526f168 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -1333,7 +1333,8 @@ private function writeDrawings(XMLWriter $objWriter, PhpspreadsheetWorksheet $wo private function writeLegacyDrawing(XMLWriter $objWriter, PhpspreadsheetWorksheet $worksheet): void { // If sheet contains comments, add the relationships - if (count($worksheet->getComments()) > 0) { + $unparsedLoadedData = $worksheet->getParent()->getUnparsedLoadedData(); + if (count($worksheet->getComments()) > 0 || isset($unparsedLoadedData['sheets'][$worksheet->getCodeName()]['legacyDrawing'])) { $objWriter->startElement('legacyDrawing'); $objWriter->writeAttribute('r:id', 'rId_comments_vml1'); $objWriter->endElement();