Извлечение файла xlsx с помощью http.get (), а затем загрузка указанного файла в Excel Js в Angular - PullRequest
0 голосов
/ 01 мая 2020

Я использую HTTP GET для получения файла xlsx, который затем хочу загрузить в книгу Excel Js. После чего я хочу добавить дополнительный лист в рабочую книгу и сохранить его. Эта часть, кажется, работает, но БЕЗ файла шаблона xlsx, являющегося частью загруженного файла.

Я думаю, что я не могу установить правильный responseType, так как при попытке загрузить файл в Excel Js он пусто. Я все еще могу добавить свой новый лист (sheet2) в рабочую книгу и загрузить его.

Прежде всего, я полагаю, я использую правильный тип ответа? Ссылаясь на документацию Excel Js, при использовании xlsx.load () мне нужно передать ArrayBuffer, который не работает, поэтому я попытался преобразовать его в Uint8Array и Blob, но ни одна из них тоже не работает. Вот почему я думаю, может быть, я получаю файл из get () неправильно.

exportLocalXlsx(): void {
    // Retreive the excel template file from the angular app.
    // TODO: Replace local file with webapi URL at a later stage.
     this.http.get('./assets/Book11.xlsx', { responseType: 'arraybuffer' })
      .subscribe((file:ArrayBuffer)  => {       
          // Now prep the excel template file so it can be loaded into Exceljs.
          let xlsxArray = new Uint8Array(file);
          let xlsxBlob = new Blob([xlsxArray.buffer],
                          { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });

          console.log(file);
          console.log(xlsxBlob);
          console.log(xlsxArray);

          // Load excel template file into a new Exceljs workbook.
          let wb : Excel.Workbook = new Excel.Workbook();
          ///////////////////////////////////
          // Read from a file.
          //wb.xlsx.readFile('/assets/Book11.xlsx') // Results in corrupt file.    
          ///////////////////////////////////
          // Read from a stream.
          //wb.xlsx.read(file);
          //wb.xlsx.read(xlsxBlob);
          //wb.xlsx.read(xlsxArray);
          ///////////////////////////////////
          // Load from buffer.
          //wb.xlsx.load(file);
          //wb.xlsx.load(xlsxArray.buffer);
          wb.xlsx.load(xlsxBlob);

          // Output sheets to console.
          wb.eachSheet((sheet, id) => {
            sheet.eachRow((row, rowIndex) => {
              console.log(row.values, rowIndex)
            })
          });

          // Import data into the excel template.
          let ws = wb.addWorksheet('Sheet2');

          ws.columns = [{ header: 'Id', key: 'id', width: 10 },
                        { header: 'Name', key: 'name', width: 32 }];

          // Add rows.
          ws.addRow({ id: 1, name: 'John' });
          ws.addRow({ id: 2, name: 'Jane' });

          // Now Download the modified excel template file.
          wb.xlsx.writeBuffer().then(data => {
                    const blob = new Blob([data], {
                        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8' });
                    FileSaver.saveAs(blob, 'Book11');
                });
      });
  }

Вот исходный код всего приложения angular: https://stackblitz.com/edit/verifi-exportuploadtest

Будем благодарны за любые предложения.

1 Ответ

0 голосов
/ 04 мая 2020

Не могли бы вы попытаться вернуть ответ с JSON из workbook.model?

на веб-интерфейсе должно работать что-то вроде этого:

    const wb = new ExcelJs.Workbook();
    wb.model = response.data
...