Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
<?php

namespace PhpOffice\PhpSpreadsheet\Style;

use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;

class Alignment extends Supervisor
{
    // Horizontal alignment styles
    const HORIZONTAL_GENERAL = 'general';
    const HORIZONTAL_LEFT = 'left';
    const HORIZONTAL_RIGHT = 'right';
    const HORIZONTAL_CENTER = 'center';
    const HORIZONTAL_CENTER_CONTINUOUS = 'centerContinuous';
    const HORIZONTAL_JUSTIFY = 'justify';
    const HORIZONTAL_FILL = 'fill';
    const HORIZONTAL_DISTRIBUTED = 'distributed'; // Excel2007 only
> private const HORIZONTAL_CENTER_CONTINUOUS_LC = 'centercontinuous'; > // Mapping for horizontal alignment // Vertical alignment styles > const HORIZONTAL_ALIGNMENT_FOR_XLSX = [ const VERTICAL_BOTTOM = 'bottom'; > self::HORIZONTAL_LEFT => self::HORIZONTAL_LEFT, const VERTICAL_TOP = 'top'; > self::HORIZONTAL_RIGHT => self::HORIZONTAL_RIGHT, const VERTICAL_CENTER = 'center'; > self::HORIZONTAL_CENTER => self::HORIZONTAL_CENTER, const VERTICAL_JUSTIFY = 'justify'; > self::HORIZONTAL_CENTER_CONTINUOUS => self::HORIZONTAL_CENTER_CONTINUOUS, const VERTICAL_DISTRIBUTED = 'distributed'; // Excel2007 only > self::HORIZONTAL_JUSTIFY => self::HORIZONTAL_JUSTIFY, > self::HORIZONTAL_FILL => self::HORIZONTAL_FILL, // Read order > self::HORIZONTAL_DISTRIBUTED => self::HORIZONTAL_DISTRIBUTED, const READORDER_CONTEXT = 0; > ]; const READORDER_LTR = 1; > // Mapping for horizontal alignment CSS const READORDER_RTL = 2; > const HORIZONTAL_ALIGNMENT_FOR_HTML = [ > self::HORIZONTAL_LEFT => self::HORIZONTAL_LEFT, /** > self::HORIZONTAL_RIGHT => self::HORIZONTAL_RIGHT, * Horizontal alignment. > self::HORIZONTAL_CENTER => self::HORIZONTAL_CENTER, * > self::HORIZONTAL_CENTER_CONTINUOUS => self::HORIZONTAL_CENTER, * @var string > self::HORIZONTAL_JUSTIFY => self::HORIZONTAL_JUSTIFY, */ > //self::HORIZONTAL_FILL => self::HORIZONTAL_FILL, // no reasonable equivalent for fill protected $horizontal = self::HORIZONTAL_GENERAL; > self::HORIZONTAL_DISTRIBUTED => self::HORIZONTAL_JUSTIFY, > ];
/**
> // Vertical alignment CSS * Vertical alignment. > private const VERTICAL_BASELINE = 'baseline'; * > private const VERTICAL_MIDDLE = 'middle'; * @var string > private const VERTICAL_SUB = 'sub'; */ > private const VERTICAL_SUPER = 'super'; protected $vertical = self::VERTICAL_BOTTOM; > private const VERTICAL_TEXT_BOTTOM = 'text-bottom'; > private const VERTICAL_TEXT_TOP = 'text-top'; /** > * Text rotation. > // Mapping for vertical alignment * > const VERTICAL_ALIGNMENT_FOR_XLSX = [ * @var int > self::VERTICAL_BOTTOM => self::VERTICAL_BOTTOM, */ > self::VERTICAL_TOP => self::VERTICAL_TOP, protected $textRotation = 0; > self::VERTICAL_CENTER => self::VERTICAL_CENTER, > self::VERTICAL_JUSTIFY => self::VERTICAL_JUSTIFY, /** > self::VERTICAL_DISTRIBUTED => self::VERTICAL_DISTRIBUTED, * Wrap text. > // css settings that arent't in sync with Excel * > self::VERTICAL_BASELINE => self::VERTICAL_BOTTOM, * @var bool > self::VERTICAL_MIDDLE => self::VERTICAL_CENTER, */ > self::VERTICAL_SUB => self::VERTICAL_BOTTOM, protected $wrapText = false; > self::VERTICAL_SUPER => self::VERTICAL_TOP, > self::VERTICAL_TEXT_BOTTOM => self::VERTICAL_BOTTOM, /** > self::VERTICAL_TEXT_TOP => self::VERTICAL_TOP, * Shrink to fit. > ]; * > * @var bool > // Mapping for vertical alignment for Html */ > const VERTICAL_ALIGNMENT_FOR_HTML = [ protected $shrinkToFit = false; > self::VERTICAL_BOTTOM => self::VERTICAL_BOTTOM, > self::VERTICAL_TOP => self::VERTICAL_TOP, /** > self::VERTICAL_CENTER => self::VERTICAL_MIDDLE, * Indent - only possible with horizontal alignment left and right. > self::VERTICAL_JUSTIFY => self::VERTICAL_MIDDLE, * > self::VERTICAL_DISTRIBUTED => self::VERTICAL_MIDDLE, * @var int > // css settings that arent't in sync with Excel */ > self::VERTICAL_BASELINE => self::VERTICAL_BASELINE, protected $indent = 0; > self::VERTICAL_MIDDLE => self::VERTICAL_MIDDLE, > self::VERTICAL_SUB => self::VERTICAL_SUB, /** > self::VERTICAL_SUPER => self::VERTICAL_SUPER, * Read order. > self::VERTICAL_TEXT_BOTTOM => self::VERTICAL_TEXT_BOTTOM, * > self::VERTICAL_TEXT_TOP => self::VERTICAL_TEXT_TOP, * @var int > ];
*/
> // Special value for Text Rotation protected $readOrder = 0; > const TEXTROTATION_STACK_EXCEL = 255; > const TEXTROTATION_STACK_PHPSPREADSHEET = -165; // 90 - 255 /** >
< * @var string
> * @var null|string
< * @var string
> * @var null|string
< * @var int
> * @var null|int
* 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($isSupervisor = false, $isConditional = false) { // Supervisor? parent::__construct($isSupervisor); if ($isConditional) { $this->horizontal = null; $this->vertical = null; $this->textRotation = null; } } /** * Get the shared style component for the currently active cell in currently active sheet. * Only used for style supervisor. * * @return Alignment */ public function getSharedComponent() {
< return $this->parent->getSharedComponent()->getAlignment();
> /** @var Style */ > $parent = $this->parent; > > return $parent->getSharedComponent()->getAlignment();
} /** * Build style array from subcomponents. * * @param array $array * * @return array */ public function getStyleArray($array) { return ['alignment' => $array]; } /** * Apply styles from array. * * <code> * $spreadsheet->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( * [ * 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, * 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, * 'textRotation' => 0, * 'wrapText' => TRUE * ] * ); * </code> *
< * @param array $pStyles Array containing style information
> * @param array $styleArray Array containing style information
*
< * @throws PhpSpreadsheetException < * < * @return Alignment
> * @return $this
*/
< public function applyFromArray(array $pStyles)
> public function applyFromArray(array $styleArray)
{ if ($this->isSupervisor) { $this->getActiveSheet()->getStyle($this->getSelectedCells())
< ->applyFromArray($this->getStyleArray($pStyles));
> ->applyFromArray($this->getStyleArray($styleArray));
} else {
< if (isset($pStyles['horizontal'])) { < $this->setHorizontal($pStyles['horizontal']);
> if (isset($styleArray['horizontal'])) { > $this->setHorizontal($styleArray['horizontal']);
}
< if (isset($pStyles['vertical'])) { < $this->setVertical($pStyles['vertical']);
> if (isset($styleArray['vertical'])) { > $this->setVertical($styleArray['vertical']);
}
< if (isset($pStyles['textRotation'])) { < $this->setTextRotation($pStyles['textRotation']);
> if (isset($styleArray['textRotation'])) { > $this->setTextRotation($styleArray['textRotation']);
}
< if (isset($pStyles['wrapText'])) { < $this->setWrapText($pStyles['wrapText']);
> if (isset($styleArray['wrapText'])) { > $this->setWrapText($styleArray['wrapText']);
}
< if (isset($pStyles['shrinkToFit'])) { < $this->setShrinkToFit($pStyles['shrinkToFit']);
> if (isset($styleArray['shrinkToFit'])) { > $this->setShrinkToFit($styleArray['shrinkToFit']);
}
< if (isset($pStyles['indent'])) { < $this->setIndent($pStyles['indent']);
> if (isset($styleArray['indent'])) { > $this->setIndent($styleArray['indent']);
}
< if (isset($pStyles['readOrder'])) { < $this->setReadOrder($pStyles['readOrder']);
> if (isset($styleArray['readOrder'])) { > $this->setReadOrder($styleArray['readOrder']);
} } return $this; } /** * Get Horizontal. *
< * @return string
> * @return null|string
*/ public function getHorizontal() { if ($this->isSupervisor) { return $this->getSharedComponent()->getHorizontal(); } return $this->horizontal; } /** * Set Horizontal. *
< * @param string $pValue see self::HORIZONTAL_*
> * @param string $horizontalAlignment see self::HORIZONTAL_*
*
< * @return Alignment
> * @return $this
*/
< public function setHorizontal($pValue)
> public function setHorizontal(string $horizontalAlignment)
{
< if ($pValue == '') { < $pValue = self::HORIZONTAL_GENERAL;
> $horizontalAlignment = strtolower($horizontalAlignment); > if ($horizontalAlignment === self::HORIZONTAL_CENTER_CONTINUOUS_LC) { > $horizontalAlignment = self::HORIZONTAL_CENTER_CONTINUOUS;
} if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['horizontal' => $pValue]);
> $styleArray = $this->getStyleArray(['horizontal' => $horizontalAlignment]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->horizontal = $pValue;
> $this->horizontal = $horizontalAlignment;
} return $this; } /** * Get Vertical. *
< * @return string
> * @return null|string
*/ public function getVertical() { if ($this->isSupervisor) { return $this->getSharedComponent()->getVertical(); } return $this->vertical; } /** * Set Vertical. *
< * @param string $pValue see self::VERTICAL_*
> * @param string $verticalAlignment see self::VERTICAL_*
*
< * @return Alignment
> * @return $this
*/
< public function setVertical($pValue)
> public function setVertical($verticalAlignment)
{
< if ($pValue == '') { < $pValue = self::VERTICAL_BOTTOM; < }
> $verticalAlignment = strtolower($verticalAlignment);
if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['vertical' => $pValue]);
> $styleArray = $this->getStyleArray(['vertical' => $verticalAlignment]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->vertical = $pValue;
> $this->vertical = $verticalAlignment;
} return $this; } /** * Get TextRotation. *
< * @return int
> * @return null|int
*/ public function getTextRotation() { if ($this->isSupervisor) { return $this->getSharedComponent()->getTextRotation(); } return $this->textRotation; } /** * Set TextRotation. *
< * @param int $pValue < * < * @throws PhpSpreadsheetException
> * @param int $angleInDegrees
*
< * @return Alignment
> * @return $this
*/
< public function setTextRotation($pValue)
> public function setTextRotation($angleInDegrees)
{ // Excel2007 value 255 => PhpSpreadsheet value -165
< if ($pValue == 255) { < $pValue = -165;
> if ($angleInDegrees == self::TEXTROTATION_STACK_EXCEL) { > $angleInDegrees = self::TEXTROTATION_STACK_PHPSPREADSHEET;
} // Set rotation
< if (($pValue >= -90 && $pValue <= 90) || $pValue == -165) {
> if (($angleInDegrees >= -90 && $angleInDegrees <= 90) || $angleInDegrees == self::TEXTROTATION_STACK_PHPSPREADSHEET) {
if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['textRotation' => $pValue]);
> $styleArray = $this->getStyleArray(['textRotation' => $angleInDegrees]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->textRotation = $pValue;
> $this->textRotation = $angleInDegrees;
} } else { throw new PhpSpreadsheetException('Text rotation should be a value between -90 and 90.'); } return $this; } /** * Get Wrap Text. * * @return bool */ public function getWrapText() { if ($this->isSupervisor) { return $this->getSharedComponent()->getWrapText(); } return $this->wrapText; } /** * Set Wrap Text. *
< * @param bool $pValue
> * @param bool $wrapped
*
< * @return Alignment
> * @return $this
*/
< public function setWrapText($pValue)
> public function setWrapText($wrapped)
{
< if ($pValue == '') { < $pValue = false;
> if ($wrapped == '') { > $wrapped = false;
} if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['wrapText' => $pValue]);
> $styleArray = $this->getStyleArray(['wrapText' => $wrapped]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->wrapText = $pValue;
> $this->wrapText = $wrapped;
} return $this; } /** * Get Shrink to fit. * * @return bool */ public function getShrinkToFit() { if ($this->isSupervisor) { return $this->getSharedComponent()->getShrinkToFit(); } return $this->shrinkToFit; } /** * Set Shrink to fit. *
< * @param bool $pValue
> * @param bool $shrink
*
< * @return Alignment
> * @return $this
*/
< public function setShrinkToFit($pValue)
> public function setShrinkToFit($shrink)
{
< if ($pValue == '') { < $pValue = false;
> if ($shrink == '') { > $shrink = false;
} if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['shrinkToFit' => $pValue]);
> $styleArray = $this->getStyleArray(['shrinkToFit' => $shrink]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->shrinkToFit = $pValue;
> $this->shrinkToFit = $shrink;
} return $this; } /** * Get indent. * * @return int */ public function getIndent() { if ($this->isSupervisor) { return $this->getSharedComponent()->getIndent(); } return $this->indent; } /** * Set indent. *
< * @param int $pValue
> * @param int $indent
*
< * @return Alignment
> * @return $this
*/
< public function setIndent($pValue)
> public function setIndent($indent)
{
< if ($pValue > 0) { < if ($this->getHorizontal() != self::HORIZONTAL_GENERAL &&
> if ($indent > 0) { > if ( > $this->getHorizontal() != self::HORIZONTAL_GENERAL &&
$this->getHorizontal() != self::HORIZONTAL_LEFT &&
< $this->getHorizontal() != self::HORIZONTAL_RIGHT) { < $pValue = 0; // indent not supported
> $this->getHorizontal() != self::HORIZONTAL_RIGHT && > $this->getHorizontal() != self::HORIZONTAL_DISTRIBUTED > ) { > $indent = 0; // indent not supported
} } if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['indent' => $pValue]);
> $styleArray = $this->getStyleArray(['indent' => $indent]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->indent = $pValue;
> $this->indent = $indent;
} return $this; } /** * Get read order. * * @return int */ public function getReadOrder() { if ($this->isSupervisor) { return $this->getSharedComponent()->getReadOrder(); } return $this->readOrder; } /** * Set read order. *
< * @param int $pValue
> * @param int $readOrder
*
< * @return Alignment
> * @return $this
*/
< public function setReadOrder($pValue)
> public function setReadOrder($readOrder)
{
< if ($pValue < 0 || $pValue > 2) { < $pValue = 0;
> if ($readOrder < 0 || $readOrder > 2) { > $readOrder = 0;
} if ($this->isSupervisor) {
< $styleArray = $this->getStyleArray(['readOrder' => $pValue]);
> $styleArray = $this->getStyleArray(['readOrder' => $readOrder]);
$this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); } else {
< $this->readOrder = $pValue;
> $this->readOrder = $readOrder;
} return $this; } /** * Get hash code. * * @return string Hash code */ public function getHashCode() { if ($this->isSupervisor) { return $this->getSharedComponent()->getHashCode(); } return md5( $this->horizontal . $this->vertical . $this->textRotation . ($this->wrapText ? 't' : 'f') . ($this->shrinkToFit ? 't' : 'f') . $this->indent . $this->readOrder . __CLASS__ );
> } } > } > protected function exportArray1(): array > { > $exportedArray = []; > $this->exportArray2($exportedArray, 'horizontal', $this->getHorizontal()); > $this->exportArray2($exportedArray, 'indent', $this->getIndent()); > $this->exportArray2($exportedArray, 'readOrder', $this->getReadOrder()); > $this->exportArray2($exportedArray, 'shrinkToFit', $this->getShrinkToFit()); > $this->exportArray2($exportedArray, 'textRotation', $this->getTextRotation()); > $this->exportArray2($exportedArray, 'vertical', $this->getVertical()); > $this->exportArray2($exportedArray, 'wrapText', $this->getWrapText()); > > return $exportedArray;