6
votes

Comment pouvez-vous inclure des en-têtes de colonne lors de l'exportation d'Eloquent vers Excel dans Laravel?

J'essaie d'autoriser les utilisateurs à télécharger Excel, en utilisant des fichiers Laravel Excel contenant des informations sur le produit. Mon itinéraire Web actuel ressemble à ceci:

1   150 1   3       2019-01-16 16:37:25 2019-01-16 16:37:25     10

Mon exportation actuelle ressemble à ceci:

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');
}

Mon contrôleur actuel ressemble à ceci: p>

class ProductExport implements FromQuery
{
    use Exportable;

    public function __construct(int $id)
    {
        $this->id = $id;
    }

    public function query()
    {
        return ProductList::query()->where('id', $this->id);
    }
}

Lorsque je me dirige vers https://example.com/excel/release?alias=product_list&id=1 cela s'exécute correctement et renvoie un fichier Excel . Cependant, il n'y a pas d'en-tête de colonne pour les lignes. Les données sortent comme ceci:

Route::get('/excel/release', 'ExcelController@create')->name('Create Excel');

Cependant, cela devrait contenir des en-têtes de colonne comme ID, coût, etc. p>


0 commentaires

4 Réponses :


10
votes

Selon la documentation vous pouvez modifier votre classe pour utiliser l'interface WithHeadings , puis définir la fonction headings pour renvoyer un tableau d'en-têtes de colonne:

<?php
namespace App;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;

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);
    }

    public function headings()
    {
        return ["your", "headings", "here"];
    }
}

Cela fonctionne avec tous les types d'export ( FromQuery , FromCollection , etc.)


5 commentaires

Merci pour cela! Existe-t-il un moyen d'utiliser Eloquent pour obtenir les colonnes de la base de données de manière dynamique? J'accepterai dès que possible!


Si vous exportez toutes les colonnes du tableau: stackoverflow.com/a/37157879/1255289


comment appeler la méthode des titres dans le contrôleur?


@ miken32 Existe-t-il un moyen de passer le tableau aux en-têtes à partir des fonctions query ou au moins de le mettre à jour et de le rendre disponible sur les en-têtes. En fait, je n'ai besoin d'ajouter des titres que s'il y a des données sur cette colonne. Alors, y a-t-il une solution de contournement pour cela?


C'est une fonction. Vous pouvez faire ce que vous voulez avec @SarojShrestha. Regardez le code de la classe, il est probable que les données soient une propriété à laquelle vous pouvez accéder.



8
votes
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use DB;
class LocationTypeExport implements FromCollection,WithHeadings
{
    public function collection()
    {
        $type = DB::table('location_type')->select('id','name')->get();
        return $type ;
    }
     public function headings(): array
    {
        return [
            'id',
            'name',
        ];
    }
}

1 commentaires

Cela n'a fonctionné qu'avec: array pour moi, probablement à cause d'une version plus récente.



0
votes
<?php

namespace App\Exports;

use App\Models\UserDetails;
use Maatwebsite\Excel\Concerns\FromCollection;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;

class CustomerExport implements FromCollection, WithHeadings
{
   
    public function collection()
    {
        return UserDetails::whereNull('business_name')
        ->select('first_name','last_name','mobile_number','dob','gender')
        ->get();
    }

   
    public function headings() :array
    {
        return ["First Name", "Last Name", "Mobile","DOB", "Gender"];
    }
}

0 commentaires

0
votes

Ce code fonctionne pour moi

use App\Newsletter;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class NewsletterExport implements FromCollection, WithHeadings
{
    public function headings(): array
    {
        return [
            'Subscriber Id',
            'Name',
            'Email',
            'Created_at',
        ];
    }

    public function collection()
    {
        return Newsletter::where('isSubscribed', true)->get(['id','name','email','created_at']);
    }
}


0 commentaires