diff --git a/src/PhpSpreadsheet/Reader/BaseReader.php b/src/PhpSpreadsheet/Reader/BaseReader.php index 83e1b6f18..46e25d042 100644 --- a/src/PhpSpreadsheet/Reader/BaseReader.php +++ b/src/PhpSpreadsheet/Reader/BaseReader.php @@ -112,11 +112,13 @@ abstract class BaseReader implements IReader return $this; } + /** @return null|string[] */ public function getLoadSheetsOnly(): ?array { return $this->loadSheetsOnly; } + /** @param null|string|string[] $sheetList */ public function setLoadSheetsOnly(string|array|null $sheetList): self { if ($sheetList === null) { diff --git a/src/PhpSpreadsheet/Reader/Csv.php b/src/PhpSpreadsheet/Reader/Csv.php index 325e3723f..f4cdd02d3 100644 --- a/src/PhpSpreadsheet/Reader/Csv.php +++ b/src/PhpSpreadsheet/Reader/Csv.php @@ -228,6 +228,7 @@ class Csv extends BaseReader $this->checkSeparator(); $this->inferSeparator(); + /** @var array */ $worksheetInfo = []; $worksheetInfo[0]['worksheetName'] = 'Worksheet'; $worksheetInfo[0]['lastColumnLetter'] = 'A'; diff --git a/src/PhpSpreadsheet/Reader/Csv/Delimiter.php b/src/PhpSpreadsheet/Reader/Csv/Delimiter.php index 348331e35..05b898fc4 100644 --- a/src/PhpSpreadsheet/Reader/Csv/Delimiter.php +++ b/src/PhpSpreadsheet/Reader/Csv/Delimiter.php @@ -13,6 +13,7 @@ class Delimiter protected string $enclosure; + /** @var array */ protected array $counts = []; protected int $numberLines = 0; @@ -53,6 +54,7 @@ class Delimiter } } + /** @param array $delimiterKeys */ protected function countDelimiterValues(string $line, array $delimiterKeys): void { $splitString = mb_str_split($line, 1, 'UTF-8'); @@ -69,7 +71,7 @@ class Delimiter // Calculate the mean square deviations for each delimiter // (ignoring delimiters that haven't been found consistently) $meanSquareDeviations = []; - $middleIdx = floor(($this->numberLines - 1) / 2); + $middleIdx = (int) floor(($this->numberLines - 1) / 2); foreach (self::POTENTIAL_DELIMETERS as $delimiter) { $series = $this->counts[$delimiter]; diff --git a/src/PhpSpreadsheet/Reader/Gnumeric.php b/src/PhpSpreadsheet/Reader/Gnumeric.php index 2019d9a09..ed932388c 100644 --- a/src/PhpSpreadsheet/Reader/Gnumeric.php +++ b/src/PhpSpreadsheet/Reader/Gnumeric.php @@ -38,6 +38,8 @@ class Gnumeric extends BaseReader /** * Shared Expressions. + * + * @var array */ private array $expressions = []; @@ -48,6 +50,7 @@ class Gnumeric extends BaseReader private ReferenceHelper $referenceHelper; + /** @var array{'dataType': string[]} */ public static array $mappings = [ 'dataType' => [ '10' => DataType::TYPE_NULL, @@ -96,6 +99,8 @@ class Gnumeric extends BaseReader /** * Reads names of the worksheets from a file, without parsing the whole file to a Spreadsheet object. + * + * @return string[] */ public function listWorksheetNames(string $filename): array { @@ -203,6 +208,7 @@ class Gnumeric extends BaseReader return $data; } + /** @return mixed[] */ public static function gnumericMappings(): array { return array_merge(self::$mappings, Styles::$mappings); @@ -559,8 +565,8 @@ class Gnumeric extends BaseReader if (((string) $cell) > '') { // Formula $this->expressions[$ExprID] = [ - 'column' => $cellAttributes->Col, - 'row' => $cellAttributes->Row, + 'column' => (int) $cellAttributes->Col, + 'row' => (int) $cellAttributes->Row, 'formula' => (string) $cell, ]; } else { diff --git a/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php b/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php index f12b742f3..8315aa577 100644 --- a/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php +++ b/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php @@ -70,6 +70,11 @@ class PageSetup return $this; } + /** + * @param float[] $marginSet + * + * @return float[] + */ private function buildMarginSet(SimpleXMLElement $sheet, array $marginSet): array { foreach ($sheet->PrintInformation->Margins->children(Gnumeric::NAMESPACE_GNM) as $key => $margin) { @@ -83,6 +88,7 @@ class PageSetup return $marginSet; } + /** @param float[] $marginSet */ private function adjustMargins(array $marginSet): void { foreach ($marginSet as $key => $marginSize) { diff --git a/src/PhpSpreadsheet/Reader/Gnumeric/Styles.php b/src/PhpSpreadsheet/Reader/Gnumeric/Styles.php index f901c4a9b..9bb664f4d 100644 --- a/src/PhpSpreadsheet/Reader/Gnumeric/Styles.php +++ b/src/PhpSpreadsheet/Reader/Gnumeric/Styles.php @@ -18,6 +18,7 @@ class Styles protected bool $readDataOnly; + /** @var array */ public static array $mappings = [ 'borderStyle' => [ '0' => Border::BORDER_NONE, @@ -100,6 +101,7 @@ class Styles $styleAttributes = $style->Style->attributes(); + /** @var mixed[][] */ $styleArray = []; // We still set the number format mask for date/time values, even if readDataOnly is true // so that we can identify whether a float is a float or a date value @@ -117,6 +119,7 @@ class Styles } } + /** @param mixed[][] $styleArray */ private function addBorderDiagonal(SimpleXMLElement $srssb, array &$styleArray): void { if (isset($srssb->Diagonal, $srssb->{'Rev-Diagonal'})) { @@ -131,11 +134,14 @@ class Styles } } + /** @param mixed[][] $styleArray */ private function addBorderStyle(SimpleXMLElement $srssb, array &$styleArray, string $direction): void { $ucDirection = ucfirst($direction); if (isset($srssb->$ucDirection)) { - $styleArray['borders'][$direction] = self::parseBorderAttributes($srssb->$ucDirection->attributes()); + /** @var SimpleXMLElement */ + $temp = $srssb->$ucDirection; + $styleArray['borders'][$direction] = self::parseBorderAttributes($temp->attributes()); } } @@ -150,13 +156,15 @@ class Styles return $rotation; } + /** @param mixed[][] $styleArray */ private static function addStyle(array &$styleArray, string $key, string $value): void { if (array_key_exists($value, self::$mappings[$key])) { - $styleArray[$key] = self::$mappings[$key][$value]; + $styleArray[$key] = self::$mappings[$key][$value]; //* @phpstan-ignore-line } } + /** @param mixed[][] $styleArray */ private static function addStyle2(array &$styleArray, string $key1, string $key, string $value): void { if (array_key_exists($value, self::$mappings[$key])) { @@ -164,8 +172,10 @@ class Styles } } + /** @return mixed[][] */ private static function parseBorderAttributes(?SimpleXMLElement $borderAttributes): array { + /** @var mixed[][] */ $styleArray = []; if ($borderAttributes !== null) { if (isset($borderAttributes['Color'])) { @@ -174,6 +184,7 @@ class Styles self::addStyle($styleArray, 'borderStyle', (string) $borderAttributes['Style']); } + /** @var mixed[][] $styleArray */ return $styleArray; } @@ -188,9 +199,11 @@ class Styles return $gnmR . $gnmG . $gnmB; } + /** @param mixed[][] $styleArray */ private function addColors(array &$styleArray, SimpleXMLElement $styleAttributes): void { $RGB = self::parseGnumericColour((string) $styleAttributes['Fore']); + /** @var mixed[][][] $styleArray */ $styleArray['font']['color']['rgb'] = $RGB; $RGB = self::parseGnumericColour((string) $styleAttributes['Back']); $shade = (string) $styleAttributes['Shade']; @@ -221,6 +234,11 @@ class Styles return $cellRange; } + /** + * @param mixed[][] $styleArray + * + * @return mixed[] + */ private function readStyle(array $styleArray, SimpleXMLElement $styleAttributes, SimpleXMLElement $style): array { self::addStyle2($styleArray, 'alignment', 'horizontal', (string) $styleAttributes['HAlign']); diff --git a/src/PhpSpreadsheet/Reader/IReader.php b/src/PhpSpreadsheet/Reader/IReader.php index 250ef4f1c..a003b96fd 100644 --- a/src/PhpSpreadsheet/Reader/IReader.php +++ b/src/PhpSpreadsheet/Reader/IReader.php @@ -96,13 +96,15 @@ interface IReader * Get which sheets to load * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null * indicating that all worksheets in the workbook should be loaded. + * + * @return null|string[] */ public function getLoadSheetsOnly(): ?array; /** * Set which sheets to load. * - * @param null|array|string $value This should be either an array of worksheet names to be loaded, + * @param null|string|string[] $value This should be either an array of worksheet names to be loaded, * or a string containing a single worksheet name. If NULL, then it tells the Reader to * read all worksheets in the workbook * diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index 3b8609b0d..420ae2f7b 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -259,6 +259,7 @@ class Ods extends BaseReader throw new Exception('Unable to read data from {$pFilename}'); } + /** @var array{meta?: string, office?: string, dc?: string} */ $namespacesMeta = $xml->getNamespaces(true); (new DocumentProperties($spreadsheet))->load($xml, $namespacesMeta); @@ -383,6 +384,7 @@ class Ods extends BaseReader $columnWidth = new HelperDimension($columnWidths[$tableStyleName]); $tableColumnString = Coordinate::stringFromColumnIndex($tableColumnIndex); for ($rowRepeats2 = $rowRepeats; $rowRepeats2 > 0; --$rowRepeats2) { + /** @var string $tableColumnString */ $spreadsheet->getActiveSheet() ->getColumnDimension($tableColumnString) ->setWidth($columnWidth->toUnit('cm'), 'cm'); diff --git a/src/PhpSpreadsheet/Reader/Ods/PageSettings.php b/src/PhpSpreadsheet/Reader/Ods/PageSettings.php index fd35de5b9..26173b6f8 100644 --- a/src/PhpSpreadsheet/Reader/Ods/PageSettings.php +++ b/src/PhpSpreadsheet/Reader/Ods/PageSettings.php @@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheet\Reader\Ods; use DOMDocument; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; +use stdClass; class PageSettings { @@ -21,6 +22,7 @@ class PageSettings */ private array $tableStylesCrossReference = []; + /** @var mixed[] */ private array $pageLayoutStyles = []; /** @@ -151,12 +153,15 @@ class PageSettings if (!array_key_exists($printSettingsIndex, $this->pageLayoutStyles)) { return; } + /** @var (object{orientation: string, scale: int|string, printOrder: string|null, + * horizontalCentered: bool, verticalCentered: bool, marginLeft: float, marginRight: float, marginTop: float, + * marginBottom: float, marginHeader: float, marginFooter: float}&stdClass) */ $printSettings = $this->pageLayoutStyles[$printSettingsIndex]; $worksheet->getPageSetup() ->setOrientation($printSettings->orientation ?? PageSetup::ORIENTATION_DEFAULT) ->setPageOrder($printSettings->printOrder === 'ltr' ? PageSetup::PAGEORDER_OVER_THEN_DOWN : PageSetup::PAGEORDER_DOWN_THEN_OVER) - ->setScale((int) trim($printSettings->scale, '%')) + ->setScale((int) trim((string) $printSettings->scale, '%')) ->setHorizontalCentered($printSettings->horizontalCentered) ->setVerticalCentered($printSettings->verticalCentered); diff --git a/src/PhpSpreadsheet/Reader/Ods/Properties.php b/src/PhpSpreadsheet/Reader/Ods/Properties.php index a5f0c79f4..4dada28fc 100644 --- a/src/PhpSpreadsheet/Reader/Ods/Properties.php +++ b/src/PhpSpreadsheet/Reader/Ods/Properties.php @@ -15,10 +15,11 @@ class Properties $this->spreadsheet = $spreadsheet; } + /** @param array{meta?: string, office?: string, dc?: string} $namespacesMeta */ public function load(SimpleXMLElement $xml, array $namespacesMeta): void { $docProps = $this->spreadsheet->getProperties(); - $officeProperty = $xml->children($namespacesMeta['office']); + $officeProperty = $xml->children($namespacesMeta['office'] ?? ''); foreach ($officeProperty as $officePropertyData) { if (isset($namespacesMeta['dc'])) { $officePropertiesDC = $officePropertyData->children($namespacesMeta['dc']); @@ -27,7 +28,7 @@ class Properties $officePropertyMeta = null; if (isset($namespacesMeta['dc'])) { - $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); + $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta'] ?? ''); } $officePropertyMeta = $officePropertyMeta ?? []; foreach ($officePropertyMeta as $propertyName => $propertyValue) { @@ -66,13 +67,14 @@ class Properties } } + /** @param array{meta?: string, office?: mixed, dc?: mixed} $namespacesMeta */ private function setMetaProperties( array $namespacesMeta, SimpleXMLElement $propertyValue, string $propertyName, DocumentProperties $docProps ): void { - $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']); + $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta'] ?? ''); $propertyValue = (string) $propertyValue; switch ($propertyName) { case 'initial-creator': @@ -101,14 +103,17 @@ class Properties } } + /** @param iterable $propertyValueAttributes */ private function setUserDefinedProperty(iterable $propertyValueAttributes, string $propertyValue, DocumentProperties $docProps): void { $propertyValueName = ''; $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING; foreach ($propertyValueAttributes as $key => $value) { if ($key == 'name') { + /** @var scalar $value */ $propertyValueName = (string) $value; } elseif ($key == 'value-type') { + /** @var string $value */ switch ($value) { case 'date': $propertyValue = DocumentProperties::convertProperty($propertyValue, 'date'); diff --git a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php index 6d4ed449e..e4da44f31 100644 --- a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php @@ -102,6 +102,7 @@ class XmlScanner if ($this->callback !== null) { $xml = call_user_func($this->callback, $xml); } + /** @var string $xml */ return $xml; } diff --git a/src/PhpSpreadsheet/Reader/Slk.php b/src/PhpSpreadsheet/Reader/Slk.php index 27b66a0d1..d3d59f0e1 100644 --- a/src/PhpSpreadsheet/Reader/Slk.php +++ b/src/PhpSpreadsheet/Reader/Slk.php @@ -21,6 +21,8 @@ class Slk extends BaseReader /** * Formats. + * + * @var mixed[] */ private array $formats = []; @@ -31,6 +33,8 @@ class Slk extends BaseReader /** * Fonts. + * + * @var mixed[] */ private array $fonts = []; @@ -94,8 +98,7 @@ class Slk extends BaseReader $fileHandle = $this->fileHandle; rewind($fileHandle); - $worksheetInfo = []; - $worksheetInfo[0]['worksheetName'] = basename($filename, '.slk'); + $worksheetInfo = [['worksheetName' => basename($filename, '.slk')]]; // loop through one row (line) at a time in the file $rowIndex = 0; @@ -218,6 +221,7 @@ class Slk extends BaseReader $hasCalculatedValue = true; } + /** @param mixed[] $rowData */ private function processCRecord(array $rowData, Spreadsheet &$spreadsheet, string &$row, string &$column): void { // Read cell value data @@ -227,6 +231,7 @@ class Slk extends BaseReader $sharedColumn = $sharedRow = -1; $sharedFormula = false; foreach ($rowData as $rowDatum) { + /** @var string $rowDatum */ switch ($rowDatum[0]) { case 'X': $column = substr($rowDatum, 1); @@ -302,6 +307,7 @@ class Slk extends BaseReader } } + /** @param mixed[] $rowData */ private function processFRecord(array $rowData, Spreadsheet &$spreadsheet, string &$row, string &$column): void { // Read cell formatting @@ -310,6 +316,7 @@ class Slk extends BaseReader $fontStyle = ''; $styleData = []; foreach ($rowData as $rowDatum) { + /** @var string $rowDatum */ switch ($rowDatum[0]) { case 'C': case 'X': @@ -335,6 +342,7 @@ class Slk extends BaseReader break; } } + /** @var string $formatStyle */ $this->addFormats($spreadsheet, $formatStyle, $row, $column); $this->addFonts($spreadsheet, $fontStyle, $row, $column); $this->addStyle($spreadsheet, $styleData, $row, $column); @@ -350,6 +358,7 @@ class Slk extends BaseReader 'T' => 'top', ]; + /** @param mixed[][] $styleData */ private function styleSettings(string $rowDatum, array &$styleData, string &$fontStyle): void { $styleSettings = substr($rowDatum, 1); @@ -359,7 +368,7 @@ class Slk extends BaseReader if (array_key_exists($char, self::STYLE_SETTINGS_FONT)) { $styleData['font'][self::STYLE_SETTINGS_FONT[$char]] = true; } elseif (array_key_exists($char, self::STYLE_SETTINGS_BORDER)) { - $styleData['borders'][self::STYLE_SETTINGS_BORDER[$char]]['borderStyle'] = Border::BORDER_THIN; + $styleData['borders'][self::STYLE_SETTINGS_BORDER[$char]]['borderStyle'] = Border::BORDER_THIN; //* @phpstan-ignore-line } elseif ($char == 'S') { $styleData['fill']['fillType'] = Fill::FILL_PATTERN_GRAY125; } elseif ($char == 'M') { @@ -374,7 +383,7 @@ class Slk extends BaseReader { if ($formatStyle && $column > '' && $row > '') { $columnLetter = Coordinate::stringFromColumnIndex((int) $column); - if (isset($this->formats[$formatStyle])) { + if (isset($this->formats[$formatStyle]) && is_array($this->formats[$formatStyle])) { $spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->formats[$formatStyle]); } } @@ -384,12 +393,13 @@ class Slk extends BaseReader { if ($fontStyle && $column > '' && $row > '') { $columnLetter = Coordinate::stringFromColumnIndex((int) $column); - if (isset($this->fonts[$fontStyle])) { + if (isset($this->fonts[$fontStyle]) && is_array($this->fonts[$fontStyle])) { $spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->fonts[$fontStyle]); } } } + /** @param mixed[] $styleData */ private function addStyle(Spreadsheet &$spreadsheet, array $styleData, string $row, string $column): void { if ((!empty($styleData)) && $column > '' && $row > '') { @@ -409,13 +419,14 @@ class Slk extends BaseReader $endCol = Coordinate::stringFromColumnIndex((int) $endCol); $spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth((float) $columnWidth); do { - // ++$startCol below tricks Phpstan into thinking it's float/int + /** @var string $startCol */ $spreadsheet->getActiveSheet()->getColumnDimension((string) ++$startCol)->setWidth((float) $columnWidth); - } while ($startCol !== $endCol); // @phpstan-ignore-line + } while ($startCol !== $endCol); } } } + /** @param string[] $rowData */ private function processPRecord(array $rowData, Spreadsheet &$spreadsheet): void { // Read shared styles @@ -438,6 +449,7 @@ class Slk extends BaseReader break; case 'L': + /** @var mixed[][][] $formatArray */ $this->processPColors($rowDatum, $formatArray); break; @@ -450,6 +462,7 @@ class Slk extends BaseReader $this->processPFinal($spreadsheet, $formatArray); } + /** @param mixed[][][] $formatArray */ private function processPColors(string $rowDatum, array &$formatArray): void { if (preg_match('/L([1-9]\d*)/', $rowDatum, $matches)) { @@ -458,6 +471,7 @@ class Slk extends BaseReader } } + /** @param mixed[][] $formatArray */ private function processPFontStyles(string $rowDatum, array &$formatArray): void { $styleSettings = substr($rowDatum, 1); @@ -469,6 +483,7 @@ class Slk extends BaseReader } } + /** @param mixed[] $formatArray */ private function processPFinal(Spreadsheet &$spreadsheet, array $formatArray): void { if (array_key_exists('numberFormat', $formatArray)) { @@ -534,6 +549,7 @@ class Slk extends BaseReader return $spreadsheet; } + /** @param string[] $rowData */ private function columnRowFromRowData(array $rowData, string &$column, string &$row): void { foreach ($rowData as $rowDatum) { diff --git a/src/PhpSpreadsheet/Reader/Xml.php b/src/PhpSpreadsheet/Reader/Xml.php index 95715a632..9c2cf205f 100644 --- a/src/PhpSpreadsheet/Reader/Xml.php +++ b/src/PhpSpreadsheet/Reader/Xml.php @@ -32,6 +32,8 @@ class Xml extends BaseReader /** * Formats. + * + * @var mixed[] */ protected array $styles = []; @@ -60,6 +62,7 @@ class Xml extends BaseReader private string $xmlFailMessage = ''; + /** @return mixed[] */ public static function xmlMappings(): array { return array_merge( @@ -145,6 +148,8 @@ class Xml extends BaseReader /** * Reads names of the worksheets from a file, without parsing the whole file to a Spreadsheet object. + * + * @return string[] */ public function listWorksheetNames(string $filename): array { @@ -294,7 +299,7 @@ class Xml extends BaseReader (new Properties($spreadsheet))->readProperties($xml, $namespaces); $this->styles = (new Style())->parseStyles($xml, $namespaces); - if (isset($this->styles['Default'])) { + if (isset($this->styles['Default']) && is_array($this->styles['Default'])) { $spreadsheet->getCellXfCollection()[0]->applyFromArray($this->styles['Default']); } @@ -366,6 +371,7 @@ class Xml extends BaseReader $columnVisible = ((string) $columnData_ss['Hidden']) !== '1'; } while ($colspan >= 0) { + /** @var string $columnID */ if (isset($columnWidth)) { $spreadsheet->getActiveSheet()->getColumnDimension($columnID)->setWidth($columnWidth / 5.4); } @@ -514,11 +520,12 @@ class Xml extends BaseReader if (isset($cell_ss['StyleID'])) { $style = (string) $cell_ss['StyleID']; - if ((isset($this->styles[$style])) && (!empty($this->styles[$style]))) { + if ((isset($this->styles[$style])) && is_array($this->styles[$style]) && (!empty($this->styles[$style]))) { $spreadsheet->getActiveSheet()->getStyle($cellRange) ->applyFromArray($this->styles[$style]); } } + /** @var string $columnID */ ++$columnID; while ($additionalMergedCells > 0) { ++$columnID; diff --git a/src/PhpSpreadsheet/Reader/Xml/DataValidations.php b/src/PhpSpreadsheet/Reader/Xml/DataValidations.php index faa2fb2c2..74d7ec46a 100644 --- a/src/PhpSpreadsheet/Reader/Xml/DataValidations.php +++ b/src/PhpSpreadsheet/Reader/Xml/DataValidations.php @@ -30,6 +30,7 @@ class DataValidations private int $thisColumn = 0; + /** @param string[] $matches */ private function replaceR1C1(array $matches): string { return AddressHelper::convertToA1($matches[0], $this->thisRow, $this->thisColumn, false); diff --git a/src/PhpSpreadsheet/Reader/Xml/PageSettings.php b/src/PhpSpreadsheet/Reader/Xml/PageSettings.php index 8f9d4645d..e185db8e5 100644 --- a/src/PhpSpreadsheet/Reader/Xml/PageSettings.php +++ b/src/PhpSpreadsheet/Reader/Xml/PageSettings.php @@ -10,12 +10,16 @@ use stdClass; class PageSettings { + /** @var (object{orientation: string, scale: ?int, printOrder: string|null, + * paperSize: int, + * horizontalCentered: bool, verticalCentered: bool, leftMargin: float, rightMargin: float, topMargin: float, + * bottomMargin: float, headerMargin: float, footerMargin: float}&stdClass) */ private stdClass $printSettings; public function __construct(SimpleXMLElement $xmlX) { $printSettings = $this->pageSetup($xmlX, $this->getPrintDefaults()); - $this->printSettings = $this->printSetup($xmlX, $printSettings); + $this->printSettings = $this->printSetup($xmlX, $printSettings); //* @phpstan-ignore-line } public function loadPageSettings(Spreadsheet $spreadsheet): void diff --git a/src/PhpSpreadsheet/Reader/Xml/Properties.php b/src/PhpSpreadsheet/Reader/Xml/Properties.php index 17e112130..83116baec 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Properties.php +++ b/src/PhpSpreadsheet/Reader/Xml/Properties.php @@ -15,6 +15,7 @@ class Properties $this->spreadsheet = $spreadsheet; } + /** @param string[] $namespaces */ public function readProperties(SimpleXMLElement $xml, array $namespaces): void { $this->readStandardProperties($xml); @@ -34,6 +35,7 @@ class Properties } } + /** @param string[] $namespaces */ protected function readCustomProperties(SimpleXMLElement $xml, array $namespaces): void { if (isset($xml->CustomDocumentProperties) && is_iterable($xml->CustomDocumentProperties[0])) { @@ -143,6 +145,7 @@ class Properties $docProps->setCustomProperty($propertyName, $propertyValue, $propertyType); } + /** @param string[] $hex */ protected function hex2str(array $hex): string { return mb_chr((int) hexdec($hex[1]), 'UTF-8'); diff --git a/src/PhpSpreadsheet/Reader/Xml/Style.php b/src/PhpSpreadsheet/Reader/Xml/Style.php index c6b514944..faf706165 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style.php @@ -9,9 +9,16 @@ class Style { /** * Formats. + * + * @var mixed[] */ protected array $styles = []; + /** + * @param string[] $namespaces + * + * @return mixed[] + */ public function parseStyles(SimpleXMLElement $xml, array $namespaces): array { $children = $xml->children('urn:schemas-microsoft-com:office:spreadsheet'); @@ -27,6 +34,7 @@ class Style $numberFormatStyleParser = new Style\NumberFormat(); foreach ($stylesXml as $style) { + /** @var SimpleXMLElement $style */ $style_ss = self::getAttributes($style, $namespaces['ss']); $styleID = (string) $style_ss['ID']; $this->styles[$styleID] = $this->styles['Default'] ?? []; diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/Alignment.php b/src/PhpSpreadsheet/Reader/Xml/Style/Alignment.php index 7bbda1348..657decfff 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/Alignment.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/Alignment.php @@ -23,6 +23,7 @@ class Alignment extends StyleBase AlignmentStyles::HORIZONTAL_JUSTIFY, ]; + /** @return mixed[] */ public function parseStyle(SimpleXMLElement $styleAttributes): array { $style = []; diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/Border.php b/src/PhpSpreadsheet/Reader/Xml/Style/Border.php index dfde17ae3..349eaab60 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/Border.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/Border.php @@ -15,9 +15,6 @@ class Border extends StyleBase 'right', ]; - /** - * @var array - */ public const BORDER_MAPPINGS = [ 'borderStyle' => [ 'continuous' => BorderStyle::BORDER_HAIR, @@ -53,6 +50,11 @@ class Border extends StyleBase ], ]; + /** + * @param string[] $namespaces + * + * @return mixed[] + */ public function parseStyle(SimpleXMLElement $styleData, array $namespaces): array { $style = []; @@ -70,6 +72,7 @@ class Border extends StyleBase $borderStyleValue = (string) $borderStyleValuex; switch ($borderStyleKey) { case 'Position': + /** @var string $diagonalDirection */ [$borderPosition, $diagonalDirection] = $this->parsePosition($borderStyleValue, $diagonalDirection); @@ -93,6 +96,7 @@ class Border extends StyleBase return $style; } + /** @return mixed[] */ protected function parsePosition(string $borderStyleValue, string $diagonalDirection): array { $borderStyleValue = strtolower($borderStyleValue); diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/Fill.php b/src/PhpSpreadsheet/Reader/Xml/Style/Fill.php index 9a6121525..8dc723205 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/Fill.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/Fill.php @@ -7,9 +7,6 @@ use SimpleXMLElement; class Fill extends StyleBase { - /** - * @var array - */ public const FILL_MAPPINGS = [ 'fillType' => [ 'solid' => FillStyles::FILL_SOLID, @@ -33,6 +30,7 @@ class Fill extends StyleBase ], ]; + /** @return mixed[] */ public function parseStyle(SimpleXMLElement $styleAttributes): array { $style = []; diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/Font.php b/src/PhpSpreadsheet/Reader/Xml/Style/Font.php index 5f824889a..4a5243a68 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/Font.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/Font.php @@ -15,6 +15,11 @@ class Font extends StyleBase FontUnderline::UNDERLINE_SINGLEACCOUNTING, ]; + /** + * @param mixed[][] $style + * + * @return mixed[][] + */ protected function parseUnderline(array $style, string $styleAttributeValue): array { if (self::identifyFixedStyleValue(self::UNDERLINE_STYLES, $styleAttributeValue)) { @@ -24,6 +29,11 @@ class Font extends StyleBase return $style; } + /** + * @param mixed[][] $style + * + * @return mixed[][] + */ protected function parseVerticalAlign(array $style, string $styleAttributeValue): array { if ($styleAttributeValue == 'Superscript') { @@ -36,6 +46,7 @@ class Font extends StyleBase return $style; } + /** @return mixed[] */ public function parseStyle(SimpleXMLElement $styleAttributes): array { $style = []; @@ -52,6 +63,7 @@ class Font extends StyleBase break; case 'Color': + /** @var string[][][] $style */ $style['font']['color']['rgb'] = substr($styleAttributeValue, 1); break; diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php b/src/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php index a31aa9ebd..e6fffe176 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php @@ -6,6 +6,7 @@ use SimpleXMLElement; class NumberFormat extends StyleBase { + /** @return mixed[] */ public function parseStyle(SimpleXMLElement $styleAttributes): array { $style = []; diff --git a/src/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php b/src/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php index 8103a71cb..4217caedd 100644 --- a/src/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php +++ b/src/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php @@ -6,6 +6,7 @@ use SimpleXMLElement; abstract class StyleBase { + /** @param string[] $styleList */ protected static function identifyFixedStyleValue(array $styleList, string &$styleAttributeValue): bool { $returnValue = false; diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormula2Test.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormula2Test.php index bf45461c8..fe5244fe1 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormula2Test.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormula2Test.php @@ -5,11 +5,13 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Gnumeric; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Reader\Gnumeric; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; class ArrayFormula2Test extends TestCase { - #[\PHPUnit\Framework\Attributes\DataProvider('arrayFormulaReaderProvider')] + /** @param mixed[] $expectedValue */ + #[DataProvider('arrayFormulaReaderProvider')] public function testArrayFormulaReader( string $cellAddress, string $expectedRange, diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormulaTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormulaTest.php index 2943ebead..20ad850df 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormulaTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/ArrayFormulaTest.php @@ -5,11 +5,13 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Gnumeric; use PhpOffice\PhpSpreadsheet\Calculation\Calculation; use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Reader\Gnumeric; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; class ArrayFormulaTest extends TestCase { - #[\PHPUnit\Framework\Attributes\DataProvider('arrayFormulaReaderProvider')] + /** @param float|mixed[] $expectedValue */ + #[DataProvider('arrayFormulaReaderProvider')] public function testArrayFormulaReader( string $cellAddress, string $expectedRange, diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericStylesTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericStylesTest.php index dfb046f51..429a2ee86 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericStylesTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericStylesTest.php @@ -10,14 +10,16 @@ use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; use PhpOffice\PhpSpreadsheet\Style\Font; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; class GnumericStylesTest extends TestCase { - #[\PHPUnit\Framework\Attributes\DataProvider('providerBorderStyle')] + #[DataProvider('providerBorderStyle')] public function testBorderStyle(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var string[] */ $borders = $styles['borderStyle']; self::assertEquals($expectedResult, $borders[$style]); } @@ -25,11 +27,13 @@ class GnumericStylesTest extends TestCase public function testBorderStyleCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['borderStyle']; $covered = []; foreach ($expected as $key => $val) { $covered[$key] = 0; } + /** @var mixed[][] */ $tests = $this->providerBorderStyle(); foreach ($tests as $test) { $covered[$test[0]] = 1; @@ -39,10 +43,11 @@ class GnumericStylesTest extends TestCase } } - #[\PHPUnit\Framework\Attributes\DataProvider('providerfillType')] + #[DataProvider('providerfillType')] public function testFillType(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var string[] */ $borders = $styles['fillType']; self::assertEquals($expectedResult, $borders[$style]); } @@ -50,6 +55,7 @@ class GnumericStylesTest extends TestCase public function testFillTypeCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['fillType']; $covered = []; foreach ($expected as $key => $val) { @@ -64,10 +70,11 @@ class GnumericStylesTest extends TestCase } } - #[\PHPUnit\Framework\Attributes\DataProvider('providerHorizontal')] + #[DataProvider('providerHorizontal')] public function testHorizontal(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var string[] */ $borders = $styles['horizontal']; self::assertEquals($expectedResult, $borders[$style]); } @@ -75,11 +82,13 @@ class GnumericStylesTest extends TestCase public function testHorizontalCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['horizontal']; $covered = []; foreach ($expected as $key => $val) { $covered[$key] = 0; } + /** @var mixed[][] */ $tests = $this->providerHorizontal(); foreach ($tests as $test) { $covered[$test[0]] = 1; @@ -89,10 +98,11 @@ class GnumericStylesTest extends TestCase } } - #[\PHPUnit\Framework\Attributes\DataProvider('providerunderline')] + #[DataProvider('providerunderline')] public function testUnderline(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var string[] */ $borders = $styles['underline']; self::assertEquals($expectedResult, $borders[$style]); } @@ -100,11 +110,14 @@ class GnumericStylesTest extends TestCase public function testUnderlineCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['underline']; + /** @var int[] $covered */ $covered = []; foreach ($expected as $key => $val) { $covered[$key] = 0; } + /** @var mixed[][] */ $tests = $this->providerUnderline(); foreach ($tests as $test) { $covered[$test[0]] = 1; @@ -114,10 +127,11 @@ class GnumericStylesTest extends TestCase } } - #[\PHPUnit\Framework\Attributes\DataProvider('providerVertical')] + #[DataProvider('providerVertical')] public function testVertical(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $borders = $styles['vertical']; self::assertEquals($expectedResult, $borders[$style]); } @@ -125,11 +139,13 @@ class GnumericStylesTest extends TestCase public function testVerticalCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['vertical']; $covered = []; foreach ($expected as $key => $val) { $covered[$key] = 0; } + /** @var int[][] */ $tests = $this->providerVertical(); foreach ($tests as $test) { $covered[$test[0]] = 1; @@ -139,10 +155,11 @@ class GnumericStylesTest extends TestCase } } - #[\PHPUnit\Framework\Attributes\DataProvider('providerDataType')] + #[DataProvider('providerDataType')] public function testDataType(string $style, string $expectedResult): void { $styles = Gnumeric::gnumericMappings(); + /** @var string[] */ $borders = $styles['dataType']; self::assertEquals($expectedResult, $borders[$style]); } @@ -150,6 +167,7 @@ class GnumericStylesTest extends TestCase public function testDataTypeCoverage(): void { $styles = Gnumeric::gnumericMappings(); + /** @var mixed[] */ $expected = $styles['dataType']; self::assertArrayNotHasKey('70', $expected); self::assertArrayNotHasKey('80', $expected); @@ -157,6 +175,7 @@ class GnumericStylesTest extends TestCase foreach ($expected as $key => $val) { $covered[$key] = 0; } + /** @var int[][] */ $tests = $this->providerDataType(); foreach ($tests as $test) { $covered[$test[0]] = 1; @@ -186,6 +205,7 @@ class GnumericStylesTest extends TestCase ]; } + /** @return string[][] */ public static function providerFillType(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php index 92459adce..b6fceb550 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/HiddenWorksheetTest.php @@ -38,6 +38,7 @@ class HiddenWorksheetTest extends TestCase $spreadsheet->disconnectWorksheets(); } + /** @return array */ private function worksheetAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/PageSetupTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/PageSetupTest.php index 80002f3c7..d3da858e4 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/PageSetupTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/PageSetupTest.php @@ -79,6 +79,7 @@ class PageSetupTest extends TestCase $spreadsheet->disconnectWorksheets(); } + /** @return array */ private function pageSetupAssertions(): array { return [ @@ -114,6 +115,7 @@ class PageSetupTest extends TestCase ]; } + /** @return array */ private function pageMarginAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/ArrayFormulaTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/ArrayFormulaTest.php index ab8748540..d6542ac6b 100644 --- a/tests/PhpSpreadsheetTests/Reader/Ods/ArrayFormulaTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/ArrayFormulaTest.php @@ -10,6 +10,7 @@ use PHPUnit\Framework\TestCase; class ArrayFormulaTest extends TestCase { + /** @param float|mixed[] $expectedValue */ #[DataProvider('arrayFormulaReaderProvider')] public function testArrayFormulaReader( string $cellAddress, diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php index 988947f0e..b52f73520 100644 --- a/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/HiddenWorksheetTest.php @@ -38,6 +38,7 @@ class HiddenWorksheetTest extends TestCase $spreadsheet->disconnectWorksheets(); } + /** @return array> */ private function worksheetAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupBug1772Test.php b/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupBug1772Test.php index 568bb602c..7e90eea6d 100644 --- a/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupBug1772Test.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupBug1772Test.php @@ -71,6 +71,7 @@ class PageSetupBug1772Test extends TestCase $spreadsheet->disconnectWorksheets(); } + /** @return array> */ private function pageSetupAssertions(): array { return [ @@ -84,6 +85,7 @@ class PageSetupBug1772Test extends TestCase ]; } + /** @return array> */ private function pageMarginAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupTest.php index 227a11c6e..e8e0b59d7 100644 --- a/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Ods/PageSetupTest.php @@ -73,6 +73,7 @@ class PageSetupTest extends TestCase $spreadsheet->disconnectWorksheets(); } + /** @return array> */ private function pageSetupAssertions(): array { return [ @@ -108,6 +109,7 @@ class PageSetupTest extends TestCase ]; } + /** @return array> */ private function pageMarginAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Xml/DataValidationsTest.php b/tests/PhpSpreadsheetTests/Reader/Xml/DataValidationsTest.php index 8bbba22d0..5b4d9f17e 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xml/DataValidationsTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xml/DataValidationsTest.php @@ -99,6 +99,7 @@ class DataValidationsTest extends AbstractFunctional $spreadsheet->disconnectWorksheets(); } + /** @return array */ private function validationAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Xml/PageSetupTest.php b/tests/PhpSpreadsheetTests/Reader/Xml/PageSetupTest.php index 63e64709f..f0c4dd71f 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xml/PageSetupTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xml/PageSetupTest.php @@ -82,6 +82,7 @@ class PageSetupTest extends TestCase self::assertCount($sheetCount, $assertions); } + /** @return array */ private function pageSetupAssertions(): array { return [ @@ -117,6 +118,7 @@ class PageSetupTest extends TestCase ]; } + /** @return array */ private function pageMarginAssertions(): array { return [ diff --git a/tests/PhpSpreadsheetTests/Reader/Xml/XmlStyleCoverageTest.php b/tests/PhpSpreadsheetTests/Reader/Xml/XmlStyleCoverageTest.php index 1aa95cfd1..9ddfc8fa2 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xml/XmlStyleCoverageTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xml/XmlStyleCoverageTest.php @@ -15,6 +15,7 @@ class XmlStyleCoverageTest extends TestCase public function testBorderStyle(string $style, string $expectedResult): void { $styles = Xml::XmlMappings(); + /** @var string[] */ $borders = $styles['borderStyle']; self::assertEquals($expectedResult, $borders[$style]); } @@ -22,6 +23,7 @@ class XmlStyleCoverageTest extends TestCase public function testBorderStyleCoverage(): void { $styles = Xml::XmlMappings(); + /** @var mixed[] */ $expected = $styles['borderStyle']; $covered = []; foreach ($expected as $key => $val) { @@ -29,6 +31,7 @@ class XmlStyleCoverageTest extends TestCase } $tests = $this->providerBorderStyle(); foreach ($tests as $test) { + /** @var string[] $test */ $covered[$test[0]] = 1; } foreach ($covered as $key => $val) { @@ -40,6 +43,7 @@ class XmlStyleCoverageTest extends TestCase public function testFillType(string $style, string $expectedResult): void { $styles = Xml::xmlMappings(); + /** @var string[] */ $borders = $styles['fillType']; self::assertEquals($expectedResult, $borders[$style]); } @@ -47,6 +51,7 @@ class XmlStyleCoverageTest extends TestCase public function testFillTypeCoverage(): void { $styles = Xml::XmlMappings(); + /** @var string[] */ $expected = $styles['fillType']; $covered = []; foreach ($expected as $key => $val) { @@ -54,6 +59,7 @@ class XmlStyleCoverageTest extends TestCase } $tests = $this->providerfillType(); foreach ($tests as $test) { + /** @var string[] $test */ $covered[$test[0]] = 1; } foreach ($covered as $key => $val) {