Skip to content
Merged
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
50 changes: 50 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,56 @@ You can set the export type by setting the property to `csv` or `xlsx`. Default
<livewire:export-button :table-id="$dataTable->getTableId()" type="csv" />
```

## Formatting Columns

You can format column by setting it via Column definition on you DataTable service class.

```phpt
Column::make('mobile')->exportFormat('00000000000'),
```

The format above will treat mobile numbers with leading zeroes.

## Date Fields Formatting

The package will auto-detect date fields when used with a valid format.

```phpt
Column::make('report_date')->exportFormat('mm/dd/yyyy'),
Column::make('created_at'),
Column::make('updated_at')->exportFormat(NumberFormat::FORMAT_DATE_DATETIME),
```

## Valid Date Formats

Valid date formats can be adjust on `datatables-export.php` config file.

```phpt
'date_formats' => [
'mm/dd/yyyy',
NumberFormat::FORMAT_DATE_DATETIME,
NumberFormat::FORMAT_DATE_YYYYMMDD,
NumberFormat::FORMAT_DATE_XLSX22,
NumberFormat::FORMAT_DATE_DDMMYYYY,
NumberFormat::FORMAT_DATE_DMMINUS,
NumberFormat::FORMAT_DATE_DMYMINUS,
NumberFormat::FORMAT_DATE_DMYSLASH,
NumberFormat::FORMAT_DATE_MYMINUS,
NumberFormat::FORMAT_DATE_TIME1,
NumberFormat::FORMAT_DATE_TIME2,
NumberFormat::FORMAT_DATE_TIME3,
NumberFormat::FORMAT_DATE_TIME4,
NumberFormat::FORMAT_DATE_TIME5,
NumberFormat::FORMAT_DATE_TIME6,
NumberFormat::FORMAT_DATE_TIME7,
NumberFormat::FORMAT_DATE_XLSX14,
NumberFormat::FORMAT_DATE_XLSX15,
NumberFormat::FORMAT_DATE_XLSX16,
NumberFormat::FORMAT_DATE_XLSX17,
NumberFormat::FORMAT_DATE_YYYYMMDD2,
NumberFormat::FORMAT_DATE_YYYYMMDDSLASH,
]
```

## Contributing

Expand Down
74 changes: 71 additions & 3 deletions src/Exports/DataTableQueuedExport.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,31 @@

namespace Yajra\DataTables\Exports;

use Carbon\Carbon;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Yajra\DataTables\Html\Column;

class DataTableQueuedExport implements FromQuery, WithMapping, WithHeadings
class DataTableQueuedExport implements FromQuery, WithMapping, WithHeadings, WithColumnFormatting
{
use Exportable;

protected $query;
protected $columns;

/**
* Index of fields with date instance.
*
* @var array
*/
protected $dates = [];

public function __construct($query, Collection $columns)
{
$this->query = $query;
Expand All @@ -30,8 +41,24 @@ public function query()
public function map($row): array
{
return $this->columns
->map(function (Column $column) use ($row) {
return $row[$column['data']];
->map(function (Column $column, $index) use ($row) {
$property = $column['data'];

if ($row[$property] instanceof \DateTime) {
$this->dates[] = $index;

return Date::dateTimeToExcel($row[$property]);
}

if ($this->wantsDateFormat($column)) {
$this->dates[] = $index;

$dateValue = $row[$property];

return $dateValue ? Date::dateTimeToExcel(Carbon::parse($dateValue)) : '';
}

return $row[$property];
})
->toArray();
}
Expand All @@ -40,4 +67,45 @@ public function headings(): array
{
return $this->columns->pluck('title')->toArray();
}

public function columnFormats(): array
{
$formats = [];

$this->columns
->each(function (Column $column, $index) use (&$formats) {
if (in_array($index, $this->dates) || $this->wantsDateFormat($column)) {
return $formats[$this->num2alpha($index - 1)] = $column['exportFormat'] ?? NumberFormat::FORMAT_DATE_YYYYMMDD;
}

if (isset($column['exportFormat'])) {
return $formats[$this->num2alpha($index - 1)] = $column['exportFormat'];
}
})
->toArray();

return $formats;
}

protected function num2alpha($n)
{
for ($r = ""; $n >= 0; $n = intval($n / 26) - 1) {
$r = chr($n % 26 + 0x41) . $r;
}

return $r;
}

/**
* @param \Yajra\DataTables\Html\Column $column
* @return bool
*/
protected function wantsDateFormat(Column $column): bool
{
if (!isset($column['exportFormat'])) {
return false;
}

return in_array($column['exportFormat'], config('datatables-export.date_formats', []));
}
}
33 changes: 32 additions & 1 deletion src/config/datatables-export.php
Original file line number Diff line number Diff line change
@@ -1,3 +1,34 @@
<?php

return [];
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;

return [

/**
* List of valid date formats to be used for auto-detection.
*/
'date_formats' => [
'mm/dd/yyyy',
NumberFormat::FORMAT_DATE_DATETIME,
NumberFormat::FORMAT_DATE_YYYYMMDD,
NumberFormat::FORMAT_DATE_XLSX22,
NumberFormat::FORMAT_DATE_DDMMYYYY,
NumberFormat::FORMAT_DATE_DMMINUS,
NumberFormat::FORMAT_DATE_DMYMINUS,
NumberFormat::FORMAT_DATE_DMYSLASH,
NumberFormat::FORMAT_DATE_MYMINUS,
NumberFormat::FORMAT_DATE_TIME1,
NumberFormat::FORMAT_DATE_TIME2,
NumberFormat::FORMAT_DATE_TIME3,
NumberFormat::FORMAT_DATE_TIME4,
NumberFormat::FORMAT_DATE_TIME5,
NumberFormat::FORMAT_DATE_TIME6,
NumberFormat::FORMAT_DATE_TIME7,
NumberFormat::FORMAT_DATE_XLSX14,
NumberFormat::FORMAT_DATE_XLSX15,
NumberFormat::FORMAT_DATE_XLSX16,
NumberFormat::FORMAT_DATE_XLSX17,
NumberFormat::FORMAT_DATE_YYYYMMDD2,
NumberFormat::FORMAT_DATE_YYYYMMDDSLASH,
]
];