通过 Ajax 使用 Laravel 导出 CSV

Export CSV using Laravel via Ajax

我有导出 csv 功能,它与 laravel 配合使用效果很好。但是现在我想通过 ajax 调用导出函数并使用方法 post,但是我没有任何反应。我可以从 laravel 控制器发送一个变量来响应,但不能发送文件下载。

这是我的代码:

route.php

    Route::get('/title/show', 'TitleController@show');
    Route::post('/title/show', 'TitleController@exportFromDB');

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;
            }
        })
    })
})

TitleController.php:

    $dataExport['Oversea'] = $dataOversea;
    $this->titleRepository->export('csv', $properties, $dataExport);

TitleRepository.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;
        }
    }
}

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

我看到你的 ajax url 空值

改为

url : "{{ action('TitleController@exportFromDB') }}"

之后,响应是您在控制器return中的数据

success: function (response) {}

试试这个 -

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

  2. 你的控制器方法应该return文件名。

  3. 在你 ajax 成功的情况下执行此操作 -

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

所以替换你的这一行

->export($type); 

->store($type, 'public/reports/', true);

我安装了 maatwebsite/excel 包并且无需编写任何 javascript 即可完成。您需要做的就是为这样的操作设置一个 link(或典型形式 post,如果您愿意):

public downloadItemsExcel() {
    $items = Item::all();
    Excel::create('items', function($excel) use($items) {
        $excel->sheet('ExportFile', function($sheet) use($items) {
            $sheet->fromArray($items);
        });
    })->export('xls');
}

这同样适用于 csv/excel 个文件。浏览器中没有重新加载页面。

首先,您必须将 POST 方法更改为 GET。

对于 ajax 你可以这样做:

$(document).ready(function () {
    $('#exportFromDB').click(function () {
      $.get('/title/show, function(data){      
        window.location = '/title/show=' + data;
      });        
    })
})