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

support for WithColumnFormatting Concern #8

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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,
];
}
}