I know this is quite late, but posting for others who struggle with same issue like me
I also needed to download excel from using Maatwebsite excel library by using ajax post call.
added a button to fire the ajax call to download excel file
<button onclick="downloadExcel()" id="btn-download-payroll" class="btn btn-dark-success btn-md" style="transform: translateY(50%); top: 50%; font-size: 13px;"><i aria-hidden="true" class="fa fa-cog mr-10"></i> Download </button>
Used following js code to post ajax request
function downloadExcel() { var salaryMonth = $("#dp-salary-month").datepicker("getDate"); var department = $("#cbox-department"); var month = new Date(salaryMonth).getMonth() + 1; var year = new Date(salaryMonth).getFullYear(); $.ajax({ xhrFields: { responseType: 'blob', }, type: 'POST', url: '/downloadPayroll', data: { salaryMonth: month, salaryYear: year, is_employee_salary: 1, department: department.val() }, success: function(result, status, xhr) { var disposition = xhr.getResponseHeader('content-disposition'); var matches = /"([^"]*)"/.exec(disposition); var filename = (matches != null && matches[1] ? matches[1] : 'salary.xlsx'); // The actual download var blob = new Blob([result], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); var link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); } }); }
in routes/web.php file set the reoute for my controller
Route::post('/downloadPayroll', 'Payroll\\Process\\PayrollController@downloadPayroll');
Here I used maatwebsite/excel library to generate excel file with FromQuery approach but due to library update Excel::create has been replaced by Excel::download in "maatwebsite/excel": "^3.1" I used download method in my case here is my HelperClass to generate records according to my requirement
PayrollHelper.php
namespace App\Http\Helpers; use App\PayrollEmployee; use Maatwebsite\Excel\Concerns\FromQuery; use Maatwebsite\Excel\Concerns\Exportable; class PayrollHelper implements FromQuery { use Exportable; public function forDepartment(int $department) { $this->department = $department; return $this; } public function forMonth(string $month) { $this->month = $month; return $this; } public function query() { // get the salary information for the given month and given department return PayrollEmployee::query()->where(['salary_month' => $this->month,'department_id'=>$this->department]); } }
finally in my controller
class PayrollController extends Controller { public function downloadPayroll(Request $request) { $file_name = ''; try { $requestData = $request->all(); $salary_month = $requestData['salaryMonth']; $salary_year = $requestData['salaryYear']; $department = $requestData['department']; $is_employee_salary = boolval($requestData['is_employee_salary']); $month = Carbon::createFromDate($salary_year, $salary_month); $month_start = Carbon::parse($month)->startOfMonth(); $formated_month = Carbon::parse($month)->format('F Y'); $file_name = 'Employee_salary_' . $formated_month . '.xlsx'; // to download directly need to return file return Excel::download((new PayrollHelper)->forMonth($month_start)->forDepartment($department), $file_name, null, [\Maatwebsite\Excel\Excel::XLSX]); } catch (exception $e) { } } }
After creating excel file return file to get as ajax response as blob
That's all