Laravel-excel: Erreur lors de l'ouverture du fichier avec Excel. Données possibles corrompues ou mauvaise extension de fichier.

Créé le 24 mai 2018  ·  15Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Conditions préalables

  • [x] Capable de reproduire le comportement en dehors de votre code, le problème est isolé à Laravel Excel.
  • [x ] Vérifié que votre problème n'est pas déjà classé.
  • [ x] Coché si aucun PR n'a été soumis pour résoudre ce problème.

Versions

  • Version PHP : 7.1
  • Version Laravel : 5.5.*
  • Version du package : ^3.0

La description

Téléchargement de fichier à partir d'une méthode FromQuery.... les téléchargements de fichiers, lors de l'ouverture du fichier XLSX, reçoivent un message d'erreur d'Office :
"Excel ne peut pas ouvrir le fichiercar le format de fichier ou l'extension de fichier n'est pas valide. Vérifiez que le fichier n'a pas été corrompu et que l'extension de fichier correspond au format du fichier"

Étapes pour reproduire

voici ma méthode

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);
                             });
    }
}

Je l'appelle comme ça depuis un contrôleur

//$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');

Comportement attendu:

Le fichier à télécharger avec les données

Comportement réel :

Le fichier se télécharge mais Excel donne une erreur en l'ouvrant

Information additionnelle

J'ai testé la requête en éloquent et elle renvoie une collection avec des données.

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

Commentaire le plus utile

Salut à tous,

Je passe ma journée à comprendre cette fonction de téléchargement inutilisable. PHPSpreadSheet semble utiliser le tampon PHP. Et selon votre configuration PHP, certains avertissements ou erreurs peuvent interférer avec la sortie.

Utilisant :

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

résout pour moi.
Cela devrait peut-être aider certaines personnes.

Merci pour cette superbe bibliothèque.

Tous les 15 commentaires

Merci aussi d'avance :)

Surtout pour avoir pris le temps d'écrire cette enveloppe pour commencer

Je ne sais pas si c'est toujours le même problème avec PhpSpreadsheet, mais PHPExcel a eu des problèmes avec les espaces ( ) devant les balises ouvertes <?php . Cela provoquait cette erreur dans le passé.

Vous pouvez ouvrir le fichier d'erreur avec nano ou vim.
Si vous voyez un espace avant PK, comme ça
image
Peut-être qu'une erreur s'est produite dans votre code ou votre fournisseur. J'ai rencontré le même problème et je m'occupe de supprimer le dossier du fournisseur. Cela fonctionne bien après réinstallation du vendeur

Salut à tous, merci pour la piste.

Je pense que vous avez raison de dire qu'il y a un saut de ligne supplémentaire ou quelque chose au début du fichier. Je ne l'ai pas encore tracé mais quand je passe en CSV, je peux ouvrir le fichier et les données sont là mais la première ligne est vide....

Je vais chercher un peu plus, je ferai un mauvais rapport. J'ai cherché un fichier commençant par un saut de ligne, puis

Je vais fermer ceci et en ouvrir un nouveau avec une meilleure description du problème. Je ne trouve pas la source de la ligne vide

j'ai rencontré le même problème. j'ai corrigé par

  • Excel :: stocker pour stocker le fichier sur le serveur
  • return redirect( Storage::url("storage/{$filename}" ));
    goûter
    ```
    exportation de fonction publique (Requête $requête)
    {
    $filename = 'meal_list_'.date('YmdHis').'.xlsx';
     Excel::store(new MealExport($request), $filename, 'public');
     return redirect( Storage::url("storage/{$filename}" ));
}

Salut à tous,

Je passe ma journée à comprendre cette fonction de téléchargement inutilisable. PHPSpreadSheet semble utiliser le tampon PHP. Et selon votre configuration PHP, certains avertissements ou erreurs peuvent interférer avec la sortie.

Utilisant :

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

résout pour moi.
Cela devrait peut-être aider certaines personnes.

Merci pour cette superbe bibliothèque.

Salut à tous,

Je passe ma journée à comprendre cette fonction de téléchargement inutilisable. PHPSpreadSheet semble utiliser le tampon PHP. Et selon votre configuration PHP, certains avertissements ou erreurs peuvent interférer avec la sortie.

Utilisant :

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

résout pour moi.
Cela devrait peut-être aider certaines personnes.

Merci pour cette superbe bibliothèque.

Merci beaucoup sa réponse parfaite

Salut à tous,

Cette solution :

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

Fonctionne et résout le problème corrompu. Mais j'ai toujours des problèmes avec l'exportation en utilisant Xlsx/Xls.
Le fichier téléchargé ressemble à ceci :
image

Une idée de comment régler ça ?

Merci !

Salut à tous,

Je passe ma journée à comprendre cette fonction de téléchargement inutilisable. PHPSpreadSheet semble utiliser le tampon PHP. Et selon votre configuration PHP, certains avertissements ou erreurs peuvent interférer avec la sortie.

Utilisant :

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

résout pour moi.
Cela devrait peut-être aider certaines personnes.

Merci pour cette superbe bibliothèque.

Je t'aime mec... Tu m'as sauvé la tête...

Je ne sais pas si c'est toujours le même problème avec PhpSpreadsheet, mais PHPExcel a eu des problèmes avec les espaces ( ) devant les balises ouvertes <?php . Cela provoquait cette erreur dans le passé.

Bonjour @patrickbrouwers
Merci pour votre commentaire.
Résout pour moi.

Si vous utilisez ajax pour télécharger,
veuillez ajouter responseType: 'blob' à votre demande ajax (j'utilise axios)

Mon exemple de code :

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);
    }
})

Sans responseType: 'blob' , le fichier téléchargé ne peut pas être ouvert

Si vous utilisez ajax pour télécharger,
veuillez ajouter responseType: 'blob' à votre demande ajax (j'utilise axios)

Mon exemple de code :

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);
    }
})

Sans responseType: 'blob' , le fichier téléchargé ne peut pas être ouvert

Remercier!! sauve ma vie, je continue à regarder quelle ligne de code php qui a corrompu mon fichier exporté .. il s'avère que c'est axios

Salut à tous,

Je passe ma journée à comprendre cette fonction de téléchargement inutilisable. PHPSpreadSheet semble utiliser le tampon PHP. Et selon votre configuration PHP, certains avertissements ou erreurs peuvent interférer avec la sortie.

Utilisant :

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

résout pour moi.
Cela devrait peut-être aider certaines personnes.

Merci pour cette superbe bibliothèque.

Merci @Leenzuur , vous m'avez sauvé la journée ! Ça a marché! Je me demande s'il y en a pour résoudre ce problème, mais de manière @Leenzuur , vous savez ce que je veux dire, si j'ai 10 classes d'exportation pour 10 modèles, lors du téléchargement, je dois ajouter à 10 endroits.

Ce problème a commencé à m'arriver aujourd'hui sans aucun changement à l'exportation. L' utilisation de l' échantillon de code

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