Downloading file from a FromQuery method.... file downloads, upon opening XLSX file, receive an error message from Office:
"Excel cannot open the file
Here is my method
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);
});
}
}
I call it like this from a controller
//$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');
Expected behavior:
The file to be downloaded with data
Actual behavior:
The file downloads but Excel gives error opening it
I have tested the query in eloquent and it returns a collection with data.
(https://user-images.githubusercontent.com/18451450/40511758-f61e6570-5f5d-11e8-9f37-0b594f60be59.png)
Also thank you in advance :)
Especially for taking the time to write this wrapper to begin with
I'm not sure if it's still the same problem with PhpSpreadsheet, but PHPExcel had problems with having spaces () in front of
<?php
open tags. That used to cause this error in the past.
u can open error file with nano or vim.
If you see a space before PK,just like this :
Maybe error happened in your code or vendor. I met the same problem and deal with remove vendor folder . It works well After reinstall the vendor
Hey all, thanks for the lead.
I think you are correct that there is an extra line break or something at the start of the file. I haven't traced it yet but when I switch to CSV, I can open the file and the data is there but the first row is blank....
Going to look some more, ill report back. I grepped for a file starting with a line break and then
I am going to close this out and open a new one with a better description of the problem. I can't find the source of the blank row
i met same issue. i fixed by
$filename = 'meal_list_'.date('YmdHis').'.xlsx';
Excel::store(new MealExport($request), $filename, 'public');
return redirect( Storage::url("storage/{$filename}" ));
}
Hi everyone,
I spend my day to understand this unworkable download function. PHPSpreadSheet seems to use PHP buffer. And depending on your PHP configuration some warnings or errors could interfer with the output.
Using :
// in controller
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');
solves for me.
Maybe it should help some people.
Thank you for this awesome library.
Hi everyone,
I spend my day to understand this unworkable download function. PHPSpreadSheet seems to use PHP buffer. And depending on your PHP configuration some warnings or errors could interfer with the output.
Using :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
solves for me.
Maybe it should help some people.Thank you for this awesome library.
THanks alot its perfect answer
Hi everyone,
This solution :
ob_end_clean(); // this
ob_start(); // and this
return Excel::download(new MyExport, 'file.xls');
Works and solve the corrupt problem. But still have trouble with export using Xlsx/Xls.
The downloaded file looks like this :
Any idea how to fix this ?
Thx !
Hi everyone,
I spend my day to understand this unworkable download function. PHPSpreadSheet seems to use PHP buffer. And depending on your PHP configuration some warnings or errors could interfer with the output.
Using :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
solves for me.
Maybe it should help some people.Thank you for this awesome library.
Love You man.. You saved my head...
I'm not sure if it's still the same problem with PhpSpreadsheet, but PHPExcel had problems with having spaces (
) in front of
<?php
open tags. That used to cause this error in the past.
Hello @patrickbrouwers
Thanks for your comment.
Solves for me.
If you are using ajax to download,
please add responseType: 'blob'
to your ajax request (I'm using axios)
My example 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);
}
})
Without responseType: 'blob'
, the downloaded file can not be open
If you are using ajax to download,
please addresponseType: 'blob'
to your ajax request (I'm using axios)My example 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); } })
Without
responseType: 'blob'
, the downloaded file can not be open
Thank!! save my life, i keep looking at which line of php code that corrupted my exported file.. turn out is axios
Hi everyone,
I spend my day to understand this unworkable download function. PHPSpreadSheet seems to use PHP buffer. And depending on your PHP configuration some warnings or errors could interfer with the output.
Using :
// in controller ob_end_clean(); // this ob_start(); // and this return Excel::download(new MyExport, 'file.xls');
solves for me.
Maybe it should help some people.Thank you for this awesome library.
Thanks @Leenzuur , you saved my day! It worked! I wonder is there any any to fix this but @Leenzuur way, you know what's I mean, if I have 10 Export class for 10 Model, when download, I have to add in 10 places.
This problem started to happen to me today with no change to any export. Using @leenzuur code sample fixed it after hours of research.
Most helpful comment
Hi everyone,
I spend my day to understand this unworkable download function. PHPSpreadSheet seems to use PHP buffer. And depending on your PHP configuration some warnings or errors could interfer with the output.
Using :
solves for me.
Maybe it should help some people.
Thank you for this awesome library.