yajra/laravel-datatables-buttons
Laravel DataTables Buttons plugin for server-side exports and printing. Adds CSV/Excel/PDF generation and print support for jQuery DataTables Buttons extension, integrated with yajra/laravel-datatables on modern Laravel and PHP versions.
Install the package:
composer require yajra/laravel-datatables-buttons:^13
Publish assets (optional):
php artisan vendor:publish --tag=datatables-buttons
(Required only if you need custom button styles or JS overrides.)
First use case: Extend a DataTable class and add buttons to an existing DataTables instance:
use Yajra\DataTables\Facades\DataTables;
use Yajra\DataTables\Buttons;
// In your controller:
public function anyData()
{
return DataTables::of(User::query())
->addColumn('action', function($user) {
return '<button>View</button>';
})
->addButtons([
Buttons::export('csv', 'csv'),
Buttons::export('excel', 'excel'),
Buttons::printButton(),
])
->make(true);
}
Frontend integration: Include the DataTables Buttons JS/CSS in your blade template:
<script src="https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.print.min.js"></script>
// Controller
public function users()
{
return DataTables::of(User::query())
->addButtons([
Buttons::export('csv', 'CSV'),
Buttons::export('excel', 'Excel'),
Buttons::export('pdf', 'PDF'),
])
->make(true);
}
Buttons::export() with format and label arguments.Override default export behavior using exportRender() or exportOptions():
$dt = DataTables::of(User::query())
->addColumn('full_name', function($user) {
return $user->first_name . ' ' . $user->last_name;
})
->editColumn('full_name', function($user) {
return '<strong>' . $user->full_name . '</strong>';
})
->addButtons([
Buttons::export('csv', 'CSV', function($query) {
return $query->select('id', 'full_name as name', 'email');
}),
]);
$dt = DataTables::of(User::query())
->addButtons([
Buttons::printButton('Print', function($query) {
return $query->select('id', 'name', 'email');
}, 'print-view'), // Custom view name
]);
resources/views/print-view.blade.php).exportOptions() to customize headers/footers:
->addButtons([
Buttons::printButton('Print', null, null, 'print-view', 'Print Users', true, true, [
'buttons' => ['print', 'reset'],
'title' => 'User List',
'footer' => 'Page <span data-dt-footer="page"></span> of <span data-dt-footer="total"></span>',
]),
])
Use Buttons::buttons() for complex setups:
$dt = DataTables::of(User::query())
->addButtons([
Buttons::buttons([
'buttons' => [
['extend' => 'csv', 'text' => 'CSV Export'],
['extend' => 'excel', 'text' => 'Excel Export'],
['extend' => 'pdf', 'text' => 'PDF Export'],
['extend' => 'print', 'text' => 'Print'],
],
'init' => function($context, $button) {
// Custom logic (e.g., disable buttons for admins)
if (auth()->user()->is_admin) {
return false;
}
return true;
},
]),
]);
Define reusable button configurations using macros (Laravel 12+):
// In AppServiceProvider@boot()
DataTables::macro('adminExportButtons', function($query) {
return [
Buttons::export('csv', 'CSV', $query),
Buttons::export('excel', 'Excel', $query),
Buttons::printButton('Print', $query, 'admin-print-view'),
];
});
// Usage:
$dt = DataTables::of(User::query())
->addButtons(DataTables::adminExportButtons(User::query()));
Leverage exportRender() for Complex Data:
$dt = DataTables::of(Order::query())
->addColumn('total', function($order) {
return '$' . number_format($order->amount, 2);
})
->addButtons([
Buttons::export('csv', 'CSV', null, null, 'orders-export', function($query) {
return $query->with('user:id,name')->select('id', 'user_id', 'amount as total');
}),
]);
Custom Export Filenames:
Buttons::export('csv', 'CSV', null, null, 'custom-filename', function($query) {
return $query->select('id', 'name');
}, 'orders-export-' . now()->format('Y-m-d'));
Conditional Buttons:
$buttons = [];
if (auth()->user()->can('export')) {
$buttons[] = Buttons::export('csv', 'CSV');
}
$dt->addButtons($buttons);
Route-Based Exports:
Use Buttons::route() for custom routes:
$dt = DataTables::of(User::query())
->addButtons([
Buttons::route('export.csv', 'CSV', 'export.csv', 'CSV Export'),
Buttons::route('export.excel', 'Excel', 'export.excel', 'Excel Export'),
]);
routes/web.php:
Route::get('export/csv', [UserController::class, 'exportCsv'])->name('export.csv');
OpenSpout (Excel) Customization:
$dt = DataTables::of(User::query())
->addButtons([
Buttons::export('excel', 'Excel', null, null, 'users-export', function($query) {
return $query->select('id', 'name', 'email');
}, [
'title' => 'User Export',
'creator' => 'MyApp',
'modDate' => now(),
'customProperties' => [
'Company' => 'MyCompany',
],
]),
]);
Asset Loading Issues:
<!-- Correct order -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.print.min.js"></script>
vendor:publish to customize button assets if needed.CSV/Excel Encoding Problems:
é, ñ) appear as ?? in exports.config/datatables.php:
'buttons' => [
'exportOptions' => [
'charset' => 'UTF-8',
],
],
exportOptions() in your DataTable:
->addButtons([
Buttons::export('csv',
How can I help you explore Laravel packages today?