ajax(post请求)请求实现导出excel(laravel5.1,laravel Excel)

前言:原来一直使用的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('uploadexcelexports\'.$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,文件成功下载。

原文地址:https://www.cnblogs.com/cyclzdblog/p/7670695.html