yajra/laravel-datatables-buttons
Laravel DataTables Buttons plugin for server-side exports and printing. Adds CSV, Excel, PDF, and print support to yajra/laravel-datatables with DataTables Buttons integration. Works with Laravel 12+ and PHP 8.3+.
composer require yajra/laravel-datatables-buttons:^13
php artisan vendor:publish --tag=datatables-buttons
yajra/laravel-datatables (required)jQuery DataTables Buttons Extension (client-side)// routes/web.php
Route::get('users/export', [UserDataTable::class, 'export']);
// app/DataTables/UserDataTable.php
use Yajra\DataTables\DataTables;
use Yajra\DataTables\Buttons;
class UserDataTable extends DataTables
{
public function __construct()
{
$this->buttons([
Buttons::export('Excel', 'Excel'),
Buttons::export('CSV', 'CSV'),
]);
}
public function query()
{
return User::query();
}
}
<!-- resources/views/users.blade.php -->
<script>
$(document).ready(function() {
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: '{!! route('users.datatable') !!}',
buttons: [
{ extend: 'excel', title: 'Users Export' },
{ extend: 'csv', title: 'Users Export' }
]
});
});
</script>
$this->buttons([
Buttons::export('Excel', 'Excel'),
Buttons::export('CSV', 'CSV'),
Buttons::export('PDF', 'PDF'),
Buttons::print('Print', 'Print'),
]);
$this->buttons([
Buttons::make('customExport')
->className('btn btn-primary')
->action(function($query, $export) {
return $query->get()->map(fn($user) => [
'name' => $user->name,
'custom_field' => $user->custom_field ?? 'N/A',
]);
})
->exportOpenSingle(true)
->title('Custom Export'),
]);
$this->buttons([
Buttons::export('Excel', 'Excel')
->visible(function() {
return auth()->user()->can('export_users');
}),
]);
// app/DataTables/OrderDataTable.php
public function query()
{
return Order::with('customer')
->select('orders.*')
->query();
}
public function getCustomerName($order)
{
return $order->customer->name;
}
public function getColumns()
{
return [
['data' => 'id', 'name' => 'id'],
['data' => 'getCustomerName', 'name' => 'customer_name'],
['data' => 'amount', 'name' => 'amount'],
];
}
// app/Http/Resources/UserResource.php
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
// app/DataTables/UserDataTable.php
public function query()
{
return User::query()->with('roles');
}
public function getExportOptions()
{
return [
'columns' => [
['data' => 'id', 'name' => 'ID'],
['data' => 'name', 'name' => 'Name'],
['data' => 'email', 'name' => 'Email'],
['data' => 'roles.name', 'name' => 'Roles'],
],
];
}
// app/Providers/DataTableServiceProvider.php
use Illuminate\Support\ServiceProvider;
use Yajra\DataTables\DataTables;
class DataTableServiceProvider extends ServiceProvider
{
public function boot()
{
DataTables::macro('addAuditColumns', function($table) {
$this->columns([
['data' => 'created_at', 'name' => 'Created At'],
['data' => 'updated_at', 'name' => 'Updated At'],
]);
return $this;
});
}
}
// Usage:
$this->addAuditColumns($this)
->buttons([...]);
// app/DataTables/LogDataTable.php
public function query()
{
return Log::query()
->select('id', 'user_id', 'action', 'created_at')
->orderBy('created_at', 'desc');
}
public function getExportOptions()
{
return [
'columns' => [
['data' => 'id', 'name' => 'ID'],
['data' => 'action', 'name' => 'Action'],
['data' => 'created_at', 'name' => 'Timestamp'],
],
'chunk' => 1000, // Process in chunks
];
}
query() method or incorrect column mappings.public function getColumns()
{
return [
['data' => 'id', 'name' => 'ID'], // Ensure 'data' matches query results
['data' => 'name', 'name' => 'Name'],
];
}
exportRender() without defining the column in getColumns().public function getColumns()
{
return [
['data' => 'id', 'name' => 'ID'],
['data' => 'getFormattedName', 'name' => 'Name'], // Must match method name
];
}
public function getFormattedName($user)
{
return ucfirst($user->name);
}
exportFormat without fast-excel or OpenSpout.public function getExportOptions()
{
return [
'excel' => [
'exportFormat' => 'OpenSpout', // Defaults to OpenSpout in v13.1.0+
'styles' => [
'font' => ['bold' => true],
'alignment' => ['horizontal' => 'center'],
],
],
];
}
public function query()
{
$query = User::query();
\Log::debug($query->toSql(), $query->getBindings());
return $query;
}
public function getExportData()
{
$data = $this->query()->get();
\Log::info('Export Data:', $data->toArray());
return $data;
}
public function buttons()
{
return [
Buttons::export('Excel', 'Excel')
->className('btn btn-success')
->options([
'title' => 'Custom Title',
'modify' => true, // Enable customization
]),
];
}
// config/datatables-buttons.php
'buttons' => [
'export' => [
'excel' => [
'title' => 'Laravel DataTables Export',
'modify' => true,
],
],
],
php artisan vendor:publish --tag=datatables-buttons --force
public_path() in config/datatables-buttons.php if assets are not loading.// routes/web.php
Route::get('users/export-custom', function() {
$dataTable = new UserDataTable();
return $dataTable->export('customExport');
});
// Register a macro globally
DataTables::macro('addCustomButton', function($button) {
$this->buttons[] = $button;
return $this;
});
// Usage:
$this->addCustomButton(Buttons::export('Excel', 'Excel'));
use App\Enums\UserStatus;
public function getStatus($user)
{
return UserStatus::from($user->status)->value;
}
public function getColumns()
{
return [
['data' => 'getStatus', 'name' => 'Status'],
];
}
How can I help you explore Laravel packages today?