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 fichier
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
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)
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
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
$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 :
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 ajouterresponseType: '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
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 :
résout pour moi.
Cela devrait peut-être aider certaines personnes.
Merci pour cette superbe bibliothèque.