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