trying to get number format to work
This commit is contained in:
parent
30cd730c7c
commit
f5de2cefd8
@ -72,6 +72,9 @@ class Style
|
|||||||
private $hasSetBackgroundColor = false;
|
private $hasSetBackgroundColor = false;
|
||||||
|
|
||||||
private $numberFormat;
|
private $numberFormat;
|
||||||
|
/** @var bool Whether border properties should be applied */
|
||||||
|
private $shouldApplyNumberFormat = false;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int|null
|
* @return int|null
|
||||||
@ -117,7 +120,7 @@ class Style
|
|||||||
*/
|
*/
|
||||||
public function getNumberFormat()
|
public function getNumberFormat()
|
||||||
{
|
{
|
||||||
return $this->numberFormat ?? null;
|
return $this->numberFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -126,6 +129,7 @@ class Style
|
|||||||
*/
|
*/
|
||||||
public function setNumberFormat(NumberFormat $format)
|
public function setNumberFormat(NumberFormat $format)
|
||||||
{
|
{
|
||||||
|
$this->shouldApplyNumberFormat = true;
|
||||||
$this->numberFormat = $format;
|
$this->numberFormat = $format;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
@ -138,6 +142,13 @@ class Style
|
|||||||
{
|
{
|
||||||
return $this->shouldApplyBorder;
|
return $this->shouldApplyBorder;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function shouldApplyNumberFormat()
|
||||||
|
{
|
||||||
|
return $this->shouldApplyNumberFormat;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Box\Spout\Writer\Common\Manager\Style;
|
namespace Box\Spout\Writer\Common\Manager\Style;
|
||||||
|
|
||||||
use Box\Spout\Common\Entity\Style\NumberFormat;
|
|
||||||
use Box\Spout\Common\Entity\Style\Style;
|
use Box\Spout\Common\Entity\Style\Style;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,11 +37,6 @@ class StyleRegistry
|
|||||||
*/
|
*/
|
||||||
public function registerStyle(Style $style)
|
public function registerStyle(Style $style)
|
||||||
{
|
{
|
||||||
$format = $style->getNumberFormat();
|
|
||||||
if (!empty($format)) {
|
|
||||||
$registeredFormat = $this->registerNumberFormat($format);
|
|
||||||
$style->setNumberFormat($registeredFormat);
|
|
||||||
}
|
|
||||||
$serializedStyle = $this->serialize($style);
|
$serializedStyle = $this->serialize($style);
|
||||||
|
|
||||||
if (!$this->hasStyleAlreadyBeenRegistered($style)) {
|
if (!$this->hasStyleAlreadyBeenRegistered($style)) {
|
||||||
@ -56,18 +50,6 @@ class StyleRegistry
|
|||||||
return $this->getStyleFromSerializedStyle($serializedStyle);
|
return $this->getStyleFromSerializedStyle($serializedStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function registerNumberFormat(NumberFormat $format)
|
|
||||||
{
|
|
||||||
$serializedFormat = $this->serializeFormat($format);
|
|
||||||
if (!$this->hasFormatAlreadyBeenRegistered($format)) {
|
|
||||||
$nextFormatId = count($this->serializedNumberFormatToFormatIdMappingTable);
|
|
||||||
$format->setId($nextFormatId);
|
|
||||||
|
|
||||||
$this->serializedNumberFormatToFormatIdMappingTable[$serializedFormat] = $nextFormatId;
|
|
||||||
$this->numberFormats[$nextFormatId] = $format;
|
|
||||||
}
|
|
||||||
return $this->getFormatFromSerializedFormat($serializedFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the given style has already been registered.
|
* Returns whether the given style has already been registered.
|
||||||
@ -83,19 +65,6 @@ class StyleRegistry
|
|||||||
return isset($this->serializedStyleToStyleIdMappingTable[$serializedStyle]);
|
return isset($this->serializedStyleToStyleIdMappingTable[$serializedStyle]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether the given number format has already been registered.
|
|
||||||
*
|
|
||||||
* @param NumberFormat $format
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
protected function hasFormatAlreadyBeenRegistered(NumberFormat $format)
|
|
||||||
{
|
|
||||||
$serializedFormat = $this->serializeFormat($format);
|
|
||||||
|
|
||||||
// Using isset here because it is way faster than array_key_exists...
|
|
||||||
return isset($this->serializedNumberFormatToFormatIdMappingTable[$serializedFormat]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the registered style associated to the given serialization.
|
* Returns the registered style associated to the given serialization.
|
||||||
@ -110,19 +79,6 @@ class StyleRegistry
|
|||||||
return $this->styleIdToStyleMappingTable[$styleId];
|
return $this->styleIdToStyleMappingTable[$styleId];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the registered number format associated to the given serialization.
|
|
||||||
*
|
|
||||||
* @param string $serializedFormat The serialized number format from which the actual format should be fetched from
|
|
||||||
* @return NumberFormat
|
|
||||||
*/
|
|
||||||
protected function getFormatFromSerializedFormat($serializedFormat)
|
|
||||||
{
|
|
||||||
$formatId = $this->serializedNumberFormatToFormatIdMappingTable[$serializedFormat];
|
|
||||||
|
|
||||||
return $this->numberFormats[$formatId];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Style[] List of registered styles
|
* @return Style[] List of registered styles
|
||||||
*/
|
*/
|
||||||
@ -131,14 +87,6 @@ class StyleRegistry
|
|||||||
return array_values($this->styleIdToStyleMappingTable);
|
return array_values($this->styleIdToStyleMappingTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NumberFormat[] List of registered number formats
|
|
||||||
*/
|
|
||||||
public function getRegisteredNumberFormats()
|
|
||||||
{
|
|
||||||
return array_values($this->numberFormats);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $styleId
|
* @param int $styleId
|
||||||
* @return Style
|
* @return Style
|
||||||
@ -168,25 +116,4 @@ class StyleRegistry
|
|||||||
|
|
||||||
return $serializedStyle;
|
return $serializedStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializes the number format for future comparison with other formats.
|
|
||||||
* The ID is excluded from the comparison, as we only care about
|
|
||||||
* actual number format properties.
|
|
||||||
*
|
|
||||||
* @param Style $style
|
|
||||||
* @return string The serialized style
|
|
||||||
*/
|
|
||||||
public function serializeFormat(NumberFormat $format)
|
|
||||||
{
|
|
||||||
// In order to be able to properly compare style, set static ID value
|
|
||||||
$currentId = $format->getId();
|
|
||||||
$format->setId(0);
|
|
||||||
|
|
||||||
$serializedFormat = serialize($format);
|
|
||||||
|
|
||||||
$format->setId($currentId);
|
|
||||||
|
|
||||||
return $serializedFormat;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace Box\Spout\Writer\XLSX\Manager\Style;
|
namespace Box\Spout\Writer\XLSX\Manager\Style;
|
||||||
|
|
||||||
use Box\Spout\Common\Entity\Style\Color;
|
use Box\Spout\Common\Entity\Style\Color;
|
||||||
|
use Box\Spout\Common\Entity\Style\NumberFormat;
|
||||||
use Box\Spout\Common\Entity\Style\Style;
|
use Box\Spout\Common\Entity\Style\Style;
|
||||||
use Box\Spout\Writer\XLSX\Helper\BorderHelper;
|
use Box\Spout\Writer\XLSX\Helper\BorderHelper;
|
||||||
|
|
||||||
@ -70,6 +71,7 @@ EOD;
|
|||||||
}
|
}
|
||||||
|
|
||||||
$content = '<numFmts count="'.count($registeredFormats).'">';
|
$content = '<numFmts count="'.count($registeredFormats).'">';
|
||||||
|
/** @var NumberFormat $format */
|
||||||
foreach ($registeredFormats as $format) {
|
foreach ($registeredFormats as $format) {
|
||||||
|
|
||||||
$content .= '<numFmt numFmtId="'.$format->getId().'" formatCode="'.$format->getFormatCode().'"/>';
|
$content .= '<numFmt numFmtId="'.$format->getId().'" formatCode="'.$format->getFormatCode().'"/>';
|
||||||
|
@ -20,6 +20,10 @@ class StyleRegistry extends \Box\Spout\Writer\Common\Manager\Style\StyleRegistry
|
|||||||
*/
|
*/
|
||||||
protected $styleIdToFillMappingTable = [];
|
protected $styleIdToFillMappingTable = [];
|
||||||
|
|
||||||
|
protected $registeredNumberFormats = [];
|
||||||
|
|
||||||
|
protected $styleIdToNumberFormatMappingTable = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Excel preserves two default fills with index 0 and 1
|
* Excel preserves two default fills with index 0 and 1
|
||||||
* Since Excel is the dominant vendor - we play along here
|
* Since Excel is the dominant vendor - we play along here
|
||||||
@ -49,6 +53,7 @@ class StyleRegistry extends \Box\Spout\Writer\Common\Manager\Style\StyleRegistry
|
|||||||
$registeredStyle = parent::registerStyle($style);
|
$registeredStyle = parent::registerStyle($style);
|
||||||
$this->registerFill($registeredStyle);
|
$this->registerFill($registeredStyle);
|
||||||
$this->registerBorder($registeredStyle);
|
$this->registerBorder($registeredStyle);
|
||||||
|
$this->registerNumberFormat($registeredStyle);
|
||||||
|
|
||||||
return $registeredStyle;
|
return $registeredStyle;
|
||||||
}
|
}
|
||||||
@ -96,6 +101,47 @@ class StyleRegistry extends \Box\Spout\Writer\Common\Manager\Style\StyleRegistry
|
|||||||
null;
|
null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a number format definition
|
||||||
|
*
|
||||||
|
* @param Style $style
|
||||||
|
*/
|
||||||
|
private function registerNumberFormat(Style $style)
|
||||||
|
{
|
||||||
|
$styleId = $style->getId();
|
||||||
|
|
||||||
|
if ($style->shouldApplyNumberFormat()) {
|
||||||
|
$format = $style->getNumberFormat();
|
||||||
|
$serializedFormat = serialize($format);
|
||||||
|
$isNumberFormatRegistered = isset($this->registeredNumberFormats[$serializedFormat]);
|
||||||
|
|
||||||
|
// We need to track the already registered background definitions
|
||||||
|
if ($isNumberFormatRegistered) {
|
||||||
|
$registeredStyleId = $this->registeredFills[$serializedFormat];
|
||||||
|
$registeredFormatId = $this->styleIdToNumberFormatMappingTable[$registeredStyleId];
|
||||||
|
$this->styleIdToNumberFormatMappingTable[$styleId] = $registeredFormatId;
|
||||||
|
} else {
|
||||||
|
$this->registeredFills[$serializedFormat] = $styleId;
|
||||||
|
$this->styleIdToNumberFormatMappingTable[$styleId] = $this->fillIndex++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// The fillId maps a style to a fill declaration
|
||||||
|
// When there is no background color definition - we default to 0
|
||||||
|
$this->styleIdToNumberFormatMappingTable[$styleId] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $styleId
|
||||||
|
* @return int|null Number Format ID associated to the given style ID
|
||||||
|
*/
|
||||||
|
public function getNumberFormatIdForStyleId($styleId)
|
||||||
|
{
|
||||||
|
return (isset($this->styleIdToNumberFormatMappingTable[$styleId])) ?
|
||||||
|
$this->styleIdToNumberFormatMappingTable[$styleId] :
|
||||||
|
null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a border definition
|
* Register a border definition
|
||||||
*
|
*
|
||||||
@ -151,4 +197,11 @@ class StyleRegistry extends \Box\Spout\Writer\Common\Manager\Style\StyleRegistry
|
|||||||
{
|
{
|
||||||
return $this->registeredBorders;
|
return $this->registeredBorders;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getRegisteredNumberFormats()
|
||||||
|
{
|
||||||
|
return $this->registeredNumberFormats;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user