Integrated changes #135

This commit is contained in:
madflow 2016-05-28 18:20:37 +02:00
parent b2c5797c72
commit 47cafb0216
11 changed files with 186 additions and 86 deletions

View File

@ -156,22 +156,19 @@ Adding borders to a row requires a ```Border``` object.
use Box\Spout\Common\Type; use Box\Spout\Common\Type;
use Box\Spout\Writer\WriterFactory; use Box\Spout\Writer\WriterFactory;
use Box\Spout\Writer\Style\StyleBuilder; use Box\Spout\Writer\Style\StyleBuilder;
use Box\Spout\Writer\Style\Border; use Box\Spout\Writer\Style\BorderBuilder;
use Box\Spout\Writer\Style\BorderPart;
$border = new Border(); $border = (new BorderBuilder())
$border ->setBorderBottom(Border::STYLE_DASHED, Color::GREEN, Border::WIDTH_THIN)
->addPart(new BorderPart(Border::BOTTOM, Border::STYLE_SOLID, Border::WIDTH_THICK, Color::ORANGE)) ->build();
->addPart(new BorderPart(Border::RIGHT, Border::STYLE_DASHED, BOrder::WIDTH_THIN, Color::GREEN));
$style = (new StyleBuilder()) $style = (new StyleBuilder())
->setBorder($border) ->setBorder($border)
->build(); ->build();
$writerXlsx = WriterFactory::create(Type::XLSX); $writer->addRowWithStyle(['Border Bottom Dashed Green Thin'], $style);
$writerXlsx->openToFile('borders.xlsx');
$writerXlsx->addRowsWithStyle($multipleRows, $style); $writer->close();
$writerXlsx->close();
``` ```

View File

@ -1,10 +1,11 @@
<?php <?php
namespace Box\Spout\Writer\Exception; namespace Box\Spout\Writer\Exception\Border;
use Box\Spout\Writer\Exception\WriterException;
use Box\Spout\Writer\Style\BorderPart; use Box\Spout\Writer\Style\BorderPart;
class InvalidBorderNameException extends WriterException class InvalidNameException extends WriterException
{ {
public function __construct($name) public function __construct($name)

View File

@ -1,10 +1,11 @@
<?php <?php
namespace Box\Spout\Writer\Exception; namespace Box\Spout\Writer\Exception\Border;
use Box\Spout\Writer\Exception\WriterException;
use Box\Spout\Writer\Style\BorderPart; use Box\Spout\Writer\Style\BorderPart;
class InvalidBorderStyleException extends WriterException class InvalidStyleException extends WriterException
{ {
public function __construct($name) public function __construct($name)
{ {

View File

@ -1,17 +1,18 @@
<?php <?php
namespace Box\Spout\Writer\Exception; namespace Box\Spout\Writer\Exception\Border;
use Box\Spout\Writer\Exception\WriterException;
use Box\Spout\Writer\Style\BorderPart; use Box\Spout\Writer\Style\BorderPart;
class InvalidBorderWidthException extends WriterException class InvalidWidthException extends WriterException
{ {
public function __construct($name) public function __construct($name)
{ {
$msg = '%s is not a valid width identifier for a border. Valid identifiers are: %s.'; $msg = '%s is not a valid width identifier for a border. Valid identifiers are: %s.';
parent::__construct(sprintf($msg, $name, implode(',', BorderPart::getAllowedWidth()))); parent::__construct(sprintf($msg, $name, implode(',', BorderPart::getAllowedWidths())));
} }
} }

View File

@ -21,28 +21,27 @@ use Box\Spout\Writer\Style\Border;
*/ */
class BorderHelper class BorderHelper
{ {
/** /**
* ODS border attributes * Width mappings
* *
* @var array * @var array
*/ */
public static $odsStyleMap = [ public static $widthMap = [
Border::STYLE_SOLID.'%'.Border::WIDTH_THIN => '0.75pt solid', Border::WIDTH_THIN => '0.75pt',
Border::STYLE_SOLID.'%'.Border::WIDTH_MEDIUM => '1.75pt solid', Border::WIDTH_MEDIUM => '1.75pt',
Border::STYLE_SOLID.'%'.Border::WIDTH_THICK => '2.5pt solid', Border::WIDTH_THICK => '2.5pt',
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', * Style mapping
Border::STYLE_DASHED.'%'.Border::WIDTH_MEDIUM => '1.75pt dashed', *
Border::STYLE_DASHED.'%'.Border::WIDTH_THICK => '2.5pt dashed', * @var array
Border::STYLE_DOUBLE.'%'.Border::WIDTH_THIN => '0.75pt double', */
Border::STYLE_DOUBLE.'%'.Border::WIDTH_MEDIUM => '1.75pt double', public static $styleMap = [
Border::STYLE_DOUBLE.'%'.Border::WIDTH_THICK => '2.5pt double', Border::STYLE_SOLID => 'solid',
Border::STYLE_NONE.'%'.Border::WIDTH_THIN => 'none', Border::STYLE_DASHED => 'dashed',
Border::STYLE_NONE.'%'.Border::WIDTH_MEDIUM => 'none', Border::STYLE_DOTTED => 'dotted',
Border::STYLE_NONE.'%'.Border::WIDTH_THICK => 'none', Border::STYLE_DOUBLE => 'double',
]; ];
/** /**
@ -51,15 +50,19 @@ class BorderHelper
*/ */
public static function serializeBorderPart(BorderPart $borderPart) public static function serializeBorderPart(BorderPart $borderPart)
{ {
$styleDef = $borderPart->getStyle() .'%' . $borderPart->getWidth(); $definition = 'fo:border-%s="%s"';
$borderStyle = self::$odsStyleMap[$styleDef];
$colorEl = ($borderPart->getColor() && $borderPart->getStyle() !== Border::STYLE_NONE) if ($borderPart->getStyle() === Border::STYLE_NONE) {
? '#' . $borderPart->getColor() : ''; $borderPartDefinition = sprintf($definition, $borderPart->getName(), 'none');
$partEl = sprintf( } else {
'fo:border-%s="%s"', $attributes = [
$borderPart->getName(), self::$widthMap[$borderPart->getWidth()],
$borderStyle . ' ' .$colorEl self::$styleMap[$borderPart->getStyle()],
); '#' . $borderPart->getColor(),
return $partEl; ];
$borderPartDefinition = sprintf($definition, $borderPart->getName(), implode(' ', $attributes));
}
return $borderPartDefinition;
} }
} }

View File

@ -258,16 +258,15 @@ EOD;
} }
if ($style->shouldApplyBorder()) { if ($style->shouldApplyBorder()) {
$el = '<style:table-cell-properties %s />'; $borderProperty = '<style:table-cell-properties %s />';
$borders = array_map(function (BorderPart $borderPart) { $borders = array_map(function (BorderPart $borderPart) {
return BorderHelper::serializeBorderPart($borderPart); return BorderHelper::serializeBorderPart($borderPart);
}, $style->getBorder()->getParts()); }, $style->getBorder()->getParts());
$content .= sprintf($el, implode(' ', $borders)); $content .= sprintf($borderProperty, implode(' ', $borders));
} }
$content .= '</style:style>'; $content .= '</style:style>';
return $content; return $content;
} }
} }

View File

@ -2,6 +2,9 @@
namespace Box\Spout\Writer\Style; namespace Box\Spout\Writer\Style;
/**
* Class Border
*/
class Border class Border
{ {
const LEFT = 'left'; const LEFT = 'left';

View File

@ -0,0 +1,75 @@
<?php
namespace Box\Spout\Writer\Style;
/**
* Class BorderBuilder
*/
class BorderBuilder
{
/**
* @var Border
*/
protected $border;
public function __construct()
{
$this->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;
}
}

View File

@ -2,10 +2,13 @@
namespace Box\Spout\Writer\Style; namespace Box\Spout\Writer\Style;
use Box\Spout\Writer\Exception\InvalidBorderNameException; use Box\Spout\Writer\Exception\Border\InvalidNameException;
use Box\Spout\Writer\Exception\InvalidBorderStyleException; use Box\Spout\Writer\Exception\Border\InvalidStyleException;
use Box\Spout\Writer\Exception\InvalidBorderWidthException; use Box\Spout\Writer\Exception\Border\InvalidWidthException;
/**
* Class BorderPart
*/
class BorderPart class BorderPart
{ {
/** /**
@ -52,7 +55,7 @@ class BorderPart
/** /**
* @var array Allowed width constants for border parts. * @var array Allowed width constants for border parts.
*/ */
protected static $allowedWidth = [ protected static $allowedWidths = [
'thin', 'thin',
'medium', 'medium',
'thick', 'thick',
@ -61,13 +64,13 @@ class BorderPart
/** /**
* @param string $name @see BorderPart::allowedNames * @param string $name @see BorderPart::allowedNames
* @param string $style @see BorderPart::allowedStyles * @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 * @param string $color A RGB color code
* @throws InvalidBorderNameException * @throws InvalidNameException
* @throws InvalidBorderStyleException * @throws InvalidStyleException
* @throws InvalidBorderWidthException * @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->setName($name);
$this->setStyle($style); $this->setStyle($style);
@ -89,7 +92,7 @@ class BorderPart
public function setName($name) public function setName($name)
{ {
if (!in_array($name, self::$allowedNames)) { if (!in_array($name, self::$allowedNames)) {
throw new InvalidBorderNameException($name); throw new InvalidNameException($name);
} }
$this->name = $name; $this->name = $name;
} }
@ -108,7 +111,7 @@ class BorderPart
public function setStyle($style) public function setStyle($style)
{ {
if (!in_array($style, self::$allowedStyles)) { if (!in_array($style, self::$allowedStyles)) {
throw new InvalidBorderStyleException($style); throw new InvalidStyleException($style);
} }
$this->style = $style; $this->style = $style;
} }
@ -142,8 +145,8 @@ class BorderPart
*/ */
public function setWidth($width) public function setWidth($width)
{ {
if(!in_array($width, self::$allowedWidth)) { if (!in_array($width, self::$allowedWidths)) {
throw new InvalidBorderWidthException($width); throw new InvalidWidthException($width);
} }
$this->width = $width; $this->width = $width;
} }
@ -167,8 +170,8 @@ class BorderPart
/** /**
* @return array * @return array
*/ */
public static function getAllowedWidth() public static function getAllowedWidths()
{ {
return self::$allowedWidth; return self::$allowedWidths;
} }
} }

View File

@ -2,27 +2,37 @@
namespace Box\Spout\Writer\XLSX\Helper; namespace Box\Spout\Writer\XLSX\Helper;
use Box\Spout\Writer\Style\BorderPart;
use Box\Spout\Writer\Style\Border; use Box\Spout\Writer\Style\Border;
use Box\Spout\Writer\Style\BorderPart;
class BorderHelper class BorderHelper
{ {
public static $xlsxStyleMap = [ public static $xlsxStyleMap = [
Border::STYLE_SOLID.'%'.Border::WIDTH_THIN => 'thin', Border::STYLE_SOLID => [
Border::STYLE_SOLID.'%'.Border::WIDTH_MEDIUM => 'medium', Border::WIDTH_THIN => 'thin',
Border::STYLE_SOLID.'%'.Border::WIDTH_THICK => 'thick', Border::WIDTH_MEDIUM => 'medium',
Border::STYLE_DOTTED.'%'.Border::WIDTH_THIN => 'dotted', Border::WIDTH_THICK => 'thick'
Border::STYLE_DOTTED.'%'.Border::WIDTH_MEDIUM => 'dotted', ],
Border::STYLE_DOTTED.'%'.Border::WIDTH_THICK => 'dotted', Border::STYLE_DOTTED => [
Border::STYLE_DASHED.'%'.Border::WIDTH_THIN => 'dashed', Border::WIDTH_THIN => 'dotted',
Border::STYLE_DASHED.'%'.Border::WIDTH_MEDIUM => 'mediumDashed', Border::WIDTH_MEDIUM => 'dotted',
Border::STYLE_DASHED.'%'.Border::WIDTH_THICK => 'mediumDashed', Border::WIDTH_THICK => 'dotted',
Border::STYLE_DOUBLE.'%'.Border::WIDTH_THIN => 'double', ],
Border::STYLE_DOUBLE.'%'.Border::WIDTH_MEDIUM => 'double', Border::STYLE_DASHED => [
Border::STYLE_DOUBLE.'%'.Border::WIDTH_THICK => 'double', Border::WIDTH_THIN => 'dashed',
Border::STYLE_NONE.'%'.Border::WIDTH_THIN => 'none', Border::WIDTH_MEDIUM => 'mediumDashed',
Border::STYLE_NONE.'%'.Border::WIDTH_MEDIUM => 'none', Border::WIDTH_THICK => 'mediumDashed',
Border::STYLE_NONE.'%'.Border::WIDTH_THICK => 'none', ],
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) public static function serializeBorderPart(BorderPart $borderPart)
{ {
$styleDef = $borderPart->getStyle() .'%' . $borderPart->getWidth(); $borderStyle = self::$xlsxStyleMap[$borderPart->getStyle()][$borderPart->getWidth()];
$borderStyle = self::$xlsxStyleMap[$styleDef];
$colorEl = $borderPart->getColor() ? sprintf('<color rgb="%s"/>', $borderPart->getColor()) : ''; $colorEl = $borderPart->getColor() ? sprintf('<color rgb="%s"/>', $borderPart->getColor()) : '';
$partEl = sprintf( $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;
} }
} }

View File

@ -101,6 +101,7 @@ EOD;
protected function getBordersSectionContent() protected function getBordersSectionContent()
{ {
$content = '<borders count="' . count($this->styleIdToStyleMappingTable) . '">'; $content = '<borders count="' . count($this->styleIdToStyleMappingTable) . '">';
/** @var \Box\Spout\Writer\Style\Style $style */ /** @var \Box\Spout\Writer\Style\Style $style */
foreach ($this->getRegisteredStyles() as $style) { foreach ($this->getRegisteredStyles() as $style) {
$border = $style->getBorder(); $border = $style->getBorder();
@ -115,7 +116,9 @@ EOD;
$content .= '<border><left/><right/><top/><bottom/><diagonal/></border>'; $content .= '<border><left/><right/><top/><bottom/><diagonal/></border>';
} }
} }
$content .= '</borders>'; $content .= '</borders>';
return $content; return $content;
} }