前言:原來一直使用的get方法導出excel,但是get方法攜帶的數據量有限,遂嘗試使用post方法實現。
1. 先使用composer安裝laravel的excel擴展包Laravel Excel ,附上github地址,以及官網地址。
https://github.com/Maatwebsite/Laravel-Excel (readme文件有詳細的安裝教程) http://www.maatwebsite.nl/laravel-excel/docs
2. 根據第一步配置好之后,便可以通過在類中引入use Excel 來輕松使用Laravel Excel
3. 正常情況下,如果我們使用get方法實現導出excel(代碼如下),直接使用export('xls')方法即可,(此處導出使用的是laravel Excel 提供的@Blade to Excel)
Excel::create('Filename', function($excel) { $excel->sheet('New sheet', function($sheet) { $sheet->loadView('folder.view'); }); })->export('xls');
但是當使用ajax來實現該方法時,執行到export處ajax會將export的文件當成數據返回(此處參考了網友的分析),從而我們在瀏覽器的開發者工具中只會看到一串亂碼,並不會執行下載,所以 我們需要先將生成的文件保存到服務器,
然后返回一個鏈接,通過js的location.href跳轉即可實現文件導出。
4. 要如何將生成的文件保存到服務器呢?對此,Laravel Excel為我們提供了一個store()方法,第一個參數為文件后綴名,第二個參數即為文件保存的路徑(其還有第三個參數此處沒用上,詳情自己官網查看文檔,介紹很詳細)。
Excel::create($new_file_name, function($excel)) { $excel->sheet('New sheet', function($sheet)) {
$sheet->loadView('folder.
view');
})->store('xls', public_path('upload/excel/exports')); });
如此便實現了文件保存,需要注意的是如果多次執行該方法並且文件名沒有改動,那么在保存的路徑下面后面生成的文件內容會覆蓋前面的文件,並不會自動在保存問一個新的文件。
5. 保存完了文件接下來要考慮的就是將下載文件的路由(即實現方法的鏈接)返回給前台,從而利用js實現文件下載。
public function DownloadFile ($file_name) { $file = public_path('upload\excel\exports\\'.$file_name.'.xls'); return response()->download($file); }
上面為實現文件下載的方法(laravel自帶),只需要返回實現該方法的路由即可,路由如下,並且我給路由命名為download。
Route::get('/report/downloadfile/{file}', 'ReportController@DownloadFile')->name('download');
6. 最后我們只需要在第4步的代碼下面加上(只需將路由返回即可,怎么寫自己高興就好);這樣我們后台的所有操作便都完成了。
$res['data'] = route('download', ['file' => $new_file_name]); return $res;
7. ajax請求成功后直接執行,
location.href = data.data;
ok,文件成功下載。