首页 > 解决方案 > 陷入下载循环

问题描述

我一直在为用户提供一个 XLSX 文件的 HTML 页面。它运行良好,但在第一次下载后,用户会陷入下载循环。

目前我正在使用这些库:Sheetjs 和 Filesaver。

负责构建 xlsx 文件和下载的函数:

function exportxls(){
    var wb = XLSX.utils.book_new();
    wb.Props = {
        Title: "Test001",
        Subject: "teste",
        Author: "Moreira",
        CreatedDate: new Date(2021,02,01)
    };
    
    wb.SheetNames.push("Test Sheet");
    var ws_data = [['hello' , 'world']];
    var ws = XLSX.utils.aoa_to_sheet(ws_data);
    wb.Sheets["Test Sheet"] = ws;
    var wbout = XLSX.write(wb, {bookType:'xlsx',  type: 'binary'});
    
    function s2ab(s) {
        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;        
    }

    $("#button-a").click(function(){
        saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), 'test.xlsx');
    }); 
}

标签: javascriptfilesaver.jssheetjs

解决方案


这是因为你把它放在$("#button-a").click(function(){...里面exportxls(),当你调用这个函数时,它会将事件附加click到按钮上。把它移到外面。

function exportxls() {
  var wb = XLSX.utils.book_new();
  wb.Props = {
    Title: "Test001",
    Subject: "teste",
    Author: "Moreira",
    CreatedDate: new Date(2021, 02, 01)
  };
  
  wb.SheetNames.push("Test Sheet");
  var ws_data = [
    ['hello', 'world']
  ];
  var ws = XLSX.utils.aoa_to_sheet(ws_data);
  wb.Sheets["Test Sheet"] = ws;
  var wbout = XLSX.write(wb, {
    bookType: 'xlsx',
    type: 'binary'
  });
  
  function s2ab(s) {
    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"
  }), 'test.xlsx');
  
}

$("#button-a").click(function () {
  exportxls();
});

推荐阅读