Laravel-excel: Fehler beim Öffnen der Datei mit Excel. Möglicherweise beschädigte Daten oder fehlerhafte Dateierweiterung.

Erstellt am 24. Mai 2018  ·  15Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Voraussetzungen

  • [ x] In der Lage, das Verhalten außerhalb Ihres Codes zu reproduzieren, wird das Problem auf Laravel Excel isoliert.
  • [x ] Es wurde überprüft, ob Ihr Problem nicht bereits eingereicht wurde.
  • [ x] Geprüft, wenn keine PR gesendet wurde, die dieses Problem behebt.

Versionen

  • PHP-Version: 7.1
  • Laravel-Version: 5.5.*
  • Paketversion: ^3.0

Beschreibung

Datei von einer FromQuery-Methode herunterladen.... Dateidownloads erhalten beim Öffnen der XLSX-Datei eine Fehlermeldung von Office:
"Excel kann die Datei nicht öffnenweil das Dateiformat oder die Dateierweiterung ungültig ist. Stellen Sie sicher, dass die Datei nicht beschädigt ist und die Dateierweiterung dem Dateiformat entspricht."

Schritte zum Reproduzieren

Hier ist meine Methode

namespace Modules\Profile\Exports;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Modules\Profile\Entities\Profile;

class ProfileExport implements FromQuery
{
    use Exportable;

    public function __construct($range)
    {
        $this->start = $range['start'];
        $this->end = $range['end'];
    }

    public function query()
    {
      return Profile::query()->where('created_at', '>=', $this->start . ' 00:00:00')
                             ->where('created_at', '<=', $this->end . ' 23:59:59')
                             ->whereHas('user.roles', function($query){
                                  $query->where('id', 2);
                             });
    }
}

Ich nenne es so von einem Controller aus

//$request->start = '2018-01-01';
//$request->end = '2018-05-01';

$range = ['start'=>$request->start, 'end'=>$request->end];
return (new ProfileExport($range))->download($request->start . '-' . $request->end .'-pet-parent-signups.xlsx');

Erwartetes Verhalten:

Die Datei, die mit Daten heruntergeladen werden soll

Tatsächliches Verhalten:

Die Datei wird heruntergeladen, aber Excel gibt beim Öffnen einen Fehler aus

zusätzliche Information

Ich habe die Abfrage in eloquent getestet und sie gibt eine Sammlung mit Daten zurück.

(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)

Hilfreichster Kommentar

Hallo allerseits,

Ich verbringe meinen Tag damit, diese unpraktische Download-Funktion zu verstehen. PHPSpreadSheet scheint PHP-Puffer zu verwenden. Und je nach PHP-Konfiguration können einige Warnungen oder Fehler die Ausgabe beeinträchtigen.

Verwendung:

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

löst sich für mich.
Vielleicht sollte es einigen Leuten helfen.

Vielen Dank für diese tolle Bibliothek.

Alle 15 Kommentare

Danke auch im Voraus :)

Vor allem, um sich die Zeit zu nehmen, diesen Wrapper zu schreiben, um damit anzufangen

Ich bin mir nicht sicher, ob es immer noch das gleiche Problem mit PhpSpreadsheet ist, aber PHPExcel hatte Probleme mit Leerzeichen ( ) vor <?php offenen Tags. Das hat in der Vergangenheit zu diesem Fehler geführt.

Sie können die Fehlerdatei mit nano oder vim öffnen.
Wenn Sie ein Leerzeichen vor PK sehen, einfach so:
image
Möglicherweise ist ein Fehler in Ihrem Code oder Anbieter aufgetreten. Ich habe das gleiche Problem und beschäftige mich mit dem Entfernen des Vendor-Ordners. Es funktioniert gut Nach der Neuinstallation des Anbieters

Hallo zusammen, danke für den Hinweis.

Ich denke, Sie haben Recht, dass am Anfang der Datei ein zusätzlicher Zeilenumbruch oder etwas anderes steht. Ich habe es noch nicht verfolgt, aber wenn ich zu CSV wechsle, kann ich die Datei öffnen und die Daten sind da, aber die erste Zeile ist leer....

Werde noch weiter suchen, werde mich wieder melden. Ich suchte nach einer Datei, die mit einem Zeilenumbruch begann und dann

Ich werde dies schließen und ein neues mit einer besseren Beschreibung des Problems öffnen. Ich kann die Quelle der leeren Zeile nicht finden

Ich habe das gleiche Problem getroffen. Ich habe repariert von

  • Excel::store zum Speichern der Datei auf dem Server
  • Rückgabeumleitung( Storage::url("storage/{$filename}" ));
    Probe
    ```
    öffentlicher Funktionsexport (Anfrage $request)
    {
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

Hallo allerseits,

Ich verbringe meinen Tag damit, diese unpraktische Download-Funktion zu verstehen. PHPSpreadSheet scheint PHP-Puffer zu verwenden. Und je nach PHP-Konfiguration können einige Warnungen oder Fehler die Ausgabe beeinträchtigen.

Verwendung:

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

löst sich für mich.
Vielleicht sollte es einigen Leuten helfen.

Vielen Dank für diese tolle Bibliothek.

Hallo allerseits,

Ich verbringe meinen Tag damit, diese unpraktische Download-Funktion zu verstehen. PHPSpreadSheet scheint PHP-Puffer zu verwenden. Und je nach PHP-Konfiguration können einige Warnungen oder Fehler die Ausgabe beeinträchtigen.

Verwendung:

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

löst sich für mich.
Vielleicht sollte es einigen Leuten helfen.

Vielen Dank für diese tolle Bibliothek.

Vielen Dank, die perfekte Antwort

Hallo allerseits,

Diese Lösung :

ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

Funktioniert und löst das korrupte Problem. Habe aber immer noch Probleme beim Export mit Xlsx/Xls.
Die heruntergeladene Datei sieht so aus:
image

Irgendeine Idee, wie man das beheben kann?

Vielen Dank !

Hallo allerseits,

Ich verbringe meinen Tag damit, diese unpraktische Download-Funktion zu verstehen. PHPSpreadSheet scheint PHP-Puffer zu verwenden. Und je nach PHP-Konfiguration können einige Warnungen oder Fehler die Ausgabe beeinträchtigen.

Verwendung:

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

löst sich für mich.
Vielleicht sollte es einigen Leuten helfen.

Vielen Dank für diese tolle Bibliothek.

Liebe dich, Mann.. Du hast meinen Kopf gerettet...

Ich bin mir nicht sicher, ob es immer noch das gleiche Problem mit PhpSpreadsheet ist, aber PHPExcel hatte Probleme mit Leerzeichen ( ) vor <?php offenen Tags. Das hat in der Vergangenheit zu diesem Fehler geführt.

Hallo @patrickbrouwers
Vielen Dank für Ihren Kommentar.
Löst für mich.

Wenn Sie Ajax zum Herunterladen verwenden,
Bitte fügen Sie responseType: 'blob' zu Ihrer Ajax-Anfrage hinzu (ich verwende Axios)

Mein Beispielcode:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Ohne responseType: 'blob' kann die heruntergeladene Datei nicht geöffnet werden

Wenn Sie Ajax zum Herunterladen verwenden,
Bitte fügen Sie responseType: 'blob' zu Ihrer Ajax-Anfrage hinzu (ich verwende Axios)

Mein Beispielcode:

axios.post('/path/to/export', data, {
    responseType: 'blob',
})
.then(response => {
    const filename = 'file.xlsx';
    let blob = new Blob([response.data], {
        type: 'application/octet-stream',
    });

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
        // IE workaround for "HTML7007: One or more blob URLs were
        // revoked by closing the blob for which they were created.
        // These URLs will no longer resolve as the data backing
        // the URL has been freed."
        window.navigator.msSaveBlob(blob, filename);
    } else {
        let blobURL = window.URL.createObjectURL(blob);
        let tempLink = document.createElement('a');
        tempLink.style.display = 'none';
        tempLink.href = blobURL;
        tempLink.download = filename;
        tempLink.click();
        window.URL.revokeObjectURL(blobURL);
    }
})

Ohne responseType: 'blob' kann die heruntergeladene Datei nicht geöffnet werden

Dank!! rette mein Leben, ich schaue mir immer wieder an, welche PHP-Codezeile meine exportierte Datei beschädigt hat

Hallo allerseits,

Ich verbringe meinen Tag damit, diese unpraktische Download-Funktion zu verstehen. PHPSpreadSheet scheint PHP-Puffer zu verwenden. Und je nach PHP-Konfiguration können einige Warnungen oder Fehler die Ausgabe beeinträchtigen.

Verwendung:

// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');

löst sich für mich.
Vielleicht sollte es einigen Leuten helfen.

Vielen Dank für diese tolle Bibliothek.

Danke @Leenzuur , du hast meinen Tag gerettet! Es funktionierte! Ich frage mich, ob es irgendwelche gibt, um dies zu beheben, aber @Leenzuur , Sie wissen, was ich meine, wenn ich 10

Dieses Problem trat bei mir heute auf, ohne dass sich der Export geändert hat. Mit @leenzuur- Codebeispiel wurde es nach stundenlanger Recherche behoben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen