Exporting data to an Excel file is a common requirement in many applications. Laravel Excel provides a straightforward way to generate Excel files with data from your application. In this guide, we’ll walk through the process of creating an Excel export file using Laravel Excel and including dropdowns with predefined options.
In this blog I’ll create an Excel file export, because I want to let the user define the relations already. The Excel export which can later be imported back in the Laravel app will contain the dropdown containing the name of the relations.
Setting Up Laravel Excel and the Export Class
To get started, make sure you have Laravel installed along with the Laravel Excel package. Next, create an export class (ItemExport
in this case) that implements the necessary interfaces (FromCollection
, WithHeadings
, and WithEvents
).
namespace App\Exports;
use App\Models\Supplier;
use Maatwebsite\Excel\Concerns\Exportable;
class ItemExport implements FromCollection, WithHeadings, WithEvents
{
use Exportable;
protected $selects;
protected $rowCount;
protected $columnCount;
public function __construct()
{
$suppliers = Supplier::orderBy('name')->pluck('name')->toArray();
$selects = [
['columns_name' => 'A', 'options' => $suppliers],
];
$this->selects = $selects;
$this->rowCount = count($suppliers) + 1;
$this->columnCount = 11;
}
}
Adding Dropdowns to Excel File
In the ItemExport
class, the registerEvents()
method is used to define the behavior after the Excel sheet is created. Inside this method, we’ll set up dropdowns for specified columns.
public function registerEvents(): array
{
return [
AfterSheet::class => function (AfterSheet $event) {
$row_count = $this->rowCount;
$column_count = $this->columnCount;
$hiddenSheet = $event->sheet->getDelegate()->getParent()->createSheet();
$hiddenSheet->setTitle('Hidden');
$hiddenSheet->setSheetState(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN);
foreach ($this->selects as $select) {
$drop_column = $select['columns_name'];
$options = $select['options'];
foreach ($options as $index => $option) {
$cellCoordinate = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex(1) . ($index + 1);
$hiddenSheet->setCellValue($cellCoordinate, $option);
}
$validation = $event->sheet->getCell("{$drop_column}2")->getDataValidation();
$validation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST);
$validation->setShowDropDown(true);
$validation->setFormula1('Hidden!$A$1:$A$' . count($options));
for ($i = 3; $i <= $row_count; $i++) {
$event->sheet->getCell("{$drop_column}{$i}")->setDataValidation(clone $validation);
}
for ($i = 1; $i <= $column_count; $i++) {
$column = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i);
$event->sheet->getColumnDimension($column)->setAutoSize(true);
}
}
},
];
}
Usage and Output
To use the ItemExport
class, instantiate it and export the data.
use App\Exports\ItemExport;
use Maatwebsite\Excel\Facades\Excel;
public function export()
{
return Excel::download(new ItemExport(), 'exported_data.xlsx');
}
When executed, this will generate an Excel file (exported_data.xlsx
) with the specified columns and dropdowns in the designated columns (A in this example), containing the predefined options.
Feel free to adjust the column names, options, and other configurations according to your specific use case.
Laravel News Links