Remove rowStyle reference and replace it by new RegisteredStyle class

This commit is contained in:
Antoine Lamirault 2021-03-25 08:44:08 +01:00 committed by Adrien Loison
parent c6f596c776
commit 8a17d6c71f
3 changed files with 66 additions and 18 deletions

View File

@ -0,0 +1,34 @@
<?php
namespace Box\Spout\Writer\Common\Manager;
use Box\Spout\Common\Entity\Style\Style;
class RegisteredStyle
{
/**
* @var Style
*/
private $style;
/**
* @var bool
*/
private $isRowStyle;
public function __construct(Style $style, bool $isRowStyle)
{
$this->style = $style;
$this->isRowStyle = $isRowStyle;
}
public function getStyle() : Style
{
return $this->style;
}
public function isRowStyle() : bool
{
return $this->isRowStyle;
}
}

View File

@ -10,6 +10,7 @@ use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Helper\Escaper\ODS as ODSEscaper; use Box\Spout\Common\Helper\Escaper\ODS as ODSEscaper;
use Box\Spout\Common\Helper\StringHelper; use Box\Spout\Common\Helper\StringHelper;
use Box\Spout\Writer\Common\Entity\Worksheet; use Box\Spout\Writer\Common\Entity\Worksheet;
use Box\Spout\Writer\Common\Manager\RegisteredStyle;
use Box\Spout\Writer\Common\Manager\Style\StyleMerger; use Box\Spout\Writer\Common\Manager\Style\StyleMerger;
use Box\Spout\Writer\Common\Manager\WorksheetManagerInterface; use Box\Spout\Writer\Common\Manager\WorksheetManagerInterface;
use Box\Spout\Writer\ODS\Manager\Style\StyleManager; use Box\Spout\Writer\ODS\Manager\Style\StyleManager;
@ -104,8 +105,8 @@ class WorksheetManager implements WorksheetManagerInterface
* *
* @param Worksheet $worksheet The worksheet to add the row to * @param Worksheet $worksheet The worksheet to add the row to
* @param Row $row The row to be added * @param Row $row The row to be added
* @throws IOException If the data cannot be written
* @throws InvalidArgumentException If a cell value's type is not supported * @throws InvalidArgumentException If a cell value's type is not supported
* @throws IOException If the data cannot be written
* @return void * @return void
*/ */
public function addRow(Worksheet $worksheet, Row $row) public function addRow(Worksheet $worksheet, Row $row)
@ -125,7 +126,13 @@ class WorksheetManager implements WorksheetManagerInterface
$nextCell = isset($cells[$nextCellIndex]) ? $cells[$nextCellIndex] : null; $nextCell = isset($cells[$nextCellIndex]) ? $cells[$nextCellIndex] : null;
if ($nextCell === null || $cell->getValue() !== $nextCell->getValue()) { if ($nextCell === null || $cell->getValue() !== $nextCell->getValue()) {
$data .= $this->applyStyleAndGetCellXML($cell, $rowStyle, $currentCellIndex, $nextCellIndex); $registeredStyle = $this->applyStyleAndRegister($cell, $rowStyle);
$cellStyle = $registeredStyle->getStyle();
if ($registeredStyle->isRowStyle()) {
$rowStyle = $cellStyle;
}
$data .= $this->getCellXMLWithStyle($cell, $cellStyle, $currentCellIndex, $nextCellIndex);
$currentCellIndex = $nextCellIndex; $currentCellIndex = $nextCellIndex;
} }
@ -146,17 +153,15 @@ class WorksheetManager implements WorksheetManagerInterface
/** /**
* Applies styles to the given style, merging the cell's style with its row's style * Applies styles to the given style, merging the cell's style with its row's style
* Then builds and returns xml for the cell.
* *
* @param Cell $cell * @param Cell $cell
* @param Style $rowStyle * @param Style $rowStyle
* @param int $currentCellIndex
* @param int $nextCellIndex
* @throws InvalidArgumentException If a cell value's type is not supported * @throws InvalidArgumentException If a cell value's type is not supported
* @return string * @return RegisteredStyle
*/ */
private function applyStyleAndGetCellXML(Cell $cell, Style &$rowStyle, $currentCellIndex, $nextCellIndex) private function applyStyleAndRegister(Cell $cell, Style $rowStyle) : RegisteredStyle
{ {
$isRowStyle = false;
if ($cell->getStyle()->isEmpty()) { if ($cell->getStyle()->isEmpty()) {
$cell->setStyle($rowStyle); $cell->setStyle($rowStyle);
@ -166,7 +171,7 @@ class WorksheetManager implements WorksheetManagerInterface
$registeredStyle = $this->styleManager->registerStyle($managedStyle->getStyle()); $registeredStyle = $this->styleManager->registerStyle($managedStyle->getStyle());
} else { } else {
$registeredStyle = $this->styleManager->registerStyle($rowStyle); $registeredStyle = $this->styleManager->registerStyle($rowStyle);
$rowStyle = $registeredStyle; $isRowStyle = true;
} }
} else { } else {
$mergedCellAndRowStyle = $this->styleMerger->merge($cell->getStyle(), $rowStyle); $mergedCellAndRowStyle = $this->styleMerger->merge($cell->getStyle(), $rowStyle);
@ -182,7 +187,12 @@ class WorksheetManager implements WorksheetManagerInterface
$registeredStyle = $this->styleManager->registerStyle($newCellStyle); $registeredStyle = $this->styleManager->registerStyle($newCellStyle);
} }
$styleIndex = $registeredStyle->getId() + 1; // 1-based return new RegisteredStyle($registeredStyle, $isRowStyle);
}
private function getCellXMLWithStyle(Cell $cell, Style $style, int $currentCellIndex, int $nextCellIndex) : string
{
$styleIndex = $style->getId() + 1; // 1-based
$numTimesValueRepeated = ($nextCellIndex - $currentCellIndex); $numTimesValueRepeated = ($nextCellIndex - $currentCellIndex);

View File

@ -14,6 +14,7 @@ use Box\Spout\Writer\Common\Creator\InternalEntityFactory;
use Box\Spout\Writer\Common\Entity\Options; use Box\Spout\Writer\Common\Entity\Options;
use Box\Spout\Writer\Common\Entity\Worksheet; use Box\Spout\Writer\Common\Entity\Worksheet;
use Box\Spout\Writer\Common\Helper\CellHelper; use Box\Spout\Writer\Common\Helper\CellHelper;
use Box\Spout\Writer\Common\Manager\RegisteredStyle;
use Box\Spout\Writer\Common\Manager\RowManager; use Box\Spout\Writer\Common\Manager\RowManager;
use Box\Spout\Writer\Common\Manager\Style\StyleMerger; use Box\Spout\Writer\Common\Manager\Style\StyleMerger;
use Box\Spout\Writer\Common\Manager\WorksheetManagerInterface; use Box\Spout\Writer\Common\Manager\WorksheetManagerInterface;
@ -160,7 +161,12 @@ EOD;
$rowXML = '<row r="' . $rowIndexOneBased . '" spans="1:' . $numCells . '">'; $rowXML = '<row r="' . $rowIndexOneBased . '" spans="1:' . $numCells . '">';
foreach ($row->getCells() as $columnIndexZeroBased => $cell) { foreach ($row->getCells() as $columnIndexZeroBased => $cell) {
$rowXML .= $this->applyStyleAndGetCellXML($cell, $rowStyle, $rowIndexOneBased, $columnIndexZeroBased); $registeredStyle = $this->applyStyleAndRegister($cell, $rowStyle);
$cellStyle = $registeredStyle->getStyle();
if ($registeredStyle->isRowStyle()) {
$rowStyle = $cellStyle;
}
$rowXML .= $this->getCellXML($rowIndexOneBased, $columnIndexZeroBased, $cell, $cellStyle->getId());
} }
$rowXML .= '</row>'; $rowXML .= '</row>';
@ -173,18 +179,16 @@ EOD;
/** /**
* Applies styles to the given style, merging the cell's style with its row's style * Applies styles to the given style, merging the cell's style with its row's style
* Then builds and returns xml for the cell.
* *
* @param Cell $cell * @param Cell $cell
* @param Style $rowStyle * @param Style $rowStyle
* @param int $rowIndexOneBased
* @param int $columnIndexZeroBased
* *
* @throws InvalidArgumentException If the given value cannot be processed * @throws InvalidArgumentException If the given value cannot be processed
* @return string * @return RegisteredStyle
*/ */
private function applyStyleAndGetCellXML(Cell $cell, Style &$rowStyle, $rowIndexOneBased, $columnIndexZeroBased) private function applyStyleAndRegister(Cell $cell, Style $rowStyle) : RegisteredStyle
{ {
$isRowStyle = false;
if ($cell->getStyle()->isEmpty()) { if ($cell->getStyle()->isEmpty()) {
$cell->setStyle($rowStyle); $cell->setStyle($rowStyle);
@ -194,7 +198,7 @@ EOD;
$registeredStyle = $this->styleManager->registerStyle($managedStyle->getStyle()); $registeredStyle = $this->styleManager->registerStyle($managedStyle->getStyle());
} else { } else {
$registeredStyle = $this->styleManager->registerStyle($rowStyle); $registeredStyle = $this->styleManager->registerStyle($rowStyle);
$rowStyle = $registeredStyle; $isRowStyle = true;
} }
} else { } else {
$mergedCellAndRowStyle = $this->styleMerger->merge($cell->getStyle(), $rowStyle); $mergedCellAndRowStyle = $this->styleMerger->merge($cell->getStyle(), $rowStyle);
@ -211,7 +215,7 @@ EOD;
$registeredStyle = $this->styleManager->registerStyle($newCellStyle); $registeredStyle = $this->styleManager->registerStyle($newCellStyle);
} }
return $this->getCellXML($rowIndexOneBased, $columnIndexZeroBased, $cell, $registeredStyle->getId()); return new RegisteredStyle($registeredStyle, $isRowStyle);
} }
/** /**