diff --git a/app/Exports/SegmentContractsExport.php b/app/Exports/SegmentContractsExport.php index 5d10234..be0462d 100644 --- a/app/Exports/SegmentContractsExport.php +++ b/app/Exports/SegmentContractsExport.php @@ -8,14 +8,26 @@ use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\ShouldAutoSize; use Maatwebsite\Excel\Concerns\WithColumnFormatting; +use Maatwebsite\Excel\Concerns\WithCustomValueBinder; use Maatwebsite\Excel\Concerns\WithHeadings; use Maatwebsite\Excel\Concerns\WithMapping; +use PhpOffice\PhpSpreadsheet\Cell\Cell; +use PhpOffice\PhpSpreadsheet\Cell\DataType; +use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder; use PhpOffice\PhpSpreadsheet\Shared\Date as ExcelDate; +use PhpOffice\PhpSpreadsheet\Style\NumberFormat; -class SegmentContractsExport implements FromQuery, ShouldAutoSize, WithColumnFormatting, WithHeadings, WithMapping +class SegmentContractsExport extends DefaultValueBinder implements FromQuery, ShouldAutoSize, WithColumnFormatting, WithCustomValueBinder, WithHeadings, WithMapping { public const DATE_EXCEL_FORMAT = 'dd"."mm"."yyyy'; + public const TEXT_EXCEL_FORMAT = NumberFormat::FORMAT_TEXT; + + /** + * @var array + */ + private array $columnLetterMap = []; + /** * @var array */ @@ -75,9 +87,15 @@ public function columnFormats(): array { $formats = []; - foreach ($this->columns as $index => $column) { + foreach ($this->getColumnLetterMap() as $letter => $column) { + if ($column === 'reference') { + $formats[$letter] = self::TEXT_EXCEL_FORMAT; + + continue; + } + if (in_array($column, ['start_date', 'end_date'], true)) { - $formats[$this->columnLetter($index)] = self::DATE_EXCEL_FORMAT; + $formats[$letter] = self::DATE_EXCEL_FORMAT; } } @@ -122,4 +140,31 @@ private function columnLetter(int $index): string return $letter; } + + public function bindValue(Cell $cell, $value): bool + { + $columnKey = $this->getColumnLetterMap()[$cell->getColumn()] ?? null; + + if ($columnKey === 'reference') { + $cell->setValueExplicit((string) $value, DataType::TYPE_STRING); + + return true; + } + + return parent::bindValue($cell, $value); + } + + /** + * @return array + */ + private function getColumnLetterMap(): array + { + if ($this->columnLetterMap === []) { + foreach ($this->columns as $index => $column) { + $this->columnLetterMap[$this->columnLetter($index)] = $column; + } + } + + return $this->columnLetterMap; + } } diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index 558aac4..334627a 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -3,7 +3,6 @@ - {{ config('app.name', 'Laravel') }} diff --git a/tests/Feature/SegmentExportTest.php b/tests/Feature/SegmentExportTest.php index 5d6fd49..ba0513c 100644 --- a/tests/Feature/SegmentExportTest.php +++ b/tests/Feature/SegmentExportTest.php @@ -141,7 +141,7 @@ public function test_export_filename_includes_client_name_when_filtered(): void }); } - public function test_column_formats_apply_to_date_columns(): void + public function test_column_formats_apply_to_reference_and_date_columns(): void { $export = new SegmentContractsExport( Contract::query(), @@ -150,6 +150,7 @@ public function test_column_formats_apply_to_date_columns(): void $this->assertSame( [ + 'A' => SegmentContractsExport::TEXT_EXCEL_FORMAT, 'B' => SegmentContractsExport::DATE_EXCEL_FORMAT, 'D' => SegmentContractsExport::DATE_EXCEL_FORMAT, ],