Skip to content

Commit eda90b9

Browse files
authored
Merge pull request #3 from yajra/export-format
Add option to set exportFormat from Column builder.
2 parents 961526f + 2aa1cd3 commit eda90b9

File tree

3 files changed

+153
-4
lines changed

3 files changed

+153
-4
lines changed

README.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,56 @@ You can set the export type by setting the property to `csv` or `xlsx`. Default
8686
<livewire:export-button :table-id="$dataTable->getTableId()" type="csv" />
8787
```
8888

89+
## Formatting Columns
90+
91+
You can format column by setting it via Column definition on you DataTable service class.
92+
93+
```phpt
94+
Column::make('mobile')->exportFormat('00000000000'),
95+
```
96+
97+
The format above will treat mobile numbers with leading zeroes.
98+
99+
## Date Fields Formatting
100+
101+
The package will auto-detect date fields when used with a valid format.
102+
103+
```phpt
104+
Column::make('report_date')->exportFormat('mm/dd/yyyy'),
105+
Column::make('created_at'),
106+
Column::make('updated_at')->exportFormat(NumberFormat::FORMAT_DATE_DATETIME),
107+
```
108+
109+
## Valid Date Formats
110+
111+
Valid date formats can be adjust on `datatables-export.php` config file.
112+
113+
```phpt
114+
'date_formats' => [
115+
'mm/dd/yyyy',
116+
NumberFormat::FORMAT_DATE_DATETIME,
117+
NumberFormat::FORMAT_DATE_YYYYMMDD,
118+
NumberFormat::FORMAT_DATE_XLSX22,
119+
NumberFormat::FORMAT_DATE_DDMMYYYY,
120+
NumberFormat::FORMAT_DATE_DMMINUS,
121+
NumberFormat::FORMAT_DATE_DMYMINUS,
122+
NumberFormat::FORMAT_DATE_DMYSLASH,
123+
NumberFormat::FORMAT_DATE_MYMINUS,
124+
NumberFormat::FORMAT_DATE_TIME1,
125+
NumberFormat::FORMAT_DATE_TIME2,
126+
NumberFormat::FORMAT_DATE_TIME3,
127+
NumberFormat::FORMAT_DATE_TIME4,
128+
NumberFormat::FORMAT_DATE_TIME5,
129+
NumberFormat::FORMAT_DATE_TIME6,
130+
NumberFormat::FORMAT_DATE_TIME7,
131+
NumberFormat::FORMAT_DATE_XLSX14,
132+
NumberFormat::FORMAT_DATE_XLSX15,
133+
NumberFormat::FORMAT_DATE_XLSX16,
134+
NumberFormat::FORMAT_DATE_XLSX17,
135+
NumberFormat::FORMAT_DATE_YYYYMMDD2,
136+
NumberFormat::FORMAT_DATE_YYYYMMDDSLASH,
137+
]
138+
```
89139

90140
## Contributing
91141

src/Exports/DataTableQueuedExport.php

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,31 @@
22

33
namespace Yajra\DataTables\Exports;
44

5+
use Carbon\Carbon;
56
use Illuminate\Support\Collection;
67
use Maatwebsite\Excel\Concerns\Exportable;
78
use Maatwebsite\Excel\Concerns\FromQuery;
9+
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
810
use Maatwebsite\Excel\Concerns\WithHeadings;
911
use Maatwebsite\Excel\Concerns\WithMapping;
12+
use PhpOffice\PhpSpreadsheet\Shared\Date;
13+
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
1014
use Yajra\DataTables\Html\Column;
1115

12-
class DataTableQueuedExport implements FromQuery, WithMapping, WithHeadings
16+
class DataTableQueuedExport implements FromQuery, WithMapping, WithHeadings, WithColumnFormatting
1317
{
1418
use Exportable;
1519

1620
protected $query;
1721
protected $columns;
1822

23+
/**
24+
* Index of fields with date instance.
25+
*
26+
* @var array
27+
*/
28+
protected $dates = [];
29+
1930
public function __construct($query, Collection $columns)
2031
{
2132
$this->query = $query;
@@ -30,8 +41,24 @@ public function query()
3041
public function map($row): array
3142
{
3243
return $this->columns
33-
->map(function (Column $column) use ($row) {
34-
return $row[$column['data']];
44+
->map(function (Column $column, $index) use ($row) {
45+
$property = $column['data'];
46+
47+
if ($row[$property] instanceof \DateTime) {
48+
$this->dates[] = $index;
49+
50+
return Date::dateTimeToExcel($row[$property]);
51+
}
52+
53+
if ($this->wantsDateFormat($column)) {
54+
$this->dates[] = $index;
55+
56+
$dateValue = $row[$property];
57+
58+
return $dateValue ? Date::dateTimeToExcel(Carbon::parse($dateValue)) : '';
59+
}
60+
61+
return $row[$property];
3562
})
3663
->toArray();
3764
}
@@ -40,4 +67,45 @@ public function headings(): array
4067
{
4168
return $this->columns->pluck('title')->toArray();
4269
}
70+
71+
public function columnFormats(): array
72+
{
73+
$formats = [];
74+
75+
$this->columns
76+
->each(function (Column $column, $index) use (&$formats) {
77+
if (in_array($index, $this->dates) || $this->wantsDateFormat($column)) {
78+
return $formats[$this->num2alpha($index - 1)] = $column['exportFormat'] ?? NumberFormat::FORMAT_DATE_YYYYMMDD;
79+
}
80+
81+
if (isset($column['exportFormat'])) {
82+
return $formats[$this->num2alpha($index - 1)] = $column['exportFormat'];
83+
}
84+
})
85+
->toArray();
86+
87+
return $formats;
88+
}
89+
90+
protected function num2alpha($n)
91+
{
92+
for ($r = ""; $n >= 0; $n = intval($n / 26) - 1) {
93+
$r = chr($n % 26 + 0x41) . $r;
94+
}
95+
96+
return $r;
97+
}
98+
99+
/**
100+
* @param \Yajra\DataTables\Html\Column $column
101+
* @return bool
102+
*/
103+
protected function wantsDateFormat(Column $column): bool
104+
{
105+
if (!isset($column['exportFormat'])) {
106+
return false;
107+
}
108+
109+
return in_array($column['exportFormat'], config('datatables-export.date_formats', []));
110+
}
43111
}

src/config/datatables-export.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,34 @@
11
<?php
22

3-
return [];
3+
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
4+
5+
return [
6+
7+
/**
8+
* List of valid date formats to be used for auto-detection.
9+
*/
10+
'date_formats' => [
11+
'mm/dd/yyyy',
12+
NumberFormat::FORMAT_DATE_DATETIME,
13+
NumberFormat::FORMAT_DATE_YYYYMMDD,
14+
NumberFormat::FORMAT_DATE_XLSX22,
15+
NumberFormat::FORMAT_DATE_DDMMYYYY,
16+
NumberFormat::FORMAT_DATE_DMMINUS,
17+
NumberFormat::FORMAT_DATE_DMYMINUS,
18+
NumberFormat::FORMAT_DATE_DMYSLASH,
19+
NumberFormat::FORMAT_DATE_MYMINUS,
20+
NumberFormat::FORMAT_DATE_TIME1,
21+
NumberFormat::FORMAT_DATE_TIME2,
22+
NumberFormat::FORMAT_DATE_TIME3,
23+
NumberFormat::FORMAT_DATE_TIME4,
24+
NumberFormat::FORMAT_DATE_TIME5,
25+
NumberFormat::FORMAT_DATE_TIME6,
26+
NumberFormat::FORMAT_DATE_TIME7,
27+
NumberFormat::FORMAT_DATE_XLSX14,
28+
NumberFormat::FORMAT_DATE_XLSX15,
29+
NumberFormat::FORMAT_DATE_XLSX16,
30+
NumberFormat::FORMAT_DATE_XLSX17,
31+
NumberFormat::FORMAT_DATE_YYYYMMDD2,
32+
NumberFormat::FORMAT_DATE_YYYYMMDDSLASH,
33+
]
34+
];

0 commit comments

Comments
 (0)