From 26e5f966fb28360b7d2127541e2e72ba4251cd52 Mon Sep 17 00:00:00 2001 From: Martin Wind Date: Sun, 29 Mar 2020 15:10:11 +0200 Subject: [PATCH 1/2] Use options manager for default row height and column width --- src/Spout/Writer/WriterMultiSheetsAbstract.php | 18 ++++++++++++------ .../Writer/XLSX/Manager/WorksheetManager.php | 17 ++++------------- 2 files changed, 16 insertions(+), 19 deletions(-) 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..fe057d3 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. * @@ -122,6 +119,9 @@ EOD; $worksheet->setFilePointer($sheetFilePointer); \fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER); + \fwrite($sheetFilePointer, $this->getXMLFragmentForDefaultCellSizing()); + \fwrite($sheetFilePointer, $this->getXMLFragmentForColumnWidths()); + \fwrite($sheetFilePointer, ''); } /** @@ -162,12 +162,6 @@ EOD; private function addNonEmptyRow(Worksheet $worksheet, Row $row) { $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 +179,6 @@ EOD; if ($wasWriteSuccessful === false) { throw new IOException("Unable to write data in {$worksheet->getFilePath()}"); } - $this->hasWrittenRows = true; } /** @@ -324,9 +317,7 @@ EOD; return; } - if ($this->hasWrittenRows) { - \fwrite($worksheetFilePointer, ''); - } + \fwrite($worksheetFilePointer, ''); \fwrite($worksheetFilePointer, ''); \fclose($worksheetFilePointer); } From de3241b57cbd707f46a237ad1e5c109eacb90211 Mon Sep 17 00:00:00 2001 From: Martin Wind Date: Sun, 29 Mar 2020 20:32:24 +0200 Subject: [PATCH 2/2] Delay sheetData and add sheetDataStarted flag to worksheet --- src/Spout/Writer/Common/Entity/Worksheet.php | 20 +++++++++++++++++ .../Writer/XLSX/Manager/WorksheetManager.php | 22 +++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) 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/XLSX/Manager/WorksheetManager.php b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php index fe057d3..efdaf04 100644 --- a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php +++ b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php @@ -119,9 +119,22 @@ EOD; $worksheet->setFilePointer($sheetFilePointer); \fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER); - \fwrite($sheetFilePointer, $this->getXMLFragmentForDefaultCellSizing()); - \fwrite($sheetFilePointer, $this->getXMLFragmentForColumnWidths()); - \fwrite($sheetFilePointer, ''); + } + + /** + * 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); + } } /** @@ -161,6 +174,7 @@ EOD; */ private function addNonEmptyRow(Worksheet $worksheet, Row $row) { + $this->ensureSheetDataStated($worksheet); $sheetFilePointer = $worksheet->getFilePointer(); $rowStyle = $row->getStyle(); $rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1; @@ -316,7 +330,7 @@ EOD; if (!\is_resource($worksheetFilePointer)) { return; } - + $this->ensureSheetDataStated($worksheet); \fwrite($worksheetFilePointer, ''); \fwrite($worksheetFilePointer, ''); \fclose($worksheetFilePointer);