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\Reader\Xlsx;

use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
> use PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter;
use PhpOffice\PhpSpreadsheet\Reader\IReadFilter; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
> use SimpleXMLElement;
class ColumnAndRowAttributes extends BaseParserClass {
> /** @var Worksheet */
private $worksheet;
> /** @var ?SimpleXMLElement */
private $worksheetXml;
< public function __construct(Worksheet $workSheet, \SimpleXMLElement $worksheetXml = null)
> public function __construct(Worksheet $workSheet, ?SimpleXMLElement $worksheetXml = null)
{ $this->worksheet = $workSheet; $this->worksheetXml = $worksheetXml; } /** * Set Worksheet column attributes by attributes array passed. * * @param string $columnAddress A, B, ... DX, ... * @param array $columnAttributes array of attributes (indexes are attribute name, values are value) * 'xfIndex', 'visible', 'collapsed', 'outlineLevel', 'width', ... ? */
< private function setColumnAttributes($columnAddress, array $columnAttributes)
> private function setColumnAttributes($columnAddress, array $columnAttributes): void
{ if (isset($columnAttributes['xfIndex'])) { $this->worksheet->getColumnDimension($columnAddress)->setXfIndex($columnAttributes['xfIndex']); } if (isset($columnAttributes['visible'])) { $this->worksheet->getColumnDimension($columnAddress)->setVisible($columnAttributes['visible']); } if (isset($columnAttributes['collapsed'])) { $this->worksheet->getColumnDimension($columnAddress)->setCollapsed($columnAttributes['collapsed']); } if (isset($columnAttributes['outlineLevel'])) { $this->worksheet->getColumnDimension($columnAddress)->setOutlineLevel($columnAttributes['outlineLevel']); } if (isset($columnAttributes['width'])) { $this->worksheet->getColumnDimension($columnAddress)->setWidth($columnAttributes['width']); } } /** * Set Worksheet row attributes by attributes array passed. * * @param int $rowNumber 1, 2, 3, ... 99, ... * @param array $rowAttributes array of attributes (indexes are attribute name, values are value) * 'xfIndex', 'visible', 'collapsed', 'outlineLevel', 'rowHeight', ... ? */
< private function setRowAttributes($rowNumber, array $rowAttributes)
> private function setRowAttributes($rowNumber, array $rowAttributes): void
{ if (isset($rowAttributes['xfIndex'])) { $this->worksheet->getRowDimension($rowNumber)->setXfIndex($rowAttributes['xfIndex']); } if (isset($rowAttributes['visible'])) { $this->worksheet->getRowDimension($rowNumber)->setVisible($rowAttributes['visible']); } if (isset($rowAttributes['collapsed'])) { $this->worksheet->getRowDimension($rowNumber)->setCollapsed($rowAttributes['collapsed']); } if (isset($rowAttributes['outlineLevel'])) { $this->worksheet->getRowDimension($rowNumber)->setOutlineLevel($rowAttributes['outlineLevel']); } if (isset($rowAttributes['rowHeight'])) { $this->worksheet->getRowDimension($rowNumber)->setRowHeight($rowAttributes['rowHeight']); } }
< /** < * @param IReadFilter $readFilter < * @param bool $readDataOnly < */ < public function load(IReadFilter $readFilter = null, $readDataOnly = false)
> public function load(?IReadFilter $readFilter = null, bool $readDataOnly = false): void
{ if ($this->worksheetXml === null) { return; } $columnsAttributes = []; $rowsAttributes = []; if (isset($this->worksheetXml->cols)) { $columnsAttributes = $this->readColumnAttributes($this->worksheetXml->cols, $readDataOnly); } if ($this->worksheetXml->sheetData && $this->worksheetXml->sheetData->row) { $rowsAttributes = $this->readRowAttributes($this->worksheetXml->sheetData->row, $readDataOnly); }
> if ($readFilter !== null && get_class($readFilter) === DefaultReadFilter::class) { // set columns/rows attributes > $readFilter = null; $columnsAttributesAreSet = []; > } foreach ($columnsAttributes as $columnCoordinate => $columnAttributes) { >
< if ($readFilter === null || < !$this->isFilteredColumn($readFilter, $columnCoordinate, $rowsAttributes)) {
> if ( > $readFilter === null || > !$this->isFilteredColumn($readFilter, $columnCoordinate, $rowsAttributes) > ) {
if (!isset($columnsAttributesAreSet[$columnCoordinate])) { $this->setColumnAttributes($columnCoordinate, $columnAttributes); $columnsAttributesAreSet[$columnCoordinate] = true; } } } $rowsAttributesAreSet = []; foreach ($rowsAttributes as $rowCoordinate => $rowAttributes) {
< if ($readFilter === null || < !$this->isFilteredRow($readFilter, $rowCoordinate, $columnsAttributes)) {
> if ( > $readFilter === null || > !$this->isFilteredRow($readFilter, $rowCoordinate, $columnsAttributes) > ) {
if (!isset($rowsAttributesAreSet[$rowCoordinate])) { $this->setRowAttributes($rowCoordinate, $rowAttributes); $rowsAttributesAreSet[$rowCoordinate] = true; } } } }
< private function isFilteredColumn(IReadFilter $readFilter, $columnCoordinate, array $rowsAttributes)
> private function isFilteredColumn(IReadFilter $readFilter, string $columnCoordinate, array $rowsAttributes): bool
{ foreach ($rowsAttributes as $rowCoordinate => $rowAttributes) { if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) { return true; } } return false; }
< private function readColumnAttributes(\SimpleXMLElement $worksheetCols, $readDataOnly)
> private function readColumnAttributes(SimpleXMLElement $worksheetCols, bool $readDataOnly): array
{ $columnAttributes = [];
< foreach ($worksheetCols->col as $column) {
> foreach ($worksheetCols->col as $columnx) { > /** @scrutinizer ignore-call */ > $column = $columnx->attributes(); > if ($column !== null) {
$startColumn = Coordinate::stringFromColumnIndex((int) $column['min']); $endColumn = Coordinate::stringFromColumnIndex((int) $column['max']); ++$endColumn; for ($columnAddress = $startColumn; $columnAddress !== $endColumn; ++$columnAddress) { $columnAttributes[$columnAddress] = $this->readColumnRangeAttributes($column, $readDataOnly); if ((int) ($column['max']) == 16384) { break; } } }
> }
return $columnAttributes; }
< private function readColumnRangeAttributes(\SimpleXMLElement $column, $readDataOnly)
> private function readColumnRangeAttributes(?SimpleXMLElement $column, bool $readDataOnly): array
{ $columnAttributes = [];
< < if ($column['style'] && !$readDataOnly) {
> if ($column !== null) { > if (isset($column['style']) && !$readDataOnly) {
$columnAttributes['xfIndex'] = (int) $column['style']; }
< if (self::boolean($column['hidden'])) {
> if (isset($column['hidden']) && self::boolean($column['hidden'])) {
$columnAttributes['visible'] = false; }
< if (self::boolean($column['collapsed'])) {
> if (isset($column['collapsed']) && self::boolean($column['collapsed'])) {
$columnAttributes['collapsed'] = true; }
< if (((int) $column['outlineLevel']) > 0) {
> if (isset($column['outlineLevel']) && ((int) $column['outlineLevel']) > 0) {
$columnAttributes['outlineLevel'] = (int) $column['outlineLevel']; }
> if (isset($column['width'])) {
$columnAttributes['width'] = (float) $column['width'];
> } > }
return $columnAttributes; }
< private function isFilteredRow(IReadFilter $readFilter, $rowCoordinate, array $columnsAttributes)
> private function isFilteredRow(IReadFilter $readFilter, int $rowCoordinate, array $columnsAttributes): bool
{ foreach ($columnsAttributes as $columnCoordinate => $columnAttributes) { if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) { return true; } } return false; }
< private function readRowAttributes(\SimpleXMLElement $worksheetRow, $readDataOnly)
> private function readRowAttributes(SimpleXMLElement $worksheetRow, bool $readDataOnly): array
{ $rowAttributes = [];
< foreach ($worksheetRow as $row) { < if ($row['ht'] && !$readDataOnly) {
> foreach ($worksheetRow as $rowx) { > /** @scrutinizer ignore-call */ > $row = $rowx->attributes(); > if ($row !== null) { > if (isset($row['ht']) && !$readDataOnly) {
$rowAttributes[(int) $row['r']]['rowHeight'] = (float) $row['ht']; }
< if (self::boolean($row['hidden'])) {
> if (isset($row['hidden']) && self::boolean($row['hidden'])) {
$rowAttributes[(int) $row['r']]['visible'] = false; }
< if (self::boolean($row['collapsed'])) {
> if (isset($row['collapsed']) && self::boolean($row['collapsed'])) {
$rowAttributes[(int) $row['r']]['collapsed'] = true; }
< if ((int) $row['outlineLevel'] > 0) {
> if (isset($row['outlineLevel']) && (int) $row['outlineLevel'] > 0) {
$rowAttributes[(int) $row['r']]['outlineLevel'] = (int) $row['outlineLevel']; }
< if ($row['s'] && !$readDataOnly) {
> if (isset($row['s']) && !$readDataOnly) {
$rowAttributes[(int) $row['r']]['xfIndex'] = (int) $row['s'];
> }
} } return $rowAttributes; } }