Skip to content

Commit 47e62af

Browse files
committed
Add drawingPassThroughEnabled to sheet
1 parent fd3252b commit 47e62af

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,6 +1484,15 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
14841484
// Store drawing XML for pass-through if enabled
14851485
if ($this->enableDrawingPassThrough) {
14861486
$unparsedDrawings[$drawingRelId] = $xmlDrawing->asXML();
1487+
// Mark that pass-through is enabled for this sheet
1488+
$sheetCodeName = $docSheet->getCodeName();
1489+
if (!isset($unparsedLoadedData['sheets']) || !is_array($unparsedLoadedData['sheets'])) {
1490+
$unparsedLoadedData['sheets'] = [];
1491+
}
1492+
if (!isset($unparsedLoadedData['sheets'][$sheetCodeName]) || !is_array($unparsedLoadedData['sheets'][$sheetCodeName])) {
1493+
$unparsedLoadedData['sheets'][$sheetCodeName] = [];
1494+
}
1495+
$unparsedLoadedData['sheets'][$sheetCodeName]['drawingPassThroughEnabled'] = true;
14871496
}
14881497

14891498
if ($xmlDrawingChildren->oneCellAnchor) {
@@ -1714,6 +1723,11 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
17141723
}
17151724
}
17161725
}
1726+
// Legacy behavior: preserve empty drawings when pass-through is disabled
1727+
if (empty($relsDrawing) && $xmlDrawing->count() == 0) {
1728+
// Save Drawing without rels and children as unparsed
1729+
$unparsedDrawings[$drawingRelId] = $xmlDrawing->asXML();
1730+
}
17171731
}
17181732

17191733
// store original rId of drawing files

src/PhpSpreadsheet/Writer/Xlsx/Drawing.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,8 @@ private static function writeAttributeIf(XMLWriter $objWriter, ?bool $condition,
603603
*
604604
* Returns the original drawing XML stored during load (when Reader pass-through was enabled).
605605
* This preserves unsupported drawing elements (shapes, textboxes) that PhpSpreadsheet cannot parse.
606+
*
607+
* @return ?string The pass-through XML, or null if not available or should not be used
606608
*/
607609
private function getPassThroughDrawingXml(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $worksheet): ?string
608610
{
@@ -612,11 +614,20 @@ private function getPassThroughDrawingXml(\PhpOffice\PhpSpreadsheet\Worksheet\Wo
612614
}
613615

614616
$codeName = $worksheet->getCodeName();
615-
if (!isset($unparsedLoadedData['sheets'][$codeName]) || !is_array($unparsedLoadedData['sheets'][$codeName])) {
617+
if (!isset($unparsedLoadedData['sheets'][$codeName])) {
616618
return null;
617619
}
618620

619621
$sheetData = $unparsedLoadedData['sheets'][$codeName];
622+
if (!is_array($sheetData)) {
623+
return null;
624+
}
625+
626+
// Only use pass-through XML if the Reader flag was explicitly enabled
627+
if (($sheetData['drawingPassThroughEnabled'] ?? false) !== true) {
628+
return null;
629+
}
630+
620631
if (!isset($sheetData['Drawings']) || !is_array($sheetData['Drawings'])) {
621632
return null;
622633
}

0 commit comments

Comments
 (0)