2
votes

Laravel Excel 3.1 exporte des données volumineuses

J'ai besoin d'exporter plus de 100K enregistrements vers Excel à partir de la base de données en utilisant le plugin Maatwebsite Laravel excel 3.1, le problème est que j'obtiens les données sous forme de tableau.

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\SerializesModels;

class ExcelExport implements FromQuery
{
 use Exportable, SerializesModels;
 private $data;

public function __construct($data)
{   
   $this->data = $data;     //Inject data 
}

public function query()
{   
   return $this->data;  
}
}

Ma classe ExcelExport:

$data = $this->client->getData("sc/asistencia-social/informe",$request->all());

 return (new ExcelExport($data))->store('myFile.xlsx'); //using FromQuery

En fait, j'obtiens une erreur "Appel à une fonction membre chunk () on array". J'ai même essayé de le convertir en une collection sans succès. Y a-t-il une solution possible à cela?


0 commentaires

3 Réponses :


2
votes

Vous avez créé votre classe d'exportation en tant que classe d'exportation FromQuery . à la place, créez une classe d'exportation FromArray .

Notez l'interface Implémenter et le nom de la fonction

class ExcelExport implements FromArray // this was FromQuery before
{
    use Exportable, SerializesModels;

    private $data;

    public function __construct($data)
    {   
        $this->data = $data;     //Inject data 
    }

    public function array(): array // this was query() before
    {   
        return $this->data;  
    }
}


6 commentaires

Je le teste et j'obtiens une "Déclaration de App \ Exports \ ExcelExport :: array () doit être compatible avec Maatwebsite \ Excel \ Concerns \ FromArray :: array (): array"


Je pense que c'est à cause du type de retour manquant de la fonction array () , mise à jour de la réponse


Il est toujours en cours d'exécution, cela prend plus de 4 minutes pour exporter environ 30k enregistrements, j'ai lu le FromQuery exploite des morceaux, certains disent seulement à l'importation mais pas à l'exportation. est-ce vrai?


Non, vous POUVEZ utiliser FromQuery pour exporter également, et c'est aussi mieux que cette approche. Mais si vous voulez faire cela, vous ne voulez pas passer de données via le constructeur. vous devez écrire une requête de base de données dans la fonction query () . S'il y a beaucoup de données dans la base de données, je pense que c'est la meilleure solution.


ok, dans mon cas, $ data = $ this-> client-> getData ("sc / asistencia-social / informe", $ reque‌ st-> all ()); envoyer une requête à l'API pour interroger la base de données, le système n'utilise pas ORM uniquement SQL avec des paramètres comme une plage de dates, est-ce toujours possible?


Pas possible. Si vous souhaitez utiliser l'approche FromQuery , vous devez fournir une requête SQL à cette fonction query () . Ensuite, ils se chargeront de récupérer les données de la base de données (c'est là qu'ils appliquent les morceaux). Sinon, vous ne pouvez pas utiliser l'approche FromQuery .



0
votes

Cela a fonctionné

Dans Query remove -> get () ou replace with -> paginate (100)

avec l'exportation de la file d'attente maatwebsite.


0 commentaires

0
votes

Vous devez utiliser shouldQueue pour exporter des données volumineuses vers un fichier Excel.


0 commentaires