How can you include column headers when exporting Eloquent to Excel in Laravel?

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Title: Incorporating Column Headers in Laravel Eloquent Excel Exports

Body: We've recently been asked how to include column headers when exporting Eloquent models as an Excel file using Laravel Excel in Laravel applications. Currently, the output shows only data rows without any relevant information about their fields. This blog post will guide you through adding column headers to your generated files.

Let's first review our current code:

  1. Web Route:

    php
    Route::get('/excel/release', 'ExcelController@create')->name('Create Excel');
  2. Eloquent Model and Query:

    php
    class ProductExport implements FromQuery
     {
         use Exportable;
    
         public function __construct(int $id)
         {
             $this->id = $id;
         }
    
         public function query()
         {
             return ProductList::query()->where('id', $this->id);
         }
     }
  3. Controller:

    php
    public function create(Request $request) {
    
     # Only alowed tables
     $alias = [
         'product_list' => ProductExport::class
     ];
    
     # Ensure request has properties
     if(!$request->has('alias') || !$request->has('id'))
         return Redirect::back()->withErrors(['Please fill in the required fields.'])->withInput();
    
     # Ensure they can use this
     if(!in_array($request->alias, array_keys($alias)))
         return Redirect::back()->withErrors(['Alias ' . $request->alias . ' is not supported'])->withInput();
    
     # Download
     return (new ProductExport((int) $request->id))->download('iezon_solutions_' . $request->alias . '_' . $request->id . '.xlsx');
    }

Now, to add column headers:

  1. Import the appropriate libraries:

    php
    use Maatwebsite\Excel\Facades\Excel;
     use Illuminate\Support\Collection;
  2. Create a View class for your Eloquent model and add use Exportable; at the beginning:

    php
    class ProductExport implements FromQuery, WithHeadings
    {
     use Exportable;
    
     public function __construct(int $id)
     {
         $this->id = $id;
     }
    
     public function query()
     {
         return ProductList::query()->where('id', $this->id);
     }
    }

    Here, we've added the WithHeadings trait to our ProductExport class. This trait allows us to add column headers when exporting data as an Excel file.

  3. Change your controller:

    php
    public function create(Request $request) {
    
     # Only alowed tables
     $alias = [
         'product_list' => ProductExport::class
     ];
    
     # Ensure request has properties
     if(!$request->has('alias') || !$request->has('id'))
         return Redirect::back()->withErrors(['Please fill in the required fields.'])->withInput();
    
     # Ensure they can use this
     if(!in_array($request->alias, array_keys($alias)))
         return Redirect::back()->withErrors(['Alias ' . $request->alias . ' is not supported'])->withInput();
    
     # Download
     return (new ProductExport((int) $request->id))->download('iezon_solutions_' . $request->alias . '_' . $request->id . '.xlsx');
    }

    After adding the WithHeadings trait, you can use the collection() method to add column headers to your Excel file. The collection method takes an array of column titles as its first parameter and a callback function with the data as the second one. It then returns a new instance of Collection, which is used to create the Excel file.

Here's a simplified example for adding column headers:

php
return (new ProductExport((int) $request->id))->download('iezon_solutions_' . $request->alias . '_' . $request->id . '.xlsx'), function($query, Collection $collection) {<br>    $collection->map(function($product) use ($columns) {<br>        return array_combine($columns, $product); // create an associative array with column names as keys and respective data as values<br>    });</p>
<pre><code>$headers = ['ID', 'Cost', 'Created At'];

$collection->prependRow(0, $headers); // add the headers to our collection

});

This implementation uses map() to create an associative array with column names and their respective data. Afterwards, it prepends a new row with the desired headers at index 0 using prependRow(). Finally, pass the updated collection back to the download() method along with your original query object.

By following these steps and making use of Laravel's powerful Eloquent capabilities, you can easily generate Excel files containing column headers for your data exports.