Как скачать файл Excel из PHPExcel в Angular7, не сохраняя его на сервере? - PullRequest
0 голосов
/ 09 мая 2019

Я использую Codeigniter и PHPExcel для генерации файла .xls.Когда я пытаюсь сохранить его на сервере, все идет нормально, но я не хочу сохранять его на сервере, я хочу загрузить его, когда Angular 7 получит ответ с большим двоичным объектом.

Мой API с PHPвот так:

function getFile:
    $this->objPHPExcel->getProperties()->setCreator("My File")->setLastModifiedBy("My File");
            $this->objPHPExcel->getProperties()->setCreator("My File")->setTitle("");
            $this->objPHPExcel->getProperties()->setCreator("My File")->setSubject("");
            $this->objPHPExcel->getProperties()->setCreator("My File")->setDescription("");
            $this->objPHPExcel->getProperties()->setCreator("My File")->setKeywords("");

    Here I have a foreach creating the rows and cols:
    $this->objPHPExcel->setActiveSheetIndex(0);
    $this->objPHPExcel->getActiveSheet()->getColumnDimension($col)->setAutoSize(true);
    $this->objPHPExcel->getActiveSheet()->setCellValue( $col.$linha , $val);
    $this->objPHPExcel->getActiveSheet()->getStyle( $col.$linha )->getFont()->setBold( true );
    $this->objPHPExcel->getActiveSheet()->getStyle( $col.$linha )->applyFromArray($centerStyle);

    After foreach:
    $objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel5');
    header('Content-type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="file.xls"');
    header('Cache-Control: max-age=0');

    $objWriter->save('php://output');

Obs: If I set a path to the file it is created without problems:
$objWriter->save($filePath.'test.xls');

Мой сервис angular 7 выглядит так:

generateExcel(body){

    const url = `${baseurl.base_url}api/generate_excel/get_file`;
    const header = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
    return this.http.post<any[]>(url, body, {headers: header});
  }

А моя подписка на Компонент выглядит так:

this.generateExcelService.generateExcel(JSON.stringify(table)).subscribe((response: any) => {

      let blob = new Blob([response], {type: 'application/vnd.ms-excel'})
      saveAs(blob, 'file.xls')
    })

Ответ такой:Blob, я думаю.Примерно так:

enter image description here

Но при запуске подписки в консоли появляется следующая ошибка:

Ошибка: SyntaxError: Неожиданный токен � в JSON в позиции 0 в JSON.parse () в XMLHttpRequest.onLoad

Я хотел бы знать, почему файл не был загружен, когда я нажимаю на кнопку, которая вызываетподписаться работает и что я должен сделать, чтобы это работало.

1 Ответ

0 голосов
/ 09 мая 2019

Я нашел решение для моей проблемы здесь: Заставить Angular ожидать другого ответа, кроме JSON

Что я сделал, чтобы решить мою проблему, так это изменить службу, чтобы она ожидала другого ответа, чемJSON:

 var HTTPOptions = {
      headers: new HttpHeaders({
        'Accept': 'text/html, application/xhtml+xml, */*',
        'Content-Type': 'application/x-www-form-urlencoded'
      }),
      'responseType': 'blob' as 'json'
   }
    return this.http.post<any[]>(url, body, HTTPOptions);
...