diff --git a/src/Spout/Writer/Style/Border.php b/src/Spout/Writer/Style/Border.php index b68ec80..75f6a49 100644 --- a/src/Spout/Writer/Style/Border.php +++ b/src/Spout/Writer/Style/Border.php @@ -35,6 +35,24 @@ class Border $this->setParts($borderParts); } + /** + * @param $name The name of the border part + * @return null|BorderPart + */ + public function getPart($name) + { + return $this->hasPart($name) ? $this->parts[$name] : null; + } + + /** + * @param $name The name of the border part + * @return bool + */ + public function hasPart($name) + { + return isset($this->parts[$name]); + } + /** * @return array */ diff --git a/src/Spout/Writer/XLSX/Helper/StyleHelper.php b/src/Spout/Writer/XLSX/Helper/StyleHelper.php index 3c2b3d1..5bc2aa5 100644 --- a/src/Spout/Writer/XLSX/Helper/StyleHelper.php +++ b/src/Spout/Writer/XLSX/Helper/StyleHelper.php @@ -110,13 +110,21 @@ EOD; $border = $style->getBorder(); if ($border) { $content .= ''; - foreach ($border->getParts() as $part) { - /** @var $part \Box\Spout\Writer\Style\BorderPart */ - $content .= BorderHelper::serializeBorderPart($part); + + $sortOrder = ['left', 'right', 'top', 'bottom']; + + foreach ($sortOrder as $partName) { + if ($border->hasPart($partName)) { + /** @var $part \Box\Spout\Writer\Style\BorderPart */ + $part = $border->getPart($partName); + $content .= BorderHelper::serializeBorderPart($part); + } } + $content .= ''; + } else { - $content .= ''; + $content .= ''; } } diff --git a/tests/Spout/Writer/XLSX/WriterWithStyleTest.php b/tests/Spout/Writer/XLSX/WriterWithStyleTest.php index df34a33..7596efa 100644 --- a/tests/Spout/Writer/XLSX/WriterWithStyleTest.php +++ b/tests/Spout/Writer/XLSX/WriterWithStyleTest.php @@ -268,6 +268,49 @@ class WriterWithStyleTest extends \PHPUnit_Framework_TestCase $this->assertEquals(3, $styleXfsElements->getAttribute('count'), '3 cell xfs present'); } + /** + * @return void + */ + public function testBordersCorrectOrder() + { + // Border should be Left, Right, Top, Bottom + $fileName = 'test_borders_correct_order.xlsx'; + + $dataRows = [ + ['I am a teapot'], + ]; + + $borders = (new BorderBuilder()) + ->setBorderRight() + ->setBorderTop() + ->setBorderLeft() + ->setBorderBottom() + ->build(); + + $style = (new StyleBuilder())->setBorder($borders)->build(); + $this->writeToXLSXFile($dataRows, $fileName, $style); + $borderElements = $this->getXmlSectionFromStylesXmlFile($fileName, 'borders'); + + $correctOrdering = [ + 'left', 'right', 'top', 'bottom' + ]; + + /** @var $borderNode \DOMElement */ + foreach ($borderElements->childNodes as $borderNode) { + $borderParts = $borderNode->childNodes; + $ordering = []; + + /** @var $part \DOMText */ + foreach ($borderParts as $part) { + if ($part instanceof \DOMElement) { + $ordering[] = $part->nodeName; + } + } + + $this->assertEquals($correctOrdering, $ordering, 'The border parts are in correct ordering'); + }; + } + /** * @param array $allRows * @param string $fileName