From 4936fa0b98b2bcc19b39833c5b17ca644cc97fe8 Mon Sep 17 00:00:00 2001 From: Tomas van Rijsse Date: Fri, 17 Sep 2021 18:07:32 +0200 Subject: [PATCH] support for WithColumnFormatting Concern --- src/Concerns/WithColumnFormatting.php | 11 +++++ src/Helpers/NumberFormat.php | 48 +++++++++++++++++++ src/Writers/Sheet.php | 32 +++++++++++-- tests/Concerns/WithColumnFormattingTest.php | 38 +++++++++++++++ .../Data/Stubs/WithColumnFormattingExport.php | 31 ++++++++++++ 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 src/Concerns/WithColumnFormatting.php create mode 100644 src/Helpers/NumberFormat.php create mode 100644 tests/Concerns/WithColumnFormattingTest.php create mode 100644 tests/Data/Stubs/WithColumnFormattingExport.php diff --git a/src/Concerns/WithColumnFormatting.php b/src/Concerns/WithColumnFormatting.php new file mode 100644 index 0000000..0027af6 --- /dev/null +++ b/src/Concerns/WithColumnFormatting.php @@ -0,0 +1,11 @@ +columnFormats(); + } + Collection::make($rows)->flatMap(function ($row) use ($sheetExport) { if ($sheetExport instanceof WithMapping) { $row = $sheetExport->map($row); @@ -159,8 +166,8 @@ public function appendRows($rows, $sheetExport) return ArrayHelper::ensureMultipleRows( static::mapArraybleRow($row) ); - })->each(function ($row) { - $this->appendRow($row); + })->each(function ($row) use ($columnFormats) { + $this->appendRow($row, $columnFormats); }); } @@ -194,15 +201,34 @@ public static function mapArraybleRow($row) * @param array $row * @return void */ - public function appendRow($row) + public function appendRow($row, $columnFormats = null) { $cells = array_map(function ($value) { return new Cell($value); }, $row); + if ($columnFormats) { + foreach ($columnFormats as $columnKey => $columnFormat) { + $escapedFormat = str_replace('"', '/"', $columnFormat); + $style = (new StyleBuilder())->setFormat($escapedFormat)->build(); + $columnIndex = $this->alpha2num($columnKey); + $cells[$columnIndex]->setStyle($style); + } + } + $this->spoutWriter->addRow(new Row($cells, null)); } + protected function alpha2num($column) + { + $number = 0; + foreach (str_split($column) as $letter) { + $number = ($number * 26) + (ord(strtolower($letter)) - 96); + } + + return $number - 1; + } + /** * @param \Nikazooz\Simplesheet\Concerns\WithCustomChunkSize|object $export * @return int diff --git a/tests/Concerns/WithColumnFormattingTest.php b/tests/Concerns/WithColumnFormattingTest.php new file mode 100644 index 0000000..1511872 --- /dev/null +++ b/tests/Concerns/WithColumnFormattingTest.php @@ -0,0 +1,38 @@ +store('with-column-formatting-store.xlsx'); + + $this->assertTrue($response); + + $filePath = __DIR__.'/../Data/Disks/Local/with-column-formatting-store.xlsx'; + + $reader = $this->read($filePath, 'xlsx'); + + $sheet = $this->getSheetByIndex($reader); + + foreach ($sheet->getRowIterator() as $row) { + /** @var Cell[] $cells */ + $cells = $row->getCells(); + $this->assertEquals($cells[1]->getStyle(), NumberFormat::FORMAT_NUMBER_00); + } + + // Cleanup + unlink(__DIR__.'/../Data/Disks/Local/with-column-formatting-store.xlsx'); + } +} diff --git a/tests/Data/Stubs/WithColumnFormattingExport.php b/tests/Data/Stubs/WithColumnFormattingExport.php new file mode 100644 index 0000000..3a1ad5b --- /dev/null +++ b/tests/Data/Stubs/WithColumnFormattingExport.php @@ -0,0 +1,31 @@ + NumberFormat::FORMAT_NUMBER_00, + ]; + } +}