Laravel使用AJAX下载xls文件

问题描述 投票:0回答:3

我无法通过Ajax下载XLS文件

function downloadFile(response) {
        var blob = new Blob([response], {type: 'application/vnd.ms-excel'})
        var url = URL.createObjectURL(blob);
        location.assign(url);
    }

    $('#export').click(function () {
        $.ajax({
            type: 'POST',
            url : 'factures/engagements/selected/export',
            headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}' },
            dataType: "json",
            data : {
                checkboxes : checkboxValues
            }
        }).done(downloadFile);
    });

我的控制器:

public function exportFacturesEngagementSelected(Request $request){

    $checkboxes = $request->input('checkboxes');

    $collection = collect($checkboxes);

    $engagements = EngagementOrder::whereIn('id' , $collection)->get();

    $date = Carbon::now('Europe/Paris')->format('d-m-Y H:i:s');

    $output = Excel::create('factures_engagements' . $date. '', function($excel) use ($engagements) {
        $excel->sheet('Excel', function($sheet) use ($engagements) {
            $sheet->loadView('engagements.exportExcelSelected')->with("engagements", $engagements);
        });
    })->export('xls');

    return $output;
}

我仅在控制台网络中获得文件的输出预览,但是在浏览器中什么也没有发生;没有文件下载。我究竟做错了什么?

javascript ajax laravel
3个回答
0
投票

尝试此

如果您的ajax成功完成

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

更改此行

->export($type); 

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

0
投票

这些天我用过this package(我的建议),用于将模型的集合转换为XLS并将其导出。据我了解,您想通过AJAX下载文件。我一点也没有,但是我可以分享我的经验来帮助您。这可以处理普通的POST请求,但无论如何都不会刷新页面。因此,这是一个有效的示例:

  1. 在控制器中
public function export(Request $request)
{
    $data = $request->get('data'); // get incoming data field
    return \Excel::download(new ExcelService($data), "custom-file-name-with-extension.xls");
}
  1. 在使用中(或者您也可以在控制器中实现)
namespace App\Services;

use App\Models\Item;
use Maatwebsite\Excel\Concerns\FromCollection;

class ExcelService implements FromCollection
{
    protected $data = null;

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function collection()
    {
        $items = Item::where('data', $data)->get(); // some query using incoming $data
        return $items;
    }
}
  1. Route::post('export', 'ItemController@export')->name('export');

  2. 0
    投票
    确实没有理由使用AJAX。您可以通过GET请求将复选框数据作为URL中的参数传递,并使用<iframe>技巧下载文件。我猜到了控制器名称,请根据需要进行调整。

    web.php将路线更改为GET

    Route::get('factures/engagements/selected/export', 'FactureController@exportFacturesEngagementSelected')->name('export');

    JavaScript函数

    根据控制器的要求序列化数据并发出请求。function downloadFile() { var query; $.each(checkboxValues, function(index,value) { query += 'checkboxes=' + value + '&'; }); $('<iframe />') .attr('src', '/factures/engagements/selected/export?' + query) .hide() .appendTo('body'); }

    FactureController.php

    并使用控制器中的下载方法。// ... ->download('xls');
    © www.soinside.com 2019 - 2024. All rights reserved.