diff --git a/src/Spout/Writer/Common/Entity/Worksheet.php b/src/Spout/Writer/Common/Entity/Worksheet.php index 74c4976..c7a0987 100644 --- a/src/Spout/Writer/Common/Entity/Worksheet.php +++ b/src/Spout/Writer/Common/Entity/Worksheet.php @@ -23,6 +23,9 @@ class Worksheet /** @var int Index of the last written row */ private $lastWrittenRowIndex; + /** @var bool has the sheet data header been written */ + private $sheetDataStarted = false; + /** * Worksheet constructor. * @@ -36,6 +39,7 @@ class Worksheet $this->externalSheet = $externalSheet; $this->maxNumColumns = 0; $this->lastWrittenRowIndex = 0; + $this->sheetDataStarted = false; } /** @@ -110,4 +114,20 @@ class Worksheet // sheet index is zero-based, while ID is 1-based return $this->externalSheet->getIndex() + 1; } + + /** + * @return bool + */ + public function getSheetDataStarted() + { + return $this->sheetDataStarted; + } + + /** + * @param bool $sheetDataStarted + */ + public function setSheetDataStarted($sheetDataStarted) + { + $this->sheetDataStarted = $sheetDataStarted; + } } diff --git a/src/Spout/Writer/WriterMultiSheetsAbstract.php b/src/Spout/Writer/WriterMultiSheetsAbstract.php index b349b04..1fb5ee9 100644 --- a/src/Spout/Writer/WriterMultiSheetsAbstract.php +++ b/src/Spout/Writer/WriterMultiSheetsAbstract.php @@ -142,22 +142,28 @@ abstract class WriterMultiSheetsAbstract extends WriterAbstract /** * @param float $width - * @throws WriterNotOpenedException + * @throws WriterAlreadyOpenedException */ public function setDefaultColumnWidth(float $width) { - $this->throwIfWorkbookIsNotAvailable(); - $this->workbookManager->setDefaultColumnWidth($width); + $this->throwIfWriterAlreadyOpened('Writer must be configured before opening it.'); + $this->optionsManager->setOption( + Options::DEFAULT_COLUMN_WIDTH, + $width + ); } /** * @param float $height - * @throws WriterNotOpenedException + * @throws WriterAlreadyOpenedException */ public function setDefaultRowHeight(float $height) { - $this->throwIfWorkbookIsNotAvailable(); - $this->workbookManager->setDefaultRowHeight($height); + $this->throwIfWriterAlreadyOpened('Writer must be configured before opening it.'); + $this->optionsManager->setOption( + Options::DEFAULT_ROW_HEIGHT, + $height + ); } /** diff --git a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php index e430b3c..efdaf04 100644 --- a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php +++ b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php @@ -65,9 +65,6 @@ EOD; /** @var InternalEntityFactory Factory to create entities */ private $entityFactory; - /** @var bool Whether rows have been written */ - private $hasWrittenRows = false; - /** * WorksheetManager constructor. * @@ -124,6 +121,22 @@ EOD; \fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER); } + /** + * Writes the sheet data header + * + * @param Worksheet $worksheet The worksheet to add the row to + * @return void + */ + private function ensureSheetDataStated(Worksheet $worksheet) { + if (!$worksheet->getSheetDataStarted()) { + $worksheetFilePointer = $worksheet->getFilePointer(); + \fwrite($worksheetFilePointer, $this->getXMLFragmentForDefaultCellSizing()); + \fwrite($worksheetFilePointer, $this->getXMLFragmentForColumnWidths()); + \fwrite($worksheetFilePointer, ''); + $worksheet->setSheetDataStarted(true); + } + } + /** * Checks if the sheet has been sucessfully created. Throws an exception if not. * @@ -161,13 +174,8 @@ EOD; */ private function addNonEmptyRow(Worksheet $worksheet, Row $row) { + $this->ensureSheetDataStated($worksheet); $sheetFilePointer = $worksheet->getFilePointer(); - if (!$this->hasWrittenRows) { - fwrite($sheetFilePointer, $this->getXMLFragmentForDefaultCellSizing()); - fwrite($sheetFilePointer, $this->getXMLFragmentForColumnWidths()); - fwrite($sheetFilePointer, ''); - } - $rowStyle = $row->getStyle(); $rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1; $numCells = $row->getNumCells(); @@ -185,7 +193,6 @@ EOD; if ($wasWriteSuccessful === false) { throw new IOException("Unable to write data in {$worksheet->getFilePath()}"); } - $this->hasWrittenRows = true; } /** @@ -323,10 +330,8 @@ EOD; if (!\is_resource($worksheetFilePointer)) { return; } - - if ($this->hasWrittenRows) { - \fwrite($worksheetFilePointer, ''); - } + $this->ensureSheetDataStated($worksheet); + \fwrite($worksheetFilePointer, ''); \fwrite($worksheetFilePointer, ''); \fclose($worksheetFilePointer); }