AutorÃa | Ultima modificación | Ver Log |
<?phpnamespace PhpOffice\PhpSpreadsheet\Style;class Color extends Supervisor{const NAMED_COLORS = ['Black','White','Red','Green','Blue','Yellow','Magenta','Cyan',];// Colorsconst COLOR_BLACK = 'FF000000';const COLOR_WHITE = 'FFFFFFFF';const COLOR_RED = 'FFFF0000';const COLOR_DARKRED = 'FF800000';const COLOR_BLUE = 'FF0000FF';const COLOR_DARKBLUE = 'FF000080';const COLOR_GREEN = 'FF00FF00';const COLOR_DARKGREEN = 'FF008000';const COLOR_YELLOW = 'FFFFFF00';const COLOR_DARKYELLOW = 'FF808000';const COLOR_MAGENTA = 'FFFF00FF';const COLOR_CYAN = 'FF00FFFF';const NAMED_COLOR_TRANSLATIONS = ['Black' => self::COLOR_BLACK,'White' => self::COLOR_WHITE,'Red' => self::COLOR_RED,'Green' => self::COLOR_GREEN,'Blue' => self::COLOR_BLUE,'Yellow' => self::COLOR_YELLOW,'Magenta' => self::COLOR_MAGENTA,'Cyan' => self::COLOR_CYAN,];const VALIDATE_ARGB_SIZE = 8;const VALIDATE_RGB_SIZE = 6;const VALIDATE_COLOR_6 = '/^[A-F0-9]{6}$/i';const VALIDATE_COLOR_8 = '/^[A-F0-9]{8}$/i';private const INDEXED_COLORS = [1 => 'FF000000', // System Colour #1 - Black2 => 'FFFFFFFF', // System Colour #2 - White3 => 'FFFF0000', // System Colour #3 - Red4 => 'FF00FF00', // System Colour #4 - Green5 => 'FF0000FF', // System Colour #5 - Blue6 => 'FFFFFF00', // System Colour #6 - Yellow7 => 'FFFF00FF', // System Colour #7- Magenta8 => 'FF00FFFF', // System Colour #8- Cyan9 => 'FF800000', // Standard Colour #910 => 'FF008000', // Standard Colour #1011 => 'FF000080', // Standard Colour #1112 => 'FF808000', // Standard Colour #1213 => 'FF800080', // Standard Colour #1314 => 'FF008080', // Standard Colour #1415 => 'FFC0C0C0', // Standard Colour #1516 => 'FF808080', // Standard Colour #1617 => 'FF9999FF', // Chart Fill Colour #1718 => 'FF993366', // Chart Fill Colour #1819 => 'FFFFFFCC', // Chart Fill Colour #1920 => 'FFCCFFFF', // Chart Fill Colour #2021 => 'FF660066', // Chart Fill Colour #2122 => 'FFFF8080', // Chart Fill Colour #2223 => 'FF0066CC', // Chart Fill Colour #2324 => 'FFCCCCFF', // Chart Fill Colour #2425 => 'FF000080', // Chart Line Colour #2526 => 'FFFF00FF', // Chart Line Colour #2627 => 'FFFFFF00', // Chart Line Colour #2728 => 'FF00FFFF', // Chart Line Colour #2829 => 'FF800080', // Chart Line Colour #2930 => 'FF800000', // Chart Line Colour #3031 => 'FF008080', // Chart Line Colour #3132 => 'FF0000FF', // Chart Line Colour #3233 => 'FF00CCFF', // Standard Colour #3334 => 'FFCCFFFF', // Standard Colour #3435 => 'FFCCFFCC', // Standard Colour #3536 => 'FFFFFF99', // Standard Colour #3637 => 'FF99CCFF', // Standard Colour #3738 => 'FFFF99CC', // Standard Colour #3839 => 'FFCC99FF', // Standard Colour #3940 => 'FFFFCC99', // Standard Colour #4041 => 'FF3366FF', // Standard Colour #4142 => 'FF33CCCC', // Standard Colour #4243 => 'FF99CC00', // Standard Colour #4344 => 'FFFFCC00', // Standard Colour #4445 => 'FFFF9900', // Standard Colour #4546 => 'FFFF6600', // Standard Colour #4647 => 'FF666699', // Standard Colour #4748 => 'FF969696', // Standard Colour #4849 => 'FF003366', // Standard Colour #4950 => 'FF339966', // Standard Colour #5051 => 'FF003300', // Standard Colour #5152 => 'FF333300', // Standard Colour #5253 => 'FF993300', // Standard Colour #5354 => 'FF993366', // Standard Colour #5455 => 'FF333399', // Standard Colour #5556 => 'FF333333', // Standard Colour #56];/*** ARGB - Alpha RGB.** @var null|string*/protected $argb;/** @var bool */private $hasChanged = false;/*** Create a new Color.** @param string $colorValue ARGB value for the colour, or named colour* @param bool $isSupervisor Flag indicating if this is a supervisor or not* Leave this value at default unless you understand exactly what* its ramifications are* @param bool $isConditional Flag indicating if this is a conditional style or not* Leave this value at default unless you understand exactly what* its ramifications are*/public function __construct($colorValue = self::COLOR_BLACK, $isSupervisor = false, $isConditional = false){// Supervisor?parent::__construct($isSupervisor);// Initialise valuesif (!$isConditional) {$this->argb = $this->validateColor($colorValue) ?: self::COLOR_BLACK;}}/*** Get the shared style component for the currently active cell in currently active sheet.* Only used for style supervisor.** @return Color*/public function getSharedComponent(){/** @var Style */$parent = $this->parent;/** @var Border|Fill $sharedComponent */$sharedComponent = $parent->getSharedComponent();if ($sharedComponent instanceof Fill) {if ($this->parentPropertyName === 'endColor') {return $sharedComponent->getEndColor();}return $sharedComponent->getStartColor();}return $sharedComponent->getColor();}/*** Build style array from subcomponents.** @param array $array** @return array*/public function getStyleArray($array){/** @var Style */$parent = $this->parent;return $parent->/** @scrutinizer ignore-call */ getStyleArray([$this->parentPropertyName => $array]);}/*** Apply styles from array.** <code>* $spreadsheet->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray(['rgb' => '808080']);* </code>** @param array $styleArray Array containing style information** @return $this*/public function applyFromArray(array $styleArray){if ($this->isSupervisor) {$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($styleArray));} else {if (isset($styleArray['rgb'])) {$this->setRGB($styleArray['rgb']);}if (isset($styleArray['argb'])) {$this->setARGB($styleArray['argb']);}}return $this;}private function validateColor(?string $colorValue): string{if ($colorValue === null || $colorValue === '') {return self::COLOR_BLACK;}$named = ucfirst(strtolower($colorValue));if (array_key_exists($named, self::NAMED_COLOR_TRANSLATIONS)) {return self::NAMED_COLOR_TRANSLATIONS[$named];}if (preg_match(self::VALIDATE_COLOR_8, $colorValue) === 1) {return $colorValue;}if (preg_match(self::VALIDATE_COLOR_6, $colorValue) === 1) {return 'FF' . $colorValue;}return '';}/*** Get ARGB.*/public function getARGB(): ?string{if ($this->isSupervisor) {return $this->getSharedComponent()->getARGB();}return $this->argb;}/*** Set ARGB.** @param string $colorValue ARGB value, or a named color** @return $this*/public function setARGB(?string $colorValue = self::COLOR_BLACK){$this->hasChanged = true;$colorValue = $this->validateColor($colorValue);if ($colorValue === '') {return $this;}if ($this->isSupervisor) {$styleArray = $this->getStyleArray(['argb' => $colorValue]);$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray);} else {$this->argb = $colorValue;}return $this;}/*** Get RGB.*/public function getRGB(): string{if ($this->isSupervisor) {return $this->getSharedComponent()->getRGB();}return substr($this->argb ?? '', 2);}/*** Set RGB.** @param string $colorValue RGB value, or a named color** @return $this*/public function setRGB(?string $colorValue = self::COLOR_BLACK){return $this->setARGB($colorValue);}/*** Get a specified colour component of an RGB value.** @param string $rgbValue The colour as an RGB value (e.g. FF00CCCC or CCDDEE* @param int $offset Position within the RGB value to extract* @param bool $hex Flag indicating whether the component should be returned as a hex or a* decimal value** @return int|string The extracted colour component*/private static function getColourComponent($rgbValue, $offset, $hex = true){$colour = substr($rgbValue, $offset, 2) ?: '';if (preg_match('/^[0-9a-f]{2}$/i', $colour) !== 1) {$colour = '00';}return ($hex) ? $colour : (int) hexdec($colour);}/*** Get the red colour component of an RGB value.** @param string $rgbValue The colour as an RGB value (e.g. FF00CCCC or CCDDEE* @param bool $hex Flag indicating whether the component should be returned as a hex or a* decimal value** @return int|string The red colour component*/public static function getRed($rgbValue, $hex = true){return self::getColourComponent($rgbValue, strlen($rgbValue) - 6, $hex);}/*** Get the green colour component of an RGB value.** @param string $rgbValue The colour as an RGB value (e.g. FF00CCCC or CCDDEE* @param bool $hex Flag indicating whether the component should be returned as a hex or a* decimal value** @return int|string The green colour component*/public static function getGreen($rgbValue, $hex = true){return self::getColourComponent($rgbValue, strlen($rgbValue) - 4, $hex);}/*** Get the blue colour component of an RGB value.** @param string $rgbValue The colour as an RGB value (e.g. FF00CCCC or CCDDEE* @param bool $hex Flag indicating whether the component should be returned as a hex or a* decimal value** @return int|string The blue colour component*/public static function getBlue($rgbValue, $hex = true){return self::getColourComponent($rgbValue, strlen($rgbValue) - 2, $hex);}/*** Adjust the brightness of a color.** @param string $hexColourValue The colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE)* @param float $adjustPercentage The percentage by which to adjust the colour as a float from -1 to 1** @return string The adjusted colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE)*/public static function changeBrightness($hexColourValue, $adjustPercentage){$rgba = (strlen($hexColourValue) === 8);$adjustPercentage = max(-1.0, min(1.0, $adjustPercentage));/** @var int $red */$red = self::getRed($hexColourValue, false);/** @var int $green */$green = self::getGreen($hexColourValue, false);/** @var int $blue */$blue = self::getBlue($hexColourValue, false);return (($rgba) ? 'FF' : '') . RgbTint::rgbAndTintToRgb($red, $green, $blue, $adjustPercentage);}/*** Get indexed color.** @param int $colorIndex Index entry point into the colour array* @param bool $background Flag to indicate whether default background or foreground colour* should be returned if the indexed colour doesn't exist*/public static function indexedColor($colorIndex, $background = false, ?array $palette = null): self{// Clean parameter$colorIndex = (int) $colorIndex;if (empty($palette)) {if (isset(self::INDEXED_COLORS[$colorIndex])) {return new self(self::INDEXED_COLORS[$colorIndex]);}} else {if (isset($palette[$colorIndex])) {return new self($palette[$colorIndex]);}}return ($background) ? new self(self::COLOR_WHITE) : new self(self::COLOR_BLACK);}/*** Get hash code.** @return string Hash code*/public function getHashCode(): string{if ($this->isSupervisor) {return $this->getSharedComponent()->getHashCode();}return md5($this->argb .__CLASS__);}protected function exportArray1(): array{$exportedArray = [];$this->exportArray2($exportedArray, 'argb', $this->getARGB());return $exportedArray;}public function getHasChanged(): bool{if ($this->isSupervisor) {return $this->getSharedComponent()->hasChanged;}return $this->hasChanged;}}