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
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()
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:
Excel
passant votre classe Export
(cet exemple utilise la méthode download
)Excel
identifie quel Writer
doit être utilisé et appelle la méthode export
dans ce Writer
.Writer
ouvre votre Export
(et appelle l'événement BeforeExport
), puis remplit une NOUVELLE feuille, puis appelle sa propre méthode write
.write
( Writer
class) appellera l'événement BeforeWriting
et écrira sur fichier pour d'autres types que XLSXC'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.
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 passantnew 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 .