J'utilise angular 4 comme extrémité de fronde et Lumen 5.4 comme extrémité arrière.
Mon exigence est d'exporter des données sous forme de fichier Excel et Zip.
Utilisation du package importation { saveAs }
du 'file-saver/FileSaver';
pour le téléchargement de fichier.
Angular 4 Code:
downloadExcel() {
const type = 'application/vnd.ms-Excel';
const headers = { headers: new Headers({ 'Accept': type }) };
const filename = 'file.xls';
this.http.get('http://10.2.2.109/Download/exportExcel', headers)
.toPromise()
.then(response => this.saveToFileSystem(response, type, filename));
return false;
}
private saveToFileSystem(response, __type, filename) {
const contentDispositionHeader: string = response.headers.get('Content-Disposition');
if (contentDispositionHeader !== null) {
const parts: string[] = contentDispositionHeader.split(';');
//const filename = parts[1].split('=')[1];
const blob = new Blob([response._body], { type: __type });
saveAs(blob, filename);
} else {
alert('Cant download.....');
// handling download condition if content disposition is empty
const blob = new Blob([response._body], { type: __type });
saveAs(blob, filename);
}
}
Code Lumen
public function exportExcel(Request $request) {
$file = storage_path();
$file_name = 'book1.xls';
$headers = [
'Content-type' => 'application/vnd.ms-Excel',
'Content-Disposition' => 'attachment;filename="' . $file_name,
'X-Filename' => $file_name,
'Content-Transfer-Encoding' => 'binary',
'Content-Length' => filesize($file . '/' . $file_name),
'Cache-Control' => 'max-age=0',
'Cache-Control' => 'max-age=1',
'Expires' => 'Mon, 26 Jul 1997 05:00:00 GMT',
'Last-Modified' => gmdate('D, d M Y H:i:s') . ' GMT',
'Cache-Control' => 'cache, must-revalidate',
'Pragma' => 'public',
'Set-Cookie' => 'fileDownload=true; path=/',
'Access-Control-Expose-Headers' => 'Content-Length,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma'
];
return response()->download($file . '/' . $file_name, $file_name, $headers);
}
Problèmes
const contentDispositionHeader: string = response.headers.get('Content-Disposition');
semble toujours vide. S'il vous plaît aidez-moi à résoudre ce problème. OR spécifiez tout autre code de travail // package pour angular
Essaye ça:
downloadExcel() {
const type = 'application/vnd.ms-Excel';
const filename = 'file.xls';
const options = new RequestOptions({
responseType: ResponseContentType.Blob,
headers: new Headers({ 'Accept': type })
});
this.http.get('http://10.2.2.109/Download/exportExcel', options)
.catch(errorResponse => Observable.throw(errorResponse.json()))
.map((response) => {
if (response instanceof Response) {
return response.blob();
}
return response;
})
.subscribe(data => saveAs(data, filename),
error => console.log(error)); // implement your error handling here
}
Les points clés sont responseType: ResponseContentType.Blob
dans RequestOptions et response.blob()
lors de la récupération de la réponse.
En général, il n'est pas recommandé d'accéder à la propriété _body
de la réponse comme suit: response._body
, mais vous devez plutôt appeler la méthode appropriée pour obtenir le contenu du corps en fonction de son type (comme response.blob()
, response.json()
, etc.)
Vous pouvez utiliser json2csv à condition que les données d'entrée soient au format JSON. La sortie de la fonction sera un fichier CSV pouvant être ouvert dans Microsoft Excel ou Google Sheets.
Installez le paquet:
$ npm install json2csv --save
Ajoutez les éléments suivants à votre composant:
var json2csv = require('json2csv');
var fields = ['field1', 'field2', 'field3'];
var result = json2csv({ data: myData, fields: fields });