diff --git a/README.md b/README.md
index b961305..2b6d027 100644
--- a/README.md
+++ b/README.md
@@ -156,22 +156,19 @@ Adding borders to a row requires a ```Border``` object.
use Box\Spout\Common\Type;
use Box\Spout\Writer\WriterFactory;
use Box\Spout\Writer\Style\StyleBuilder;
-use Box\Spout\Writer\Style\Border;
-use Box\Spout\Writer\Style\BorderPart;
+use Box\Spout\Writer\Style\BorderBuilder;
-$border = new Border();
-$border
- ->addPart(new BorderPart(Border::BOTTOM, Border::STYLE_SOLID, Border::WIDTH_THICK, Color::ORANGE))
- ->addPart(new BorderPart(Border::RIGHT, Border::STYLE_DASHED, BOrder::WIDTH_THIN, Color::GREEN));
+$border = (new BorderBuilder())
+ ->setBorderBottom(Border::STYLE_DASHED, Color::GREEN, Border::WIDTH_THIN)
+ ->build();
$style = (new StyleBuilder())
- ->setBorder($border)
- ->build();
+ ->setBorder($border)
+ ->build();
-$writerXlsx = WriterFactory::create(Type::XLSX);
-$writerXlsx->openToFile('borders.xlsx');
-$writerXlsx->addRowsWithStyle($multipleRows, $style);
-$writerXlsx->close();
+$writer->addRowWithStyle(['Border Bottom Dashed Green Thin'], $style);
+
+$writer->close();
```
diff --git a/src/Spout/Writer/Exception/InvalidBorderNameException.php b/src/Spout/Writer/Exception/Border/InvalidNameException.php
similarity index 67%
rename from src/Spout/Writer/Exception/InvalidBorderNameException.php
rename to src/Spout/Writer/Exception/Border/InvalidNameException.php
index 989141b..0037668 100644
--- a/src/Spout/Writer/Exception/InvalidBorderNameException.php
+++ b/src/Spout/Writer/Exception/Border/InvalidNameException.php
@@ -1,10 +1,11 @@
'0.75pt solid',
- Border::STYLE_SOLID.'%'.Border::WIDTH_MEDIUM => '1.75pt solid',
- Border::STYLE_SOLID.'%'.Border::WIDTH_THICK => '2.5pt solid',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_THIN => '0.75pt dotted',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_MEDIUM => '1.75pt dotted',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_THICK => '2.5pt dotted',
- Border::STYLE_DASHED.'%'.Border::WIDTH_THIN => '0.75pt dashed',
- Border::STYLE_DASHED.'%'.Border::WIDTH_MEDIUM => '1.75pt dashed',
- Border::STYLE_DASHED.'%'.Border::WIDTH_THICK => '2.5pt dashed',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_THIN => '0.75pt double',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_MEDIUM => '1.75pt double',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_THICK => '2.5pt double',
- Border::STYLE_NONE.'%'.Border::WIDTH_THIN => 'none',
- Border::STYLE_NONE.'%'.Border::WIDTH_MEDIUM => 'none',
- Border::STYLE_NONE.'%'.Border::WIDTH_THICK => 'none',
+ public static $widthMap = [
+ Border::WIDTH_THIN => '0.75pt',
+ Border::WIDTH_MEDIUM => '1.75pt',
+ Border::WIDTH_THICK => '2.5pt',
+ ];
+
+ /**
+ * Style mapping
+ *
+ * @var array
+ */
+ public static $styleMap = [
+ Border::STYLE_SOLID => 'solid',
+ Border::STYLE_DASHED => 'dashed',
+ Border::STYLE_DOTTED => 'dotted',
+ Border::STYLE_DOUBLE => 'double',
];
/**
@@ -51,15 +50,19 @@ class BorderHelper
*/
public static function serializeBorderPart(BorderPart $borderPart)
{
- $styleDef = $borderPart->getStyle() .'%' . $borderPart->getWidth();
- $borderStyle = self::$odsStyleMap[$styleDef];
- $colorEl = ($borderPart->getColor() && $borderPart->getStyle() !== Border::STYLE_NONE)
- ? '#' . $borderPart->getColor() : '';
- $partEl = sprintf(
- 'fo:border-%s="%s"',
- $borderPart->getName(),
- $borderStyle . ' ' .$colorEl
- );
- return $partEl;
+ $definition = 'fo:border-%s="%s"';
+
+ if ($borderPart->getStyle() === Border::STYLE_NONE) {
+ $borderPartDefinition = sprintf($definition, $borderPart->getName(), 'none');
+ } else {
+ $attributes = [
+ self::$widthMap[$borderPart->getWidth()],
+ self::$styleMap[$borderPart->getStyle()],
+ '#' . $borderPart->getColor(),
+ ];
+ $borderPartDefinition = sprintf($definition, $borderPart->getName(), implode(' ', $attributes));
+ }
+
+ return $borderPartDefinition;
}
}
diff --git a/src/Spout/Writer/ODS/Helper/StyleHelper.php b/src/Spout/Writer/ODS/Helper/StyleHelper.php
index 54d266b..7dfb828 100644
--- a/src/Spout/Writer/ODS/Helper/StyleHelper.php
+++ b/src/Spout/Writer/ODS/Helper/StyleHelper.php
@@ -258,16 +258,15 @@ EOD;
}
if ($style->shouldApplyBorder()) {
- $el = '';
+ $borderProperty = '';
$borders = array_map(function (BorderPart $borderPart) {
return BorderHelper::serializeBorderPart($borderPart);
}, $style->getBorder()->getParts());
- $content .= sprintf($el, implode(' ', $borders));
+ $content .= sprintf($borderProperty, implode(' ', $borders));
}
$content .= '';
-
return $content;
}
}
diff --git a/src/Spout/Writer/Style/Border.php b/src/Spout/Writer/Style/Border.php
index bfee320..f0140d3 100644
--- a/src/Spout/Writer/Style/Border.php
+++ b/src/Spout/Writer/Style/Border.php
@@ -2,6 +2,9 @@
namespace Box\Spout\Writer\Style;
+/**
+ * Class Border
+ */
class Border
{
const LEFT = 'left';
diff --git a/src/Spout/Writer/Style/BorderBuilder.php b/src/Spout/Writer/Style/BorderBuilder.php
new file mode 100644
index 0000000..017646b
--- /dev/null
+++ b/src/Spout/Writer/Style/BorderBuilder.php
@@ -0,0 +1,75 @@
+border = new Border();
+ }
+
+ /**
+ * @param string $style Border style @see BorderPart::allowedStyles
+ * @param string $color Border A RGB color code
+ * @param string $width Border width @see BorderPart::allowedWidths
+ * @return self
+ */
+ public function setBorderTop($style = Border::STYLE_SOLID, $color = Color::BLACK, $width = Border::WIDTH_THICK)
+ {
+ $this->border->addPart(new BorderPart(Border::TOP, $style, $color, $width));
+ return $this;
+ }
+
+ /**
+ * @param string $style Border style @see BorderPart::allowedStyles
+ * @param string $color Border A RGB color code
+ * @param string $width Border width @see BorderPart::allowedWidths
+ * @return self
+ */
+ public function setBorderRight($style = Border::STYLE_SOLID, $color = Color::BLACK, $width = Border::WIDTH_THICK)
+ {
+ $this->border->addPart(new BorderPart(Border::RIGHT, $style, $color, $width));
+ return $this;
+ }
+
+ /**
+ * @param string $style Border style @see BorderPart::allowedStyles
+ * @param string $color Border A RGB color code
+ * @param string $width Border width @see BorderPart::allowedWidths
+ * @return self
+ */
+ public function setBorderBottom($style = Border::STYLE_SOLID, $color = Color::BLACK, $width = Border::WIDTH_THICK)
+ {
+ $this->border->addPart(new BorderPart(Border::BOTTOM, $style, $color, $width));
+ return $this;
+ }
+
+ /**
+ * @param string $style Border style @see BorderPart::allowedStyles
+ * @param string $color Border A RGB color code
+ * @param string $width Border width @see BorderPart::allowedWidths
+ * @return self
+ */
+ public function setBorderLeft($style = Border::STYLE_SOLID, $color = Color::BLACK, $width = Border::WIDTH_THICK)
+ {
+ $this->border->addPart(new BorderPart(Border::LEFT, $style, $color, $width));
+ return $this;
+ }
+
+ /**
+ * @return Border
+ */
+ public function build()
+ {
+ return $this->border;
+ }
+}
diff --git a/src/Spout/Writer/Style/BorderPart.php b/src/Spout/Writer/Style/BorderPart.php
index f2cd9ff..096c2a6 100644
--- a/src/Spout/Writer/Style/BorderPart.php
+++ b/src/Spout/Writer/Style/BorderPart.php
@@ -2,10 +2,13 @@
namespace Box\Spout\Writer\Style;
-use Box\Spout\Writer\Exception\InvalidBorderNameException;
-use Box\Spout\Writer\Exception\InvalidBorderStyleException;
-use Box\Spout\Writer\Exception\InvalidBorderWidthException;
+use Box\Spout\Writer\Exception\Border\InvalidNameException;
+use Box\Spout\Writer\Exception\Border\InvalidStyleException;
+use Box\Spout\Writer\Exception\Border\InvalidWidthException;
+/**
+ * Class BorderPart
+ */
class BorderPart
{
/**
@@ -52,7 +55,7 @@ class BorderPart
/**
* @var array Allowed width constants for border parts.
*/
- protected static $allowedWidth = [
+ protected static $allowedWidths = [
'thin',
'medium',
'thick',
@@ -61,13 +64,13 @@ class BorderPart
/**
* @param string $name @see BorderPart::allowedNames
* @param string $style @see BorderPart::allowedStyles
- * @param string $width @see BorderPart::allowedWidth
+ * @param string $width @see BorderPart::allowedWidths
* @param string $color A RGB color code
- * @throws InvalidBorderNameException
- * @throws InvalidBorderStyleException
- * @throws InvalidBorderWidthException
+ * @throws InvalidNameException
+ * @throws InvalidStyleException
+ * @throws InvalidWidthException
*/
- public function __construct($name, $style = Border::STYLE_SOLID, $width = Border::WIDTH_MEDIUM, $color = Color::BLACK)
+ public function __construct($name, $style = Border::STYLE_SOLID, $color = Color::BLACK, $width = Border::WIDTH_MEDIUM)
{
$this->setName($name);
$this->setStyle($style);
@@ -89,7 +92,7 @@ class BorderPart
public function setName($name)
{
if (!in_array($name, self::$allowedNames)) {
- throw new InvalidBorderNameException($name);
+ throw new InvalidNameException($name);
}
$this->name = $name;
}
@@ -108,7 +111,7 @@ class BorderPart
public function setStyle($style)
{
if (!in_array($style, self::$allowedStyles)) {
- throw new InvalidBorderStyleException($style);
+ throw new InvalidStyleException($style);
}
$this->style = $style;
}
@@ -142,8 +145,8 @@ class BorderPart
*/
public function setWidth($width)
{
- if(!in_array($width, self::$allowedWidth)) {
- throw new InvalidBorderWidthException($width);
+ if (!in_array($width, self::$allowedWidths)) {
+ throw new InvalidWidthException($width);
}
$this->width = $width;
}
@@ -167,8 +170,8 @@ class BorderPart
/**
* @return array
*/
- public static function getAllowedWidth()
+ public static function getAllowedWidths()
{
- return self::$allowedWidth;
+ return self::$allowedWidths;
}
}
diff --git a/src/Spout/Writer/XLSX/Helper/BorderHelper.php b/src/Spout/Writer/XLSX/Helper/BorderHelper.php
index be28b12..b940e99 100644
--- a/src/Spout/Writer/XLSX/Helper/BorderHelper.php
+++ b/src/Spout/Writer/XLSX/Helper/BorderHelper.php
@@ -2,27 +2,37 @@
namespace Box\Spout\Writer\XLSX\Helper;
-use Box\Spout\Writer\Style\BorderPart;
use Box\Spout\Writer\Style\Border;
+use Box\Spout\Writer\Style\BorderPart;
class BorderHelper
{
public static $xlsxStyleMap = [
- Border::STYLE_SOLID.'%'.Border::WIDTH_THIN => 'thin',
- Border::STYLE_SOLID.'%'.Border::WIDTH_MEDIUM => 'medium',
- Border::STYLE_SOLID.'%'.Border::WIDTH_THICK => 'thick',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_THIN => 'dotted',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_MEDIUM => 'dotted',
- Border::STYLE_DOTTED.'%'.Border::WIDTH_THICK => 'dotted',
- Border::STYLE_DASHED.'%'.Border::WIDTH_THIN => 'dashed',
- Border::STYLE_DASHED.'%'.Border::WIDTH_MEDIUM => 'mediumDashed',
- Border::STYLE_DASHED.'%'.Border::WIDTH_THICK => 'mediumDashed',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_THIN => 'double',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_MEDIUM => 'double',
- Border::STYLE_DOUBLE.'%'.Border::WIDTH_THICK => 'double',
- Border::STYLE_NONE.'%'.Border::WIDTH_THIN => 'none',
- Border::STYLE_NONE.'%'.Border::WIDTH_MEDIUM => 'none',
- Border::STYLE_NONE.'%'.Border::WIDTH_THICK => 'none',
+ Border::STYLE_SOLID => [
+ Border::WIDTH_THIN => 'thin',
+ Border::WIDTH_MEDIUM => 'medium',
+ Border::WIDTH_THICK => 'thick'
+ ],
+ Border::STYLE_DOTTED => [
+ Border::WIDTH_THIN => 'dotted',
+ Border::WIDTH_MEDIUM => 'dotted',
+ Border::WIDTH_THICK => 'dotted',
+ ],
+ Border::STYLE_DASHED => [
+ Border::WIDTH_THIN => 'dashed',
+ Border::WIDTH_MEDIUM => 'mediumDashed',
+ Border::WIDTH_THICK => 'mediumDashed',
+ ],
+ Border::STYLE_DOUBLE => [
+ Border::WIDTH_THIN => 'double',
+ Border::WIDTH_MEDIUM => 'double',
+ Border::WIDTH_THICK => 'double',
+ ],
+ Border::STYLE_NONE => [
+ Border::WIDTH_THIN => 'none',
+ Border::WIDTH_MEDIUM => 'none',
+ Border::WIDTH_THICK => 'none',
+ ],
];
/**
@@ -31,13 +41,17 @@ class BorderHelper
*/
public static function serializeBorderPart(BorderPart $borderPart)
{
- $styleDef = $borderPart->getStyle() .'%' . $borderPart->getWidth();
- $borderStyle = self::$xlsxStyleMap[$styleDef];
+ $borderStyle = self::$xlsxStyleMap[$borderPart->getStyle()][$borderPart->getWidth()];
$colorEl = $borderPart->getColor() ? sprintf('', $borderPart->getColor()) : '';
$partEl = sprintf(
- '<%s style="%s">%s%s>', $borderPart->getName(), $borderStyle, $colorEl, $borderPart->getName()
+ '<%s style="%s">%s%s>',
+ $borderPart->getName(),
+ $borderStyle,
+ $colorEl,
+ $borderPart->getName()
);
- return $partEl.PHP_EOL;
+
+ return $partEl . PHP_EOL;
}
-}
\ No newline at end of file
+}
diff --git a/src/Spout/Writer/XLSX/Helper/StyleHelper.php b/src/Spout/Writer/XLSX/Helper/StyleHelper.php
index ed09ef8..fa33e16 100644
--- a/src/Spout/Writer/XLSX/Helper/StyleHelper.php
+++ b/src/Spout/Writer/XLSX/Helper/StyleHelper.php
@@ -101,6 +101,7 @@ EOD;
protected function getBordersSectionContent()
{
$content = '';
+
/** @var \Box\Spout\Writer\Style\Style $style */
foreach ($this->getRegisteredStyles() as $style) {
$border = $style->getBorder();
@@ -115,7 +116,9 @@ EOD;
$content .= '';
}
}
+
$content .= '';
+
return $content;
}