Как загрузить файл Excel с помощью выборки из React / Laravel (+ maatwebsite / excel)? - PullRequest
0 голосов
/ 03 августа 2020

Подскажите пожалуйста, как скачать файл 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
                    ]
                ]);
            }
        ];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...