Laravel 5 アプリケーションにエクスポート/ダウンロード機能を追加しようとしています。Laravel-Excel ライブラリ ( http://www.maatwebsite.nl/laravel-excel/docs ) を見つけました。これは完璧に思えます。理想的には、Laravel ビューまたは html を取得して、ダウンロード可能な Excel ファイルを作成できます。
これまでのところ、作成と保存が機能するようになりました。私は Excel ファイルを作成できます。問題ありません (正しいデータとビューです)。サーバーの storage/exports/ には、正しい保存パスである "Report.xls" が表示されます。私が抱えている問題は、作成後にブラウザからファイルをダウンロードできないように見えることです。
Laravel-Excel ライブラリには ->download('xls') および ->export('xls') メソッドがありますが、これらは開発者のコンソールに表示される生のコンテンツのみを返すようです:
右側では、ファイルが作成され、「Report.xls」として保存されていることがわかります。おそらく生のコンテンツは正しいコンテンツですが、生のコンテンツをコンソールに吐き出しているだけな理由はわかりません. Report.xls ファイルは Excel で開くことができるので、破損していないことがわかります。
また、Laravel 5 Response::download() 関数を使用してダウンロード用のヘッダーを設定しようとしましたが、ファイルをダウンロードする代わりにコンソールに生のコンテンツを吐き出しました。
私が使用しているコードは、コントローラー メソッドにヒットする AJAX 呼び出しであり、コントローラー メソッドは「downloadReportFile()」と呼ばれるサービス メソッドをトリガーするだけです。
public function downloadReportFile($requestData, $fileType) {
$configJSON = \Report::loadConfigFile($requestData['reportName']);
$today = Carbon::today()->format('Y-m-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 ファイルをダウンロードするために私が見逃している可能性のあるものを見た人はいますか? 御時間ありがとうございます!
編集 さらに調査を行った後、ダウンロードの元のワークフロー (AJAX 呼び出しを使用してトリガーする) が問題の一部であるようです。たとえば、Download a file from Servlet using Ajaxでは、AJAX が JavaScript メモリに結果を保存することについて説明しています。これは、ファイルではなくコンソールにコンテンツを取得する理由を説明しています。