Angular 6 CSV скачать - PullRequest
       29

Angular 6 CSV скачать

3 голосов
/ 20 апреля 2019

Я новичок в Angular, в настоящее время я работаю в проекте, который нуждается в CSV-экспорте.Здесь я использую Angular 6 в качестве внешнего интерфейса и laravel в качестве внутреннего:

Вот как я написал функцию laravel, используя mattwebsite / excel

// Lead export to csv
public function downloadExcel(Request $request)
{
    $credentials = $request->only('token');
    $token = $credentials['token'];
    $userid = $this->getUseridFromToken($token);
    $type = "xls";
    $data = DB::table('user_mailbox AS A')
                    ->select('A.id', 'A.name', 'A.email', 'A.phone', DB::raw('DATE_FORMAT(A.send_on, "%d / %b / %Y") as send_on'), 'B.listing_heading','B.listing_id','B.listing_heading', 'C.name')
                    ->leftjoin('broker_listing AS B', 'B.listing_id', '=', 'A.listing_id')
                    ->leftjoin('users AS C', 'C.id', '=', 'A.sent_by')
                    ->where('A.sent_to', $userid)
                    ->where('A.user_type', '1')
                    ->orderBy('A.id', 'desc')->get()->toArray(); 
    Excel::create('Lead_Export', function($excel) use ($data) {
        $excel->sheet('Lead_Export', function($sheet) use ($data)
        {
            $sheet->fromArray($data);
        });
    })->download($type);
}

Так я написал функцию в угловом компоненте

    // Download leads as excel
download_excel(){
  const fd = new FormData(); 
  fd.append('token',this.token);
  this.brokerleads.downloadLeads(fd).subscribe(
    data => this.handleResponsedwnload(data),
    error => this.handleErrordwnload(error)
  );
}
handleResponsedwnload(data){ console.log('test');
  const blob = new Blob([data], { type: 'text/xls' });
  const url= window.URL.createObjectURL(blob);
  window.open(url);
}
handleErrordwnload(data){

}

сервис похож на этот

  // Download as excel
  downloadLeads(data):Observable<any>{
    return this.http.post(`${this.baseUrl}downloadExcel`, data);   
  }

просмотр

    <a class="export-leads" href="javascript:void(0);" (click)="download_excel()" >EXPORT LEADS</a>

при этом я получаю ответ, подобный этому, но файл не загружается enter image description here

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

Вам необходимо перейти в браузер к маршруту, где файл Excel создается на бэкэнде (в новой вкладке), либо по ссылке <a href="path" target="_blank">, либо по window.open

Функция ->download()устанавливает заголовки так, чтобы файл автоматически загружался.

Когда вы извлекаете эти данные с помощью вызова AJAX (что и делает HttpClient), вы просто возвращаете двоичные данные (то, что вы видите в своемВкладка «Ответ» в инструментах разработчика Chrome).

( Существуют внешние приемы для загрузки файла, полученного с помощью ajax, такие как создание элемента ссылки и нажатие на него с помощью JavaScript (см. Ниже), но они могутне рекомендуется ):

let fileName = 'filename.xlsx';
let a = document.createElement('a');

a.href = window.URL.createObjectUrl(responseData);
a.download = fileName;
a.click();
0 голосов
/ 27 мая 2019

Это также можно сделать с помощью file-saver :

import * as FileSaver from 'file-saver';

this.http.post(`${this.baseUrl}downloadExcel`, data, { responseType: 'blob' })
 .subscribe((resp: any) => {
    saveAs(resp, `filename.csv`)
 });
...