Merge branch 'master' into dx-more-helpful-exception-message
This commit is contained in:
55 files changed
+255
-209
No files matched your search
@@ -66,7 +66,7 @@ class Style
|
||||
/** @var bool Whether the wrap text property was set */
|
||||
private $hasSetWrapText = false;
|
||||
|
||||
/** @var Border */
|
||||
/** @var Border|null */
|
||||
private $border;
|
||||
|
||||
/** @var bool Whether border properties should be applied */
|
||||
@@ -78,7 +78,7 @@ class Style
|
||||
/** @var bool */
|
||||
private $hasSetBackgroundColor = false;
|
||||
|
||||
/** @var string Format */
|
||||
/** @var string|null Format */
|
||||
private $format;
|
||||
|
||||
/** @var bool */
|
||||
@@ -110,7 +110,7 @@ class Style
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Border
|
||||
* @return Border|null
|
||||
*/
|
||||
public function getBorder()
|
||||
{
|
||||
@@ -467,7 +467,7 @@ class Style
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @return string|null
|
||||
*/
|
||||
public function getFormat()
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace Box\Spout\Common\Helper;
|
||||
class CellTypeHelper
|
||||
{
|
||||
/**
|
||||
* @param $value
|
||||
* @param mixed|null $value
|
||||
* @return bool Whether the given value is considered "empty"
|
||||
*/
|
||||
public static function isEmpty($value)
|
||||
@@ -18,7 +18,7 @@ class CellTypeHelper
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $value
|
||||
* @param mixed $value
|
||||
* @return bool Whether the given value is a non empty string
|
||||
*/
|
||||
public static function isNonEmptyString($value)
|
||||
@@ -30,7 +30,7 @@ class CellTypeHelper
|
||||
* Returns whether the given value is numeric.
|
||||
* A numeric value is from type "integer" or "double" ("float" is not returned by gettype).
|
||||
*
|
||||
* @param $value
|
||||
* @param mixed $value
|
||||
* @return bool Whether the given value is numeric
|
||||
*/
|
||||
public static function isNumeric($value)
|
||||
@@ -44,7 +44,7 @@ class CellTypeHelper
|
||||
* Returns whether the given value is boolean.
|
||||
* "true"/"false" and 0/1 are not booleans.
|
||||
*
|
||||
* @param $value
|
||||
* @param mixed $value
|
||||
* @return bool Whether the given value is boolean
|
||||
*/
|
||||
public static function isBoolean($value)
|
||||
@@ -55,13 +55,13 @@ class CellTypeHelper
|
||||
/**
|
||||
* Returns whether the given value is a DateTime or DateInterval object.
|
||||
*
|
||||
* @param $value
|
||||
* @param mixed $value
|
||||
* @return bool Whether the given value is a DateTime or DateInterval object
|
||||
*/
|
||||
public static function isDateTimeOrDateInterval($value)
|
||||
{
|
||||
return (
|
||||
$value instanceof \DateTime ||
|
||||
$value instanceof \DateTimeInterface ||
|
||||
$value instanceof \DateInterval
|
||||
);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ class GlobalFunctionsHelper
|
||||
* @param int|null $length
|
||||
* @param string|null $delimiter
|
||||
* @param string|null $enclosure
|
||||
* @return array
|
||||
* @return array|false
|
||||
*/
|
||||
public function fgetcsv($handle, $length = null, $delimiter = null, $enclosure = null)
|
||||
{
|
||||
@@ -103,7 +103,7 @@ class GlobalFunctionsHelper
|
||||
* @param array $fields
|
||||
* @param string|null $delimiter
|
||||
* @param string|null $enclosure
|
||||
* @return int
|
||||
* @return int|false
|
||||
*/
|
||||
public function fputcsv($handle, array $fields, $delimiter = null, $enclosure = null)
|
||||
{
|
||||
@@ -243,10 +243,10 @@ class GlobalFunctionsHelper
|
||||
* @see basename()
|
||||
*
|
||||
* @param string $path
|
||||
* @param string|null $suffix
|
||||
* @param string $suffix
|
||||
* @return string
|
||||
*/
|
||||
public function basename($path, $suffix = null)
|
||||
public function basename($path, $suffix = '')
|
||||
{
|
||||
return \basename($path, $suffix);
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ class StringHelper
|
||||
* @see https://wiki.php.net/rfc/locale_independent_float_to_string for the changed behavior in PHP8.
|
||||
*
|
||||
* @param int|float $numericValue
|
||||
* @return string
|
||||
* @return int|float|string
|
||||
*/
|
||||
public function formatNumericValue($numericValue)
|
||||
{
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
namespace Box\Spout\Reader\CSV;
|
||||
|
||||
use Box\Spout\Common\Exception\IOException;
|
||||
use Box\Spout\Common\Helper\GlobalFunctionsHelper;
|
||||
use Box\Spout\Common\Manager\OptionsManagerInterface;
|
||||
use Box\Spout\Reader\Common\Creator\InternalEntityFactoryInterface;
|
||||
use Box\Spout\Reader\Common\Entity\Options;
|
||||
use Box\Spout\Reader\CSV\Creator\InternalEntityFactory;
|
||||
use Box\Spout\Reader\ReaderAbstract;
|
||||
@@ -22,6 +25,23 @@ class Reader extends ReaderAbstract
|
||||
/** @var string Original value for the "auto_detect_line_endings" INI value */
|
||||
protected $originalAutoDetectLineEndings;
|
||||
|
||||
/** @var bool Whether the code is running with PHP >= 8.1 */
|
||||
private $isRunningAtLeastPhp81;
|
||||
|
||||
/**
|
||||
* @param OptionsManagerInterface $optionsManager
|
||||
* @param GlobalFunctionsHelper $globalFunctionsHelper
|
||||
* @param InternalEntityFactoryInterface $entityFactory
|
||||
*/
|
||||
public function __construct(
|
||||
OptionsManagerInterface $optionsManager,
|
||||
GlobalFunctionsHelper $globalFunctionsHelper,
|
||||
InternalEntityFactoryInterface $entityFactory
|
||||
) {
|
||||
parent::__construct($optionsManager, $globalFunctionsHelper, $entityFactory);
|
||||
$this->isRunningAtLeastPhp81 = \version_compare(PHP_VERSION, '8.1.0') >= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the field delimiter for the CSV.
|
||||
* Needs to be called before opening the reader.
|
||||
@@ -84,8 +104,11 @@ class Reader extends ReaderAbstract
|
||||
*/
|
||||
protected function openReader($filePath)
|
||||
{
|
||||
$this->originalAutoDetectLineEndings = \ini_get('auto_detect_line_endings');
|
||||
\ini_set('auto_detect_line_endings', '1');
|
||||
// "auto_detect_line_endings" is deprecated in PHP 8.1
|
||||
if (!$this->isRunningAtLeastPhp81) {
|
||||
$this->originalAutoDetectLineEndings = \ini_get('auto_detect_line_endings');
|
||||
\ini_set('auto_detect_line_endings', '1');
|
||||
}
|
||||
|
||||
$this->filePointer = $this->globalFunctionsHelper->fopen($filePath, 'r');
|
||||
if (!$this->filePointer) {
|
||||
@@ -119,10 +142,13 @@ class Reader extends ReaderAbstract
|
||||
*/
|
||||
protected function closeReader()
|
||||
{
|
||||
if ($this->filePointer) {
|
||||
if (is_resource($this->filePointer)) {
|
||||
$this->globalFunctionsHelper->fclose($this->filePointer);
|
||||
}
|
||||
|
||||
\ini_set('auto_detect_line_endings', $this->originalAutoDetectLineEndings);
|
||||
// "auto_detect_line_endings" is deprecated in PHP 8.1
|
||||
if (!$this->isRunningAtLeastPhp81) {
|
||||
\ini_set('auto_detect_line_endings', $this->originalAutoDetectLineEndings);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ class RowIterator implements IteratorInterface
|
||||
*/
|
||||
public const MAX_READ_BYTES_PER_LINE = 0;
|
||||
|
||||
/** @var resource Pointer to the CSV file to read */
|
||||
/** @var resource|null Pointer to the CSV file to read */
|
||||
protected $filePointer;
|
||||
|
||||
/** @var int Number of read rows */
|
||||
@@ -84,7 +84,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
public function rewind() : void
|
||||
{
|
||||
$this->rewindAndSkipBom();
|
||||
|
||||
@@ -114,7 +114,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
public function valid() : bool
|
||||
{
|
||||
return ($this->filePointer && !$this->hasReachedEndOfFile);
|
||||
}
|
||||
@@ -126,7 +126,7 @@ class RowIterator implements IteratorInterface
|
||||
* @throws \Box\Spout\Common\Exception\EncodingConversionException If unable to convert data to UTF-8
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
public function next() : void
|
||||
{
|
||||
$this->hasReachedEndOfFile = $this->globalFunctionsHelper->feof($this->filePointer);
|
||||
|
||||
@@ -146,8 +146,8 @@ class RowIterator implements IteratorInterface
|
||||
} while ($this->shouldReadNextRow($rowData));
|
||||
|
||||
if ($rowData !== false) {
|
||||
// str_replace will replace NULL values by empty strings
|
||||
$rowDataBufferAsArray = \str_replace(null, null, $rowData);
|
||||
// array_map will replace NULL values by empty strings
|
||||
$rowDataBufferAsArray = array_map(function ($value) { return (string) $value; }, $rowData);
|
||||
$this->rowBuffer = $this->entityFactory->createRowFromArray($rowDataBufferAsArray);
|
||||
$this->numReadRows++;
|
||||
} else {
|
||||
@@ -224,7 +224,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return Row|null
|
||||
*/
|
||||
public function current()
|
||||
public function current() : ?Row
|
||||
{
|
||||
return $this->rowBuffer;
|
||||
}
|
||||
@@ -235,7 +235,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function key()
|
||||
public function key() : int
|
||||
{
|
||||
return $this->numReadRows;
|
||||
}
|
||||
@@ -245,7 +245,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function end()
|
||||
public function end() : void
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ use Box\Spout\Reader\IteratorInterface;
|
||||
*/
|
||||
class SheetIterator implements IteratorInterface
|
||||
{
|
||||
/** @var \Box\Spout\Reader\CSV\Sheet The CSV unique "sheet" */
|
||||
/** @var Sheet The CSV unique "sheet" */
|
||||
protected $sheet;
|
||||
|
||||
/** @var bool Whether the unique "sheet" has already been read */
|
||||
@@ -30,7 +30,7 @@ class SheetIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
public function rewind() : void
|
||||
{
|
||||
$this->hasReadUniqueSheet = false;
|
||||
}
|
||||
@@ -41,7 +41,7 @@ class SheetIterator implements IteratorInterface
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
public function valid() : bool
|
||||
{
|
||||
return (!$this->hasReadUniqueSheet);
|
||||
}
|
||||
@@ -52,7 +52,7 @@ class SheetIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
public function next() : void
|
||||
{
|
||||
$this->hasReadUniqueSheet = true;
|
||||
}
|
||||
@@ -61,9 +61,9 @@ class SheetIterator implements IteratorInterface
|
||||
* Return the current element
|
||||
* @see http://php.net/manual/en/iterator.current.php
|
||||
*
|
||||
* @return \Box\Spout\Reader\CSV\Sheet
|
||||
* @return Sheet
|
||||
*/
|
||||
public function current()
|
||||
public function current() : Sheet
|
||||
{
|
||||
return $this->sheet;
|
||||
}
|
||||
@@ -74,7 +74,7 @@ class SheetIterator implements IteratorInterface
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function key()
|
||||
public function key() : int
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -84,7 +84,7 @@ class SheetIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function end()
|
||||
public function end() : void
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class ReaderFactory
|
||||
/**
|
||||
* This creates an instance of the appropriate reader, given the type of the file to be read
|
||||
*
|
||||
* @param string $readerType Type of the reader to instantiate
|
||||
* @param string $readerType Type of the reader to instantiate
|
||||
* @throws \Box\Spout\Common\Exception\UnsupportedTypeException
|
||||
* @return ReaderInterface
|
||||
*/
|
||||
|
||||
@@ -105,7 +105,7 @@ class InternalEntityFactory implements InternalEntityFactoryInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $xmlReader
|
||||
* @param XMLReader $xmlReader
|
||||
* @return XMLProcessor
|
||||
*/
|
||||
private function createXMLProcessor($xmlReader)
|
||||
|
||||
@@ -64,7 +64,7 @@ class CellValueFormatter
|
||||
* Returns the (unescaped) correctly marshalled, cell value associated to the given XML node.
|
||||
* @see http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#refTable13
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @throws InvalidValueException If the node value is not valid
|
||||
* @return string|int|float|bool|\DateTime|\DateInterval The value associated with the cell, empty string if cell's type is void/undefined
|
||||
*/
|
||||
@@ -96,7 +96,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell String value.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return string The value associated with the cell
|
||||
*/
|
||||
protected function formatStringCellValue($node)
|
||||
@@ -115,7 +115,7 @@ class CellValueFormatter
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $pNode
|
||||
* @param \DOMNode $pNode
|
||||
* @return string
|
||||
*/
|
||||
private function extractTextValueFromNode($pNode)
|
||||
@@ -159,7 +159,7 @@ class CellValueFormatter
|
||||
*
|
||||
* @see https://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#__RefHeading__1415200_253892949
|
||||
*
|
||||
* @param \DOMNode $node The XML node representing a whitespace
|
||||
* @param \DOMElement $node The XML node representing a whitespace
|
||||
* @return string The corresponding whitespace value
|
||||
*/
|
||||
private function transformWhitespaceNode($node)
|
||||
@@ -173,7 +173,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Numeric value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return int|float The value associated with the cell
|
||||
*/
|
||||
protected function formatFloatCellValue($node)
|
||||
@@ -190,7 +190,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Boolean value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return bool The value associated with the cell
|
||||
*/
|
||||
protected function formatBooleanCellValue($node)
|
||||
@@ -203,7 +203,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Date value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @throws InvalidValueException If the value is not a valid date
|
||||
* @return \DateTime|string The value associated with the cell
|
||||
*/
|
||||
@@ -234,7 +234,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Time value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @throws InvalidValueException If the value is not a valid time
|
||||
* @return \DateInterval|string The value associated with the cell
|
||||
*/
|
||||
@@ -265,7 +265,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Currency value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return string The value associated with the cell (e.g. "100 USD" or "9.99 EUR")
|
||||
*/
|
||||
protected function formatCurrencyCellValue($node)
|
||||
@@ -279,7 +279,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell Percentage value from the given node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return int|float The value associated with the cell
|
||||
*/
|
||||
protected function formatPercentageCellValue($node)
|
||||
|
||||
@@ -69,7 +69,7 @@ class Reader extends ReaderAbstract
|
||||
*/
|
||||
protected function closeReader()
|
||||
{
|
||||
if ($this->zip) {
|
||||
if ($this->zip !== null) {
|
||||
$this->zip->close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ class RowIterator implements IteratorInterface
|
||||
/** @var Row The currently processed row */
|
||||
protected $currentlyProcessedRow;
|
||||
|
||||
/** @var Row Buffer used to store the current row, while checking if there are more rows to read */
|
||||
/** @var Row|null Buffer used to store the current row, while checking if there are more rows to read */
|
||||
protected $rowBuffer;
|
||||
|
||||
/** @var bool Indicates whether all rows have been read */
|
||||
@@ -68,7 +68,7 @@ class RowIterator implements IteratorInterface
|
||||
/** @var int Row index to be processed next (one-based) */
|
||||
protected $nextRowIndexToBeProcessed = 1;
|
||||
|
||||
/** @var Cell Last processed cell (because when reading cell at column N+1, cell N is processed) */
|
||||
/** @var Cell|null Last processed cell (because when reading cell at column N+1, cell N is processed) */
|
||||
protected $lastProcessedCell;
|
||||
|
||||
/** @var int Number of times the last processed row should be repeated */
|
||||
@@ -118,7 +118,7 @@ class RowIterator implements IteratorInterface
|
||||
* @throws \Box\Spout\Reader\Exception\IteratorNotRewindableException If the iterator is rewound more than once
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
public function rewind() : void
|
||||
{
|
||||
// Because sheet and row data is located in the file, we can't rewind both the
|
||||
// sheet iterator and the row iterator, as XML file cannot be read backwards.
|
||||
@@ -142,7 +142,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
public function valid() : bool
|
||||
{
|
||||
return (!$this->hasReachedEndOfFile);
|
||||
}
|
||||
@@ -155,7 +155,7 @@ class RowIterator implements IteratorInterface
|
||||
* @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
public function next() : void
|
||||
{
|
||||
if ($this->doesNeedDataForNextRowToBeProcessed()) {
|
||||
$this->readDataForNextRow();
|
||||
@@ -225,6 +225,7 @@ class RowIterator implements IteratorInterface
|
||||
$currentNumColumnsRepeated = $this->getNumColumnsRepeatedForCurrentNode($xmlReader);
|
||||
|
||||
// NOTE: expand() will automatically decode all XML entities of the child nodes
|
||||
/** @var \DOMElement $node */
|
||||
$node = $xmlReader->expand();
|
||||
$currentCell = $this->getCell($node);
|
||||
|
||||
@@ -316,7 +317,7 @@ class RowIterator implements IteratorInterface
|
||||
/**
|
||||
* Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return Cell The cell set with the associated with the cell
|
||||
*/
|
||||
protected function getCell($node)
|
||||
@@ -339,7 +340,7 @@ class RowIterator implements IteratorInterface
|
||||
* row data yet (as we still need to apply the "num-columns-repeated" attribute).
|
||||
*
|
||||
* @param Row $currentRow
|
||||
* @param Cell $lastReadCell The last read cell
|
||||
* @param Cell|null $lastReadCell The last read cell
|
||||
* @return bool Whether the row is empty
|
||||
*/
|
||||
protected function isEmptyRow($currentRow, $lastReadCell)
|
||||
@@ -356,7 +357,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return Row
|
||||
*/
|
||||
public function current()
|
||||
public function current() : Row
|
||||
{
|
||||
return $this->rowBuffer;
|
||||
}
|
||||
@@ -367,7 +368,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function key()
|
||||
public function key() : int
|
||||
{
|
||||
return $this->lastRowIndexProcessed;
|
||||
}
|
||||
@@ -377,7 +378,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function end()
|
||||
public function end() : void
|
||||
{
|
||||
$this->xmlReader->close();
|
||||
}
|
||||
|
||||
@@ -108,6 +108,7 @@ class SheetIterator implements IteratorInterface
|
||||
$sheetsVisibility = [];
|
||||
|
||||
$this->xmlReader->readUntilNodeFound(self::XML_NODE_AUTOMATIC_STYLES);
|
||||
/** @var \DOMElement $automaticStylesNode */
|
||||
$automaticStylesNode = $this->xmlReader->expand();
|
||||
|
||||
$tableStyleNodes = $automaticStylesNode->getElementsByTagNameNS(self::XML_STYLE_NAMESPACE, self::XML_NODE_STYLE_TABLE_PROPERTIES);
|
||||
|
||||
@@ -53,7 +53,7 @@ abstract class ReaderAbstract implements ReaderInterface
|
||||
/**
|
||||
* Closes the reader. To be used after reading the file.
|
||||
*
|
||||
* @return ReaderAbstract
|
||||
* @return void
|
||||
*/
|
||||
abstract protected function closeReader();
|
||||
|
||||
@@ -233,7 +233,7 @@ abstract class ReaderAbstract implements ReaderInterface
|
||||
$this->closeReader();
|
||||
|
||||
$sheetIterator = $this->getConcreteSheetIterator();
|
||||
if ($sheetIterator) {
|
||||
if ($sheetIterator !== null) {
|
||||
$sheetIterator->end();
|
||||
}
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ class InternalEntityFactory implements InternalEntityFactoryInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $xmlReader
|
||||
* @param XMLReader $xmlReader
|
||||
* @return XMLProcessor
|
||||
*/
|
||||
public function createXMLProcessor($xmlReader)
|
||||
|
||||
@@ -21,7 +21,7 @@ class ManagerFactory
|
||||
/** @var CachingStrategyFactory */
|
||||
private $cachingStrategyFactory;
|
||||
|
||||
/** @var WorkbookRelationshipsManager */
|
||||
/** @var WorkbookRelationshipsManager|null */
|
||||
private $cachedWorkbookRelationshipsManager;
|
||||
|
||||
/**
|
||||
|
||||
@@ -66,7 +66,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the (unescaped) correctly marshalled, cell value associated to the given XML node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @throws InvalidValueException If the value is not valid
|
||||
* @return string|int|float|bool|\DateTime The value associated with the cell
|
||||
*/
|
||||
@@ -102,7 +102,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell's string value from a node's nested value node
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return string The value associated with the cell
|
||||
*/
|
||||
protected function getVNodeValue($node)
|
||||
@@ -117,7 +117,7 @@ class CellValueFormatter
|
||||
/**
|
||||
* Returns the cell String value where string is inline.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return string The value associated with the cell
|
||||
*/
|
||||
protected function formatInlineStringCellValue($node)
|
||||
|
||||
@@ -84,7 +84,7 @@ class CachingStrategyFactory
|
||||
|
||||
$memoryAvailable = $this->getMemoryLimitInKB();
|
||||
|
||||
if ($memoryAvailable === -1) {
|
||||
if ((int) $memoryAvailable === -1) {
|
||||
// if cannot get memory limit or if memory limit set as unlimited, don't trust and play safe
|
||||
$isInMemoryStrategyUsageSafe = ($sharedStringsUniqueCount < self::MAX_NUM_STRINGS_PER_TEMP_FILE);
|
||||
} else {
|
||||
|
||||
@@ -32,7 +32,7 @@ class FileBasedStrategy implements CachingStrategyInterface
|
||||
*/
|
||||
protected $maxNumStringsPerTempFile;
|
||||
|
||||
/** @var resource Pointer to the last temp file a shared string was written to */
|
||||
/** @var resource|null Pointer to the last temp file a shared string was written to */
|
||||
protected $tempFilePointer;
|
||||
|
||||
/**
|
||||
|
||||
@@ -179,6 +179,7 @@ class SharedStringsManager
|
||||
$sharedStringValue = '';
|
||||
|
||||
// NOTE: expand() will automatically decode all XML entities of the child nodes
|
||||
/** @var \DOMElement $siNode */
|
||||
$siNode = $xmlReader->expand();
|
||||
$textNodes = $siNode->getElementsByTagName(self::XML_NODE_T);
|
||||
|
||||
@@ -241,7 +242,7 @@ class SharedStringsManager
|
||||
*/
|
||||
public function cleanup()
|
||||
{
|
||||
if ($this->cachingStrategy) {
|
||||
if ($this->cachingStrategy !== null) {
|
||||
$this->cachingStrategy->clearCache();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,10 +60,10 @@ class StyleManager
|
||||
/** @var array Array containing the IDs of built-in number formats indicating a date */
|
||||
protected $builtinNumFmtIdIndicatingDates;
|
||||
|
||||
/** @var array Array containing a mapping NUM_FMT_ID => FORMAT_CODE */
|
||||
/** @var array|null Array containing a mapping NUM_FMT_ID => FORMAT_CODE */
|
||||
protected $customNumberFormats;
|
||||
|
||||
/** @var array Array containing a mapping STYLE_ID => [STYLE_ATTRIBUTES] */
|
||||
/** @var array|null Array containing a mapping STYLE_ID => [STYLE_ATTRIBUTES] */
|
||||
protected $stylesAttributes;
|
||||
|
||||
/** @var array Cache containing a mapping NUM_FMT_ID => IS_DATE_FORMAT. Used to avoid lots of recalculations */
|
||||
|
||||
@@ -34,7 +34,7 @@ class WorkbookRelationshipsManager
|
||||
/** @var InternalEntityFactory Factory to create entities */
|
||||
private $entityFactory;
|
||||
|
||||
/** @var array Cache of the already read workbook relationships: [TYPE] => [FILE_NAME] */
|
||||
/** @var array|null Cache of the already read workbook relationships: [TYPE] => [FILE_NAME] */
|
||||
private $cachedWorkbookRelationships;
|
||||
|
||||
/**
|
||||
|
||||
@@ -119,11 +119,11 @@ class Reader extends ReaderAbstract
|
||||
*/
|
||||
protected function closeReader()
|
||||
{
|
||||
if ($this->zip) {
|
||||
if ($this->zip !== null) {
|
||||
$this->zip->close();
|
||||
}
|
||||
|
||||
if ($this->sharedStringsManager) {
|
||||
if ($this->sharedStringsManager !== null) {
|
||||
$this->sharedStringsManager->cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ class RowIterator implements IteratorInterface
|
||||
* @throws \Box\Spout\Common\Exception\IOException If the sheet data XML cannot be read
|
||||
* @return void
|
||||
*/
|
||||
public function rewind()
|
||||
public function rewind() : void
|
||||
{
|
||||
$this->xmlReader->close();
|
||||
|
||||
@@ -163,7 +163,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function valid()
|
||||
public function valid() : bool
|
||||
{
|
||||
return (!$this->hasReachedEndOfFile);
|
||||
}
|
||||
@@ -176,7 +176,7 @@ class RowIterator implements IteratorInterface
|
||||
* @throws \Box\Spout\Common\Exception\IOException If unable to read the sheet data XML
|
||||
* @return void
|
||||
*/
|
||||
public function next()
|
||||
public function next() : void
|
||||
{
|
||||
$this->nextRowIndexToBeProcessed++;
|
||||
|
||||
@@ -276,6 +276,7 @@ class RowIterator implements IteratorInterface
|
||||
$currentColumnIndex = $this->getColumnIndex($xmlReader);
|
||||
|
||||
// NOTE: expand() will automatically decode all XML entities of the child nodes
|
||||
/** @var \DOMElement $node */
|
||||
$node = $xmlReader->expand();
|
||||
$cell = $this->getCell($node);
|
||||
|
||||
@@ -352,7 +353,7 @@ class RowIterator implements IteratorInterface
|
||||
/**
|
||||
* Returns the cell with (unescaped) correctly marshalled, cell value associated to the given XML node.
|
||||
*
|
||||
* @param \DOMNode $node
|
||||
* @param \DOMElement $node
|
||||
* @return Cell The cell set with the associated with the cell
|
||||
*/
|
||||
protected function getCell($node)
|
||||
@@ -374,7 +375,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return Row|null
|
||||
*/
|
||||
public function current()
|
||||
public function current() : ?Row
|
||||
{
|
||||
$rowToBeProcessed = $this->rowBuffer;
|
||||
|
||||
@@ -399,7 +400,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function key()
|
||||
public function key() : int
|
||||
{
|
||||
// TODO: This should return $this->nextRowIndexToBeProcessed
|
||||
// but to avoid a breaking change, the return value for
|
||||
@@ -414,7 +415,7 @@ class RowIterator implements IteratorInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function end()
|
||||
public function end() : void
|
||||
{
|
||||
$this->xmlReader->close();
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ class Worksheet
|
||||
/** @var string Path to the XML file that will contain the sheet data */
|
||||
private $filePath;
|
||||
|
||||
/** @var resource Pointer to the sheet data file (e.g. xl/worksheets/sheet1.xml) */
|
||||
/** @var resource|null Pointer to the sheet data file (e.g. xl/worksheets/sheet1.xml) */
|
||||
private $filePointer;
|
||||
|
||||
/** @var Sheet The "external" sheet */
|
||||
|
||||
@@ -88,10 +88,10 @@ class StyleMerger
|
||||
if (!$style->hasSetCellAlignment() && $baseStyle->shouldApplyCellAlignment()) {
|
||||
$styleToUpdate->setCellAlignment($baseStyle->getCellAlignment());
|
||||
}
|
||||
if (!$style->getBorder() && $baseStyle->shouldApplyBorder()) {
|
||||
if ($style->getBorder() === null && $baseStyle->shouldApplyBorder()) {
|
||||
$styleToUpdate->setBorder($baseStyle->getBorder());
|
||||
}
|
||||
if (!$style->getFormat() && $baseStyle->shouldApplyFormat()) {
|
||||
if ($style->getFormat() === null && $baseStyle->shouldApplyFormat()) {
|
||||
$styleToUpdate->setFormat($baseStyle->getFormat());
|
||||
}
|
||||
if (!$style->shouldApplyBackgroundColor() && $baseStyle->shouldApplyBackgroundColor()) {
|
||||
|
||||
@@ -23,7 +23,7 @@ use Box\Spout\Writer\Exception\WriterException;
|
||||
*/
|
||||
abstract class WorkbookManagerAbstract implements WorkbookManagerInterface
|
||||
{
|
||||
/** @var Workbook The workbook to manage */
|
||||
/** @var Workbook|null The workbook to manage */
|
||||
protected $workbook;
|
||||
|
||||
/** @var OptionsManagerInterface */
|
||||
@@ -92,7 +92,7 @@ abstract class WorkbookManagerAbstract implements WorkbookManagerInterface
|
||||
abstract protected function getWorksheetFilePath(Sheet $sheet);
|
||||
|
||||
/**
|
||||
* @return Workbook
|
||||
* @return Workbook|null
|
||||
*/
|
||||
public function getWorkbook()
|
||||
{
|
||||
|
||||
@@ -17,7 +17,7 @@ use Box\Spout\Writer\Exception\WriterException;
|
||||
interface WorkbookManagerInterface
|
||||
{
|
||||
/**
|
||||
* @return Workbook
|
||||
* @return Workbook|null
|
||||
*/
|
||||
public function getWorkbook();
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ class HelperFactory extends \Box\Spout\Common\Creator\HelperFactory
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $entityFactory
|
||||
* @param InternalEntityFactory $entityFactory
|
||||
* @return ZipHelper
|
||||
*/
|
||||
private function createZipHelper($entityFactory)
|
||||
|
||||
@@ -86,7 +86,7 @@ class WorksheetManager implements WorksheetManagerInterface
|
||||
* Returns the table XML root node as string.
|
||||
*
|
||||
* @param Worksheet $worksheet
|
||||
* @return string <table> node as string
|
||||
* @return string "<table>" node as string
|
||||
*/
|
||||
public function getTableElementStartAsString(Worksheet $worksheet)
|
||||
{
|
||||
|
||||
@@ -169,7 +169,7 @@ abstract class WriterAbstract implements WriterInterface
|
||||
*/
|
||||
protected function throwIfFilePointerIsNotAvailable()
|
||||
{
|
||||
if (!$this->filePointer) {
|
||||
if (!is_resource($this->filePointer)) {
|
||||
throw new IOException('File pointer has not be opened');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ use Box\Spout\Common\Manager\OptionsManagerInterface;
|
||||
use Box\Spout\Writer\Common\Creator\ManagerFactoryInterface;
|
||||
use Box\Spout\Writer\Common\Entity\Options;
|
||||
use Box\Spout\Writer\Common\Entity\Sheet;
|
||||
use Box\Spout\Writer\Common\Entity\Worksheet;
|
||||
use Box\Spout\Writer\Common\Manager\WorkbookManagerInterface;
|
||||
use Box\Spout\Writer\Exception\SheetNotFoundException;
|
||||
use Box\Spout\Writer\Exception\WriterAlreadyOpenedException;
|
||||
@@ -25,7 +24,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
|
||||
/** @var ManagerFactoryInterface */
|
||||
private $managerFactory;
|
||||
|
||||
/** @var WorkbookManagerInterface */
|
||||
/** @var WorkbookManagerInterface|null */
|
||||
private $workbookManager;
|
||||
|
||||
/**
|
||||
@@ -66,7 +65,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
|
||||
*/
|
||||
protected function openWriter()
|
||||
{
|
||||
if (!$this->workbookManager) {
|
||||
if ($this->workbookManager === null) {
|
||||
$this->workbookManager = $this->managerFactory->createWorkbookManager($this->optionsManager);
|
||||
$this->workbookManager->addNewSheetAndMakeItCurrent();
|
||||
}
|
||||
@@ -85,7 +84,6 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
|
||||
$externalSheets = [];
|
||||
$worksheets = $this->workbookManager->getWorksheets();
|
||||
|
||||
/** @var Worksheet $worksheet */
|
||||
foreach ($worksheets as $worksheet) {
|
||||
$externalSheets[] = $worksheet->getExternalSheet();
|
||||
}
|
||||
@@ -143,7 +141,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
|
||||
*/
|
||||
protected function throwIfWorkbookIsNotAvailable()
|
||||
{
|
||||
if (!$this->workbookManager->getWorkbook()) {
|
||||
if ($this->workbookManager->getWorkbook() === null) {
|
||||
throw new WriterNotOpenedException('The writer must be opened before performing this action.');
|
||||
}
|
||||
}
|
||||
@@ -162,7 +160,7 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract
|
||||
*/
|
||||
protected function closeWriter()
|
||||
{
|
||||
if ($this->workbookManager) {
|
||||
if ($this->workbookManager !== null) {
|
||||
$this->workbookManager->close($this->filePointer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,8 +91,7 @@ class ManagerFactory implements ManagerFactoryInterface
|
||||
$styleMerger,
|
||||
$sharedStringsManager,
|
||||
$stringsEscaper,
|
||||
$stringsHelper,
|
||||
$this->entityFactory
|
||||
$stringsHelper
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ EOD;
|
||||
*/
|
||||
protected function throwIfSharedStringsFilePointerIsNotAvailable()
|
||||
{
|
||||
if (!$this->sharedStringsFilePointer) {
|
||||
if (!is_resource($this->sharedStringsFilePointer)) {
|
||||
throw new IOException('Unable to open shared strings file for writing.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Box\Spout\Writer\XLSX\Manager\Style;
|
||||
|
||||
use Box\Spout\Common\Entity\Style\BorderPart;
|
||||
use Box\Spout\Common\Entity\Style\Color;
|
||||
use Box\Spout\Common\Entity\Style\Style;
|
||||
use Box\Spout\Writer\XLSX\Helper\BorderHelper;
|
||||
@@ -186,7 +187,7 @@ EOD;
|
||||
$content .= '<border><left/><right/><top/><bottom/></border>';
|
||||
|
||||
foreach ($registeredBorders as $styleId) {
|
||||
/** @var \Box\Spout\Common\Entity\Style\Style $style */
|
||||
/** @var Style $style */
|
||||
$style = $this->styleRegistry->getStyleFromStyleId($styleId);
|
||||
$border = $style->getBorder();
|
||||
$content .= '<border>';
|
||||
@@ -196,7 +197,7 @@ EOD;
|
||||
|
||||
foreach ($sortOrder as $partName) {
|
||||
if ($border->hasPart($partName)) {
|
||||
/** @var $part \Box\Spout\Common\Entity\Style\BorderPart */
|
||||
/** @var BorderPart $part */
|
||||
$part = $border->getPart($partName);
|
||||
$content .= BorderHelper::serializeBorderPart($part);
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ use Box\Spout\Common\Exception\IOException;
|
||||
use Box\Spout\Common\Helper\Escaper\XLSX as XLSXEscaper;
|
||||
use Box\Spout\Common\Helper\StringHelper;
|
||||
use Box\Spout\Common\Manager\OptionsManagerInterface;
|
||||
use Box\Spout\Writer\Common\Creator\InternalEntityFactory;
|
||||
use Box\Spout\Writer\Common\Entity\Options;
|
||||
use Box\Spout\Writer\Common\Entity\Worksheet;
|
||||
use Box\Spout\Writer\Common\Helper\CellHelper;
|
||||
@@ -60,9 +59,6 @@ EOD;
|
||||
/** @var StringHelper String helper */
|
||||
private $stringHelper;
|
||||
|
||||
/** @var InternalEntityFactory Factory to create entities */
|
||||
private $entityFactory;
|
||||
|
||||
/**
|
||||
* WorksheetManager constructor.
|
||||
*
|
||||
@@ -73,7 +69,6 @@ EOD;
|
||||
* @param SharedStringsManager $sharedStringsManager
|
||||
* @param XLSXEscaper $stringsEscaper
|
||||
* @param StringHelper $stringHelper
|
||||
* @param InternalEntityFactory $entityFactory
|
||||
*/
|
||||
public function __construct(
|
||||
OptionsManagerInterface $optionsManager,
|
||||
@@ -82,8 +77,7 @@ EOD;
|
||||
StyleMerger $styleMerger,
|
||||
SharedStringsManager $sharedStringsManager,
|
||||
XLSXEscaper $stringsEscaper,
|
||||
StringHelper $stringHelper,
|
||||
InternalEntityFactory $entityFactory
|
||||
StringHelper $stringHelper
|
||||
) {
|
||||
$this->shouldUseInlineStrings = $optionsManager->getOption(Options::SHOULD_USE_INLINE_STRINGS);
|
||||
$this->rowManager = $rowManager;
|
||||
@@ -92,7 +86,6 @@ EOD;
|
||||
$this->sharedStringsManager = $sharedStringsManager;
|
||||
$this->stringsEscaper = $stringsEscaper;
|
||||
$this->stringHelper = $stringHelper;
|
||||
$this->entityFactory = $entityFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user