Laravel-excel: [FRAGE] Verwenden Sie eine vorhandene Datei als Vorlage, um neue Daten vor dem Export anzuhängen

Erstellt am 22. Feb. 2019  ·  5Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

Versionen

  • PHP-Version: 7.2
  • Laravel-Version: 5.7
  • Paketversion: 3.1

Beschreibung

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

zusätzliche Information

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

question

Hilfreichster Kommentar

->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 .

Alle 5 Kommentare

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:

  1. Rufen Sie die Klasse Excel auf, die Ihre Klasse Export übergibt (in diesem Beispiel wird die Methode download verwendet).
  2. Die Excel -Klasse identifiziert, welche Writer werden sollen, und ruft die export -Methode in dieser Writer .
  3. Das Writer öffnet Ihr Export (und ruft BeforeExport Ereignis auf), füllt dann ein write -Methode auf.
  4. Die write -Methode ( Writer -Klasse) ruft das BeforeWriting -Ereignis auf und schreibt für andere Typen als XLSX in eine Datei

Deshalb 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.

War diese Seite hilfreich?
3 / 5 - 1 Bewertungen

Verwandte Themen

contifico picture contifico  ·  3Kommentare

disto picture disto  ·  3Kommentare

alejandri picture alejandri  ·  3Kommentare

octoxan picture octoxan  ·  3Kommentare

ellej16 picture ellej16  ·  3Kommentare