From 9fcfa4b7ec773f3868951ad47ce6e17c05c6dd0d Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:46:43 -0800 Subject: [PATCH] Xlsx Support Flipping of Image (#3801) * Xlsx Support Flipping of Image Fix #731. Opened over 5 years ago, probably the second oldest problem I've worked on. Images attached to an Xlsx spreadsheet can be rotated, which is supported by PhpSpreadsheet. They can also be flipped along their horizontal and/or vertical axes, and that has not been supported. This PR adds that support. * Update CHANGELOG.md --- CHANGELOG.md | 2 + src/PhpSpreadsheet/Reader/Xlsx.php | 4 ++ src/PhpSpreadsheet/Worksheet/BaseDrawing.php | 28 +++++++++++++ src/PhpSpreadsheet/Writer/Xlsx/Drawing.php | 9 +++++ .../Reader/Xlsx/Issue731Test.php | 38 ++++++++++++++++++ tests/data/Reader/XLSX/issue.731.xlsx | Bin 0 -> 28509 bytes 6 files changed, 81 insertions(+) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue731Test.php create mode 100644 tests/data/Reader/XLSX/issue.731.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 274981073..bac167f9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org). - Writer ODS : Write Border Style for cells [Issue #3690](https://github.com/PHPOffice/PhpSpreadsheet/issues/3690) [PR #3693](https://github.com/PHPOffice/PhpSpreadsheet/pull/3693) - Sheet Background Images [Issue #1649](https://github.com/PHPOffice/PhpSpreadsheet/issues/1649) [PR #3795](https://github.com/PHPOffice/PhpSpreadsheet/pull/3795) - Check if Coordinate is Inside Range [PR #3779](https://github.com/PHPOffice/PhpSpreadsheet/pull/3779) +- Flipping Images [Issue #731](https://github.com/PHPOffice/PhpSpreadsheet/issues/731) [PR #3801](https://github.com/PHPOffice/PhpSpreadsheet/pull/3801) +- Chart Dynamic Title and Font Properties [Issue #3797](https://github.com/PHPOffice/PhpSpreadsheet/issues/3797) [PR #3800](https://github.com/PHPOffice/PhpSpreadsheet/pull/3800) ### Changed diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 73ac43afd..109a593ed 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -1424,6 +1424,8 @@ class Xlsx extends BaseReader $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($oneCellAnchor->ext), 'cy'))); if ($xfrm) { $objDrawing->setRotation((int) Drawing::angleToDegrees(self::getArrayItem(self::getAttributes($xfrm), 'rot'))); + $objDrawing->setFlipVertical((bool) self::getArrayItem(self::getAttributes($xfrm), 'flipV')); + $objDrawing->setFlipHorizontal((bool) self::getArrayItem(self::getAttributes($xfrm), 'flipH')); } if ($outerShdw) { $shadow = $objDrawing->getShadow(); @@ -1518,6 +1520,8 @@ class Xlsx extends BaseReader $objDrawing->setWidth(Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($xfrm->ext), 'cx'))); $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem(self::getAttributes($xfrm->ext), 'cy'))); $objDrawing->setRotation(Drawing::angleToDegrees(self::getArrayItem(self::getAttributes($xfrm), 'rot'))); + $objDrawing->setFlipVertical((bool) self::getArrayItem(self::getAttributes($xfrm), 'flipV')); + $objDrawing->setFlipHorizontal((bool) self::getArrayItem(self::getAttributes($xfrm), 'flipH')); } if ($outerShdw) { $shadow = $objDrawing->getShadow(); diff --git a/src/PhpSpreadsheet/Worksheet/BaseDrawing.php b/src/PhpSpreadsheet/Worksheet/BaseDrawing.php index 2310e64ea..d59d4b39a 100644 --- a/src/PhpSpreadsheet/Worksheet/BaseDrawing.php +++ b/src/PhpSpreadsheet/Worksheet/BaseDrawing.php @@ -131,6 +131,10 @@ class BaseDrawing implements IComparable */ protected $rotation = 0; + protected bool $flipVertical = false; + + protected bool $flipHorizontal = false; + /** * Shadow. */ @@ -542,4 +546,28 @@ class BaseDrawing implements IComparable return $this; } + + public function setFlipHorizontal(bool $flipHorizontal): self + { + $this->flipHorizontal = $flipHorizontal; + + return $this; + } + + public function getFlipHorizontal(): bool + { + return $this->flipHorizontal; + } + + public function setFlipVertical(bool $flipVertical): self + { + $this->flipVertical = $flipVertical; + + return $this; + } + + public function getFlipVertical(): bool + { + return $this->flipVertical; + } } diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php b/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php index 6763b508f..cb8b1c403 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php @@ -294,6 +294,8 @@ class Drawing extends WriterPart // a:xfrm $objWriter->startElement('a:xfrm'); $objWriter->writeAttribute('rot', (string) SharedDrawing::degreesToAngle($drawing->getRotation())); + self::writeAttributeIf($objWriter, $drawing->getFlipVertical(), 'flipV', '1'); + self::writeAttributeIf($objWriter, $drawing->getFlipHorizontal(), 'flipH', '1'); if ($isTwoCellAnchor) { $objWriter->startElement('a:ext'); $objWriter->writeAttribute('cx', self::stringEmu($drawing->getWidth())); @@ -579,4 +581,11 @@ class Drawing extends WriterPart { return (string) SharedDrawing::pixelsToEMU($pixelValue); } + + private static function writeAttributeIf(XMLWriter $objWriter, ?bool $condition, string $attr, string $val): void + { + if ($condition) { + $objWriter->writeAttribute($attr, $val); + } + } } diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue731Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue731Test.php new file mode 100644 index 000000000..929320c55 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue731Test.php @@ -0,0 +1,38 @@ +load(self::$testbook); + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx'); + $spreadsheet->disconnectWorksheets(); + $reloadedSheet = $reloadedSpreadsheet->getActiveSheet(); + $expected = [ + [0, false, false], + [90, false, false], + [270, false, false], + [0, false, true], + [0, true, false], + [20, false, false], + [20, false, true], + [0, true, true], + ]; + $actual = []; + foreach ($reloadedSheet->getDrawingCollection() as $drawing) { + $actual[] = [$drawing->getRotation(), $drawing->getFlipHorizontal(), $drawing->getFlipVertical()]; + } + self::assertSame($expected, $actual); + $reloadedSpreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.731.xlsx b/tests/data/Reader/XLSX/issue.731.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..91f865d4aa1ada4a8ed415c8ebe19fa69d882810 GIT binary patch literal 28509 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 z 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 o)9>oPPgs9dtDF5rZTRo$OHmg7X&n7gL