通过 Ajax 使用 Laravel 导出 CSV

Man*_*yen 4 php export-to-csv laravel laravel-5 maatwebsite-excel

我有一个导出 csv 功能,它在 Laravel 上运行良好。但是现在我想通过ajax调用导出函数并使用方法post,但是我没有响应。我可以从 laravel 控制器发送一个变量来响应,但不能发送文件下载。

这是我的代码:

路由文件

    Route::get('/title/show', 'TitleController@show');
    Route::post('/title/show', 'TitleController@exportFromDB');
Run Code Online (Sandbox Code Playgroud)

show.blade.php

<script>
$(document).ready(function () {
    $('#exportFromDB').click(function () {
        $.ajax({
            url: "",
            type: "post",
            headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
            data: {},
            success: function (response) {
                var a = document.createElement("a");
                a.href = response.file;
                a.download = response.name;
            }
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

标题控制器.php:

    $dataExport['Oversea'] = $dataOversea;
    $this->titleRepository->export('csv', $properties, $dataExport);
Run Code Online (Sandbox Code Playgroud)

标题库.php

public function export($type, $properties, $data)
{
    if (in_array($type, self::EXPORT_TYPE)) {
        try {
            return Excel::create($properties['_title'], function ($excel) use ($data, $properties) {

                $excel->setTitle($properties['_title']);
                $excel->setCreator($properties['_creator'])
                    ->setCompany($properties['_company']);
                $excel->setDescription($properties['_description']);

                $excel->sheet('Sheet', function ($sheet) use ($data) {
                    foreach ($data as $item) {
                        $sheet->fromArray($item);
                    }
                });
            })->export($type);
        } catch (Exception $error) {
            throw $error;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何修复它们?谢谢 !

小智 6

尝试这个 -

  1. 不要在您的控制器方法中编写导出代码,而只需将 excel 文件保存在您的公共文件夹中。

  2. 您的控制器方法应返回文件名。

  3. 在你的 ajax 成功时这样做 -

location.href = path/to/file/property_title.xls

所以更换你的这一行

->export($type); 
Run Code Online (Sandbox Code Playgroud)

->store($type, 'public/reports/', true);
Run Code Online (Sandbox Code Playgroud)