Подскажите пожалуйста, как скачать файл excel взятый по api ссылке. API написан в Laravel
, а библиотека для создания файла Excel - maatwebsite/excel
. Если вставить ссылку для загрузки прямо в браузер, файл будет загружен правильно и с правильным содержанием. После поиска во многих местах предлагается решение этого типа (с использованием blob):
fetch("http://localhost:7777/api/v1/organizations/export", {
responseType: "blob",
method: "GET",
headers: { "Content-Type": "application/vnd.ms-excel" }
}).then(response => {
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", "template.xls");
document.body.appendChild(link);
link.click();
});
Но если я использую fetch
, файл будет пустым (я не знаю, почему ...). В консоли просматривается: response.data - undefined
. А сам ответ выглядит так:
Response
body: ReadableStream { locked: false }
bodyUsed: false
headers: Headers { }
ok: true
redirected: false
status: 200
statusText: "OK"
type: "basic"
url: "http://localhost:7777/api/v1/organizations/export"
Контроллер на Laravel
выглядит так:
class OrganizationsExportController extends Controller
{
public function export()
{
return (new OrganizationsExport)->download('organizations_export.xls');
}
}
А вот "нарисована" таблица с необходимыми параметрами:
class OrganizationsExport implements FromCollection, ShouldAutoSize, WithEvents, WithMapping, WithHeadings
{
use Exportable;
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return ScheduledInspectionModel::all();
}
private $count = 0;
public function map($organizations): array
{
return [
++$this->count,
$organizations->name_smp,
$organizations->name_control,
$organizations->verification_start . ' - ' . $organizations->verification_end,
$organizations->verification_duration,
];
}
public function headings(): array
{
return [
'№',
'column1',
'column2',
'column3',
'column4',
];
}
public function registerEvents(): array
{
return [
AfterSheet::class => function (AfterSheet $event) {
$event->sheet->getStyle('A1:F1')->applyFromArray([
'font' => [
'bold' => true
]
]);
}
];
}
}