Я использую 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
Будем благодарны за любые предложения.