From d9582d136609892bed29ab0605df8a409e1a541b Mon Sep 17 00:00:00 2001 From: Filippo Tessarotto Date: Tue, 1 Mar 2022 10:25:32 +0100 Subject: [PATCH] Add column width settings --- src/Spout/Writer/Common/Entity/Sheet.php | 23 ++++++++++++ .../Writer/XLSX/Manager/WorksheetManager.php | 37 ++++++++++++++++++- tests/Spout/Writer/XLSX/SheetTest.php | 28 ++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/Spout/Writer/Common/Entity/Sheet.php b/src/Spout/Writer/Common/Entity/Sheet.php index 7c786e1..85e6fa3 100644 --- a/src/Spout/Writer/Common/Entity/Sheet.php +++ b/src/Spout/Writer/Common/Entity/Sheet.php @@ -26,6 +26,10 @@ class Sheet /** @var SheetManager Sheet manager */ private $sheetManager; + /** + * @var array + */ + private $columnWidths = []; /** * @param int $sheetIndex Index of the sheet, based on order in the workbook (zero-based) @@ -108,4 +112,23 @@ class Sheet return $this; } + + /** + * @return array + */ + public function getColumnWidths() + { + return $this->columnWidths; + } + + /** + * @param array $columnWidths + * @return Sheet + */ + public function setColumnWidths(array $columnWidths) + { + $this->columnWidths = $columnWidths; + + return $this; + } } diff --git a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php index 6025442..b5882b5 100644 --- a/src/Spout/Writer/XLSX/Manager/WorksheetManager.php +++ b/src/Spout/Writer/XLSX/Manager/WorksheetManager.php @@ -59,6 +59,9 @@ EOD; /** @var StringHelper String helper */ private $stringHelper; + /** @var bool */ + private $isSheetDataStarted = false; + /** * WorksheetManager constructor. * @@ -107,7 +110,35 @@ EOD; $worksheet->setFilePointer($sheetFilePointer); \fwrite($sheetFilePointer, self::SHEET_XML_FILE_HEADER); - \fwrite($sheetFilePointer, ''); + } + + /** + * @param Worksheet $worksheet The worksheet to start data to + * @return void + */ + private function startSheetData(Worksheet $worksheet) + { + if ($this->isSheetDataStarted) { + return; + } + + $columnWidths = $worksheet->getExternalSheet()->getColumnWidths(); + if ($columnWidths !== []) { + $columnWidthsSpec = ''; + foreach ($columnWidths as $columnIndex => $columnWidth) { + $columnWidthsSpec .= sprintf( + '', + $columnIndex, + $columnWidth + ); + } + $columnWidthsSpec .= ''; + \fwrite($worksheet->getFilePointer(), $columnWidthsSpec); + } + + \fwrite($worksheet->getFilePointer(), ''); + + $this->isSheetDataStarted = true; } /** @@ -147,6 +178,8 @@ EOD; */ private function addNonEmptyRow(Worksheet $worksheet, Row $row) { + $this->startSheetData($worksheet); + $rowStyle = $row->getStyle(); $rowIndexOneBased = $worksheet->getLastWrittenRowIndex() + 1; $numCells = $row->getNumCells(); @@ -286,6 +319,8 @@ EOD; return; } + $this->startSheetData($worksheet); + \fwrite($worksheetFilePointer, ''); \fwrite($worksheetFilePointer, ''); \fclose($worksheetFilePointer); diff --git a/tests/Spout/Writer/XLSX/SheetTest.php b/tests/Spout/Writer/XLSX/SheetTest.php index a243161..80689d8 100644 --- a/tests/Spout/Writer/XLSX/SheetTest.php +++ b/tests/Spout/Writer/XLSX/SheetTest.php @@ -92,6 +92,34 @@ class SheetTest extends TestCase $this->assertStringContainsString(' state="hidden"', $xmlContents, 'The sheet visibility should have been changed to "hidden"'); } + /** + * @return void + */ + public function testSetSheetColumnWidthsShouldCreateSheetWidthCustomWidths() + { + $fileName = 'test_set_column_widths.xlsx'; + $this->createGeneratedFolderIfNeeded($fileName); + $resourcePath = $this->getGeneratedResourcePath($fileName); + + $writer = WriterEntityFactory::createXLSXWriter(); + $writer->openToFile($resourcePath); + + $sheet = $writer->getCurrentSheet(); + $sheet->setColumnWidths([ + 1 => 10, + 3 => 40, + ]); + + $writer->addRow($this->createRowFromValues(['xlsx--11', 'xlsx--12'])); + $writer->close(); + + $resourcePath = $this->getGeneratedResourcePath($fileName); + $pathToWorkbookFile = $resourcePath . '#xl/worksheets/sheet1.xml'; + $xmlContents = file_get_contents('zip://' . $pathToWorkbookFile); + + $this->assertStringContainsString('', $xmlContents); + } + /** * @param string $fileName * @param string $sheetName