Как открыть объект Blob в браузере? - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время у меня есть объект BLOB-объекта, который я хотел бы предоставить пользователю возможность открывать.

В настоящее время я использую js-xlsx из SheetsJS библиотека.Я успешно создал лист Excel с данными, которые мне нужны.

Я преобразую объект листа Excel в BLOB-объект и использую FileSaver.js , чтобы успешно дать пользователю возможностьсохранить лист Excel.

saveAs(new Blob([s2ab(wbout)], {type:"application/octet-stream"}), 'mysheet.xlsx');

function s2ab(s: any) {
   var buf = new ArrayBuffer(s.length);
   var view = new Uint8Array(buf);
   for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
   return buf;            
}

Вот вся функция:

exportExcel() {
  var wb = XLSX.utils.book_new();
  wb.Props = {
          Title: "SheetJS",
          Subject: "CCDB",
          Author: "CCDB",
          CreatedDate: new Date(2017,12,19)
  };

  wb.SheetNames.push("Test Sheet");
  var ws_data = this.slotData;
  ws_data.unshift(this.headers);
  ws_data.unshift(['Slots :: CCDB']);
  var ws = XLSX.utils.aoa_to_sheet(ws_data);
  var wscols = [
    {wch:8},
    {wch:25},
    {wch:25},
    {wch:15},
    {wch: 10},
    {wch: 10},
    {wch: 35},
    {},
    {}
  ];
  ws['!cols'] = wscols;
  ws['!merges'] = [{ s: { r: 0, c: 0 }, e: { r: 0, c: 8 } }];
  // XLSX.utils.
  wb.Sheets["Test Sheet"] = ws;
  var wbout = XLSX.write(wb, {bookType: 'xlsx',  type: 'binary'});
  function s2ab(s: any) {

          var buf = new ArrayBuffer(s.length);
          var view = new Uint8Array(buf);
          for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
          return buf;

  }
  saveAs(new Blob([s2ab(wbout)], {type:"application/octet-stream"}), 'Slots CCDB.xlsx');
},

Файл сохраняется правильно, но это не совсем то диалоговое окно, которое я хочу.

Я хочу дать пользователю возможность ОТКРЫТЬ файл, т.е."в Excel", например:

enter image description here

В настоящее время я могу открыть файл CSV, например, путем преобразованияданные в URL и передачу их в window.open ().

exportCSV() {
  let csv = 'data:text/csv;charset=utf-8,';
  const csvContent = Papa.unparse({
    fields: this.headers,
    data: this.slotData,
  });
  csv += csvContent;
  const encodedUri = encodeURI(csv);
  window.open(encodedUri);
},

Я просто не могу заставить его работать с файлом .xlsx.

У кого-нибудь естьидеи?

1 Ответ

0 голосов
/ 22 октября 2018

Хорошо, я понял это.

Оказывается, мне просто нужно было изменить тип на 'application / vnd.openxmlformats-officedocument.spreadsheetml.sheet', чтобы открывать его из большого двоичного объекта как .xlsxфайл!

      saveAs(new Blob([s2ab(wbout)], {
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
      }), 'Slots CCDB.xlsx');
...