Skip to content
This repository has been archived by the owner on Dec 31, 2021. It is now read-only.

Commit

Permalink
support for WithColumnFormatting Concern
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasvanrijsse committed Sep 17, 2021
1 parent 57c3a54 commit 4936fa0
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 3 deletions.
11 changes: 11 additions & 0 deletions src/Concerns/WithColumnFormatting.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Nikazooz\Simplesheet\Concerns;

interface WithColumnFormatting
{
/**
* @return array
*/
public function columnFormats(): array;
}
48 changes: 48 additions & 0 deletions src/Helpers/NumberFormat.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace Nikazooz\Simplesheet\Helpers;

class NumberFormat
{
const FORMAT_GENERAL = 'General';

const FORMAT_TEXT = '@';

const FORMAT_NUMBER = '0';
const FORMAT_NUMBER_00 = '0.00';
const FORMAT_NUMBER_COMMA_SEPARATED1 = '#,##0.00';
const FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-';

const FORMAT_PERCENTAGE = '0%';
const FORMAT_PERCENTAGE_00 = '0.00%';

const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd';
const FORMAT_DATE_YYYYMMDD = 'yyyy-mm-dd';
const FORMAT_DATE_DDMMYYYY = 'dd/mm/yyyy';
const FORMAT_DATE_DMYSLASH = 'd/m/yy';
const FORMAT_DATE_DMYMINUS = 'd-m-yy';
const FORMAT_DATE_DMMINUS = 'd-m';
const FORMAT_DATE_MYMINUS = 'm-yy';
const FORMAT_DATE_XLSX14 = 'mm-dd-yy';
const FORMAT_DATE_XLSX15 = 'd-mmm-yy';
const FORMAT_DATE_XLSX16 = 'd-mmm';
const FORMAT_DATE_XLSX17 = 'mmm-yy';
const FORMAT_DATE_XLSX22 = 'm/d/yy h:mm';
const FORMAT_DATE_DATETIME = 'd/m/yy h:mm';
const FORMAT_DATE_TIME1 = 'h:mm AM/PM';
const FORMAT_DATE_TIME2 = 'h:mm:ss AM/PM';
const FORMAT_DATE_TIME3 = 'h:mm';
const FORMAT_DATE_TIME4 = 'h:mm:ss';
const FORMAT_DATE_TIME5 = 'mm:ss';
const FORMAT_DATE_TIME6 = 'h:mm:ss';
const FORMAT_DATE_TIME7 = 'i:s.S';
const FORMAT_DATE_TIME8 = 'h:mm:ss;@';
const FORMAT_DATE_YYYYMMDDSLASH = 'yyyy/mm/dd;@';

const FORMAT_CURRENCY_USD_SIMPLE = '$#,##0.00_-';
const FORMAT_CURRENCY_USD = '$#,##0_-';
const FORMAT_CURRENCY_EUR_SIMPLE = '#,##0.00_-€';
const FORMAT_CURRENCY_EUR = '#,##0_-€';
const FORMAT_ACCOUNTING_USD = '_($* #,##0.00_);_($* \(#,##0.00\);_($* -??_);_(@_)';
const FORMAT_ACCOUNTING_EUR = '_(€* #,##0.00_);_(€* \(#,##0.00\);_(€* -??_);_(@_)';
}
32 changes: 29 additions & 3 deletions src/Writers/Sheet.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Box\Spout\Common\Entity\Cell;
use Box\Spout\Common\Entity\Row;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\WriterInterface;
use Box\Spout\Writer\WriterMultiSheetsAbstract;
use Illuminate\Contracts\Support\Arrayable;
Expand All @@ -12,6 +13,7 @@
use Nikazooz\Simplesheet\Concerns\FromCollection;
use Nikazooz\Simplesheet\Concerns\FromIterator;
use Nikazooz\Simplesheet\Concerns\FromQuery;
use Nikazooz\Simplesheet\Concerns\WithColumnFormatting;
use Nikazooz\Simplesheet\Concerns\WithCustomChunkSize;
use Nikazooz\Simplesheet\Concerns\WithEvents;
use Nikazooz\Simplesheet\Concerns\WithHeadings;
Expand Down Expand Up @@ -151,6 +153,11 @@ public function fromIterator(FromIterator $sheetExport)
*/
public function appendRows($rows, $sheetExport)
{
$columnFormats = null;
if ($sheetExport instanceof WithColumnFormatting) {
$columnFormats = $sheetExport->columnFormats();
}

Collection::make($rows)->flatMap(function ($row) use ($sheetExport) {
if ($sheetExport instanceof WithMapping) {
$row = $sheetExport->map($row);
Expand All @@ -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);
});
}

Expand Down Expand Up @@ -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
Expand Down
38 changes: 38 additions & 0 deletions tests/Concerns/WithColumnFormattingTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Nikazooz\Simplesheet\Tests\Concerns;

use Box\Spout\Common\Entity\Cell;
use Nikazooz\Simplesheet\Helpers\NumberFormat;
use Nikazooz\Simplesheet\Tests\Data\Stubs\WithColumnFormattingExport;
use Nikazooz\Simplesheet\Tests\TestCase;

class WithColumnFormattingTest extends TestCase
{
/**
* @test
*/
public function can_export_with_column_formatting()
{
$export = new WithColumnFormattingExport();

$response = $export->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');
}
}
31 changes: 31 additions & 0 deletions tests/Data/Stubs/WithColumnFormattingExport.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Nikazooz\Simplesheet\Tests\Data\Stubs;

use Nikazooz\Simplesheet\Concerns\Exportable;
use Nikazooz\Simplesheet\Concerns\FromCollection;
use Nikazooz\Simplesheet\Concerns\WithColumnFormatting;
use Nikazooz\Simplesheet\Helpers\NumberFormat;

class WithColumnFormattingExport implements FromCollection, WithColumnFormatting
{
use Exportable;

/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return collect([
['A1', 'B1', 'C1'],
['A2', 'B2', 'C2'],
]);
}

public function columnFormats(): array
{
return [
'B' => NumberFormat::FORMAT_NUMBER_00,
];
}
}

0 comments on commit 4936fa0

Please sign in to comment.