Laravel 5 – 下载视图的Excel文件

我正在为Laravel 5应用程序添加一个导出/下载function。 我find了Laravel-Excel库( http://www.maatwebsite.nl/laravel-excel/docs ),这看起来非常完美 – 理想情况下,我将能够采用Laravel View或者HTML并制作可下载的Excel文件。

到目前为止,我已经获得了创build和存储的工作。 我可以创build一个Excel文件,没关系(这是正确的数据和视图),并在存储/出口/服务器上我看到“Report.xls” – 这是正确的保存path。 我遇到的问题是我似乎无法通过浏览器下载后创build它的文件。

Laravel-Excel库有 – > download('xls')和 – > export('xls')方法,但是这些只能返回在开发者控制台中可见的原始内容:

在这里输入图像说明

在右边,你可以看到文件被创build并存储为“Report.xls”,大概原始内容是正确的内容 – 但我不知道为什么只是将原始内容分散到控制台中。 我可以在Excel中打开Report.xls文件,所以我知道它没有损坏。

我也尝试使用Laravel 5 Response :: download()函数并为下载设置标题,但是它也会在控制台中吐出原始内容而不是下载文件:

在这里输入图像说明

我正在使用的代码是一个AJAX调用命中一个Controller方法,而控制器方法只是触发一个名为“downloadReportFile()”的服务方法:

public function downloadReportFile($requestData, $fileType) { $configJSON = \Report::loadConfigFile($requestData['reportName']); $today = Carbon::today()->format('Ym-d'); $FileViewdata = array( 'config' => $configJSON, 'html' => $requestData['report_html'] ); \Excel::create("Report", function($excel) use ($FileViewdata) { $excel->setTitle($FileViewdata['config']['title']); $excel->setDescription($FileViewdata['config']['description']); $excel->sheet("page 1", function($sheet) { $sheet->loadView("reports.sample"); }); })->store('xls', storage_path('exports')); // ->export('xls'); $report_excelFilepath = storage_path('exports') . "/Report.xls"; return response()->download($report_excelFilepath, "Report.xls", [ 'Content-Type' => 'application/vnd.ms-excel', 'Content-Disposition' => "attachment; filename='Report.xls'" ]); } 

Excel文件中的视图是一张简单的表格 – 与截图中的表格相同。 这是视图的模板/ HTML:

 <div class="container full-width-container"> <link href="http://192.168.33.10/css/reports.css" rel="stylesheet"> <div id="results" class="row"> <div class="col-xs-12"> <h2 class="report-title">Active Products </h2> <br> <div class="row"> <div class="col-xs-12"> <div class="table-responsive report-component" name="table" template="table"> <table id="report-table" class="table table-striped table-bordered table-hover"> <thead> <tr> <td class="report-table-th">ENGINE</td> <td class="report-table-th">PRODUCT COUNT</td> <td class="report-table-th">PRODUCT PRICE</td> </tr> </thead> <tbody> <tr class="results-cell"> <td class="report-table-cell"> <p>Meows</p> </td> <td class="report-table-cell"> <p>1,234</p> </td> <td class="report-table-cell"> <p>781230.00</p> </td> </tr> </tbody> <tbody> <tr class="results-cell"> <td class="report-table-cell"> <p>Paws</p> </td> <td class="report-table-cell"> <p>10,777</p> </td> <td class="report-table-cell"> <p>3919823.00</p> </td> </tr> </tbody> <tbody> <tr class="results-cell"> <td class="report-table-cell"> <p>Meow Mobile</p> </td> <td class="report-table-cell"> <p>177</p> </td> <td class="report-table-cell"> <p>334323.00</p> </td> </tr> </tbody> <tbody> <tr class="results-cell"> <td class="report-table-cell"> <p>Tails Cloud</p> </td> <td class="report-table-cell"> <p>335</p> </td> <td class="report-table-cell"> <p>378918923.00</p> </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> 

有没有人看到我可能会错过下载一个XLS文件? 谢谢你的时间!

编辑做了一些更多的研究后,似乎我的原始工作stream程下载 – 使用AJAX调用触发 – 是问题的一部分。 例如,使用Ajax从Servlet下载一个关于AJAX的结果存储在JavaScript内存的结果,这将解释为什么我得到的内容在我的控制台,而不是一个文件。

尝试在Excel::create()之前添加以下代码:

 ob_end_clean(); ob_start(); 

示例代码:

 ob_end_clean(); ob_start(); Excel::create($filename, function($excel) use($records, $sheetname, $data) {} 

这对我有用。