Ich versuche, eine vorhandene Datei zu bearbeiten, um sie als Vorlage zu verwenden. Ich weiß jetzt, dass für diese Version diese Funktion nicht einfach zu bedienen ist. Aber ich würde gerne wissen, ob ich die Funktionen im Plugin verwenden und mit function resisterEvents()
könnte. Ich könnte es selbst tun.
Ich muss eine vorhandene Datei herunterladen und ein Blatt auswählen. Aber nicht zu bearbeiten.
Das ist mein 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);
}
];
}
Einige Vorschläge?
Vielen Dank
Ich habe versucht, Informationen in einen Wert mit diesem Code innerhalb von function resisterEvents()
und funktioniert nicht:
AfterSheet::class => function(AfterSheet $event) {
$event->sheet->setCellValue('G2', 'Hello world');
}
Und auch, um Daten über function query()
anzuhängen
Schließlich funktionierte dies für mich in Version 3.1.0. In der aktuellen Version 3.1.10 funktioniert dies nicht, da sich die Funktion reopen
geändert hat. Warten auf neue Updates und Verbesserungen beim Bearbeiten einer vorhandenen Datei.
->reopen()
ist eine interne Methode und sollte mit Vorsicht angewendet werden. Sie können dies wahrscheinlich umgehen, indem Sie new LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'))
zum erneuten Öffnen übergeben.
Das Bearbeiten vorhandener Dateien (Vorlagen) befindet sich in unserer Roadmap (Version 3.3), jedoch ohne ein bestimmtes Veröffentlichungsdatum.
Wenn Sie es vorrangig benötigen, lesen Sie bitte unseren Abschnitt "Kommerzieller Support": https://laravel-excel.com/commercial-support .
Danke für diese schnelle Antwort.
Ich werde es so versuchen.
Dies ist derzeit keine Priorität, aber ich teste, da ich einem vorhandenen Excel Daten mit Makros und dynamischen Tabellen hinzufügen, Daten hinzufügen und Excel-Formeln neu berechnen muss. Ich versuche das alles, weil ich weiß, dass dies mit einem komplexen Excel nicht einfach zu tun ist.
Wenn ich etwas Gutes herausfinde, melde ich mich bei Ihnen
Im Falle eines Updates kommentieren Sie dies bitte so bald wie möglich
Hallo, @MarFelix. Ich hatte das gleiche Problem und jetzt habe ich eine Problemumgehung, die ich verwende. Dies kann Ihnen helfen.
Ich habe mich tief in Mattwebsite-Code vertieft, um zu verstehen, wie der Export erfolgt. Denken Sie also an die folgenden Schritte, mit denen die Datei heruntergeladen wird:
Excel
auf, die Ihre Klasse Export
übergibt (in diesem Beispiel wird die Methode download
verwendet).Excel
-Klasse identifiziert, welche Writer
werden sollen, und ruft die export
-Methode in dieser Writer
.Writer
öffnet Ihr Export
(und ruft BeforeExport
Ereignis auf), füllt dann ein write
-Methode auf.write
-Methode ( Writer
-Klasse) ruft das BeforeWriting
-Ereignis auf und schreibt für andere Typen als XLSX in eine DateiDeshalb funktionieren die BeforeWriting
nicht, und wenn Sie sie für BeforeExport
, funktioniert sie nur in einem NEUEN Blatt.
Um dies zu umgehen, füge ich der Methode ein Flag hinzu, um die Exportdaten abzurufen (in meinem Fall FromCollection). Auf diese Weise wird es in Schritt 2 nicht verarbeitet. Dann markiere ich auf BeforeWriting
die Flagge, hole das gewünschte Blatt und rufe die export
-Methode darauf auf.
Das ist der 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);
},
];
}
Werfen Sie einen Blick auf download
und write
Methoden von Maatwebsite\Excel\Writer
, es wird sehr hilfreich sein.
Mit diesen Informationen und Schritten wäre es möglich, eine komplexere Problemumgehung zu erstellen.
Hilfreichster Kommentar
->reopen()
ist eine interne Methode und sollte mit Vorsicht angewendet werden. Sie können dies wahrscheinlich umgehen, indem Sienew LocalTemporaryFile(storage_path('app/public/files/mytemplate.xlsx'))
zum erneuten Öffnen übergeben.Das Bearbeiten vorhandener Dateien (Vorlagen) befindet sich in unserer Roadmap (Version 3.3), jedoch ohne ein bestimmtes Veröffentlichungsdatum.
Wenn Sie es vorrangig benötigen, lesen Sie bitte unseren Abschnitt "Kommerzieller Support": https://laravel-excel.com/commercial-support .