Laravel-excel: [QUESTION] Utilisez le fichier existant comme modèle pour ajouter de nouvelles données avant l'exportation

Créé le 22 févr. 2019  ·  5Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Conditions préalables

Versions

  • Version PHP: 7.2
  • Version Laravel: 5.7
  • Version du paquet: 3.1

La description

J'essaye de modifier un fichier existant à utiliser comme modèle. J'ai maintenant que pour cette version, cette fonction n'est pas développée pour être utilisée facilement. Mais j'aimerais savoir si en utilisant les fonctions à l'intérieur du plugin et en jouant avec le function resisterEvents() je pourrais le faire moi-même.

Je dois télécharger un fichier existant et sélectionner une feuille. Mais pas pour le modifier.

Voici mon code:

    /**
     * <strong i="16">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            BeforeWriting::class  => function(BeforeWriting $event) {
                $event->writer->reopen(storage_path('app/public/files/mytemplate.xlsx'),Excel::XLSX);
                $event->writer->getSheetByIndex(0);
                return $event->getWriter()->getSheetByIndex(0);
            }
        ];
    }

Quelques suggestions?

Merci beaucoup

Informations Complémentaires

J'ai essayé d'ajouter des informations dans une valeur avec ce code à l'intérieur du function resisterEvents() et ne fonctionne pas:

AfterSheet::class => function(AfterSheet $event) {
       $event->sheet->setCellValue('G2', 'Hello world');
}

Et aussi pour ajouter des données via function query()

question

Commentaire le plus utile

->reopen() est une méthode interne et doit être utilisée avec prudence. Vous pouvez probablement contourner ce problème en passant new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) pour rouvrir.

La modification des fichiers existants (modèles) est sur notre feuille de route (version 3.3), mais sans date de sortie spécifique.

Si vous en avez besoin en priorité, veuillez consulter notre section Assistance commerciale: https://laravel-excel.com/commercial-support .

Tous les 5 commentaires

Enfin, cela a fonctionné pour moi sur la version 3.1.0. Dans la version actuelle 3.1.10, cela ne fonctionne pas car la fonction reopen a changé. En attente de nouvelles mises à jour et améliorations de l'édition d'un fichier existant.

->reopen() est une méthode interne et doit être utilisée avec prudence. Vous pouvez probablement contourner ce problème en passant new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx')) pour rouvrir.

La modification des fichiers existants (modèles) est sur notre feuille de route (version 3.3), mais sans date de sortie spécifique.

Si vous en avez besoin en priorité, veuillez consulter notre section Assistance commerciale: https://laravel-excel.com/commercial-support .

Merci pour cette réponse rapide.

J'essaierai de cette façon.

Ce n'est pas une priorité pour le moment, mais je teste car je devrai ajouter des données à un Excel existant avec des macros et des tables dynamiques, en ajoutant des données et en recalculant des formules Excel. J'essaye tout cela parce que je sais que ce n'est pas facile à faire avec un Excel complexe.

Si je découvre quelque chose de bien, je vous le rapporterai

En cas de mise à jour, veuillez commenter dès que possible

Bonjour, @MarFelix. J'étais confronté au même problème et maintenant j'ai une solution de contournement que j'utilise. Cela peut vous aider.
J'ai creusé profondément dans le code de Mattwebsite pour comprendre comment l'exportation est effectuée. Alors rappelez-vous ces étapes qui sont utilisées pour télécharger le fichier:

  1. Appelez la classe Excel passant votre classe Export (cet exemple utilise la méthode download )
  2. La classe Excel identifie quel Writer doit être utilisé et appelle la méthode export dans ce Writer .
  3. Le Writer ouvre votre Export (et appelle l'événement BeforeExport ), puis remplit une NOUVELLE feuille, puis appelle sa propre méthode write .
  4. La méthode write ( Writer class) appellera l'événement BeforeWriting et écrira sur fichier pour d'autres types que XLSX

C'est pourquoi le BeforeWriting ne fonctionne pas, et si vous l'utilisez sur BeforeExport cela fonctionnera mais dans une NOUVELLE feuille.

Pour contourner le problème, j'ajoute un indicateur sur la méthode pour obtenir les données d'exportation (dans mon cas FromCollection). De cette façon, il ne sera pas traité à l'étape 2. Ensuite, sur BeforeWriting je marque le drapeau, récupère la feuille voulue et j'appelle la méthode export dessus.

C'est le code:

public function collection()
{
    if ($this->calledByEvent) { // flag
        return $this->myCollectionToExport;
    }

    return collect([]);
}

public function registerEvents(): array
{
    return [
        BeforeWriting::class => function(BeforeWriting $event) {
            $templateFile = new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'));
            $event->writer->reopen($templateFile, Excel::XLSX);
            $event->writer->getSheetByIndex(0);

            $this->calledByEvent = true; // set the flag
            $event->writer->getSheetByIndex(0)->export($event->getConcernable()); // call the export on the first sheet

            return $event->getWriter()->getSheetByIndex(0);
        },
    ];
}

Jetez un œil aux méthodes download et write de Maatwebsite\Excel\Writer , ce sera très utile.

Avec ces informations et étapes, il serait possible de créer une solution de contournement plus complexe.

Cette page vous a été utile?
3 / 5 - 1 notes