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', $borderPart->getName(), $borderStyle, $colorEl, $borderPart->getName() + '<%s style="%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; }