通过 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) {}
试试这个 -
不要在控制器方法中编写导出代码,而只需将 excel 文件保存在 public 文件夹中。
你的控制器方法应该return文件名。
在你 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;
});
})
})
我有导出 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) {}
试试这个 -
不要在控制器方法中编写导出代码,而只需将 excel 文件保存在 public 文件夹中。
你的控制器方法应该return文件名。
在你 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;
});
})
})