我有一个与此问题类似的问题(Javascript: Exporting large text/csv file crashes Google Chrome):
我正在尝试保存 excelbuilder.js 的EB.createFile()
函数创建的数据。如果我把文件数据作为链接的href
属性值,它可以工作。但是,当数据很大时,它会导致Chrome浏览器崩溃。代码如下:
//generate a temp <a /> tag
var link = document.createElement("a");
link.href = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + encodeURIComponent(data);
link.style = "visibility:hidden";
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
我使用excelbuilder.js创建数据的代码如下所示:
var artistWorkbook = EB.createWorkbook();
var albumList = artistWorkbook.createWorksheet({name: 'Album List'});
albumList.setData(originalData);
artistWorkbook.addWorksheet(albumList);
var data = EB.createFile(artistWorkbook);
如类似问题(Javascript: Exporting large text/csv file crashes Google Chrome)的答案所建议的,需要创建blob。
我的问题是,保存在文件中的不是Excel可以打开的有效Excel文件。我用来保存blob
的代码如下:
var blob = new Blob(
[data],
{type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,"}
);
// Programatically create a link and click it:
var a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = fileName;
a.click();
如果我将上面代码中的[data]
替换为[Base64.decode(data)]
,则保存的文件中的内容看起来更像预期的excel数据,但Excel仍然无法打开。
9条答案
按热度按时间yb3bgrhw1#
我遇到了和你一样的问题。原来你需要把Excel数据文件转换成一个ArrayBuffer。
s2ab(字符串到数组缓冲区)方法(我从https://github.com/SheetJS/js-xlsx/blob/master/README.md中得到的)是:
x9ybnkn62#
答案above是正确的。请确保在数据变量中有一个base64格式的字符串数据,没有任何前缀或类似的东西,只是原始数据。
下面是我在服务器端所做的工作(ASP.NET mvc核心):
在客户端,我执行了以下代码:
对我来说效果很好。
u3r8eeie3#
我找到了一个对我有效的解决方案:
我只是点了一个响应类型:“斑点”
55ooxyrt4#
这一做法的有效期为:https://github.com/SheetJS/js-xlsx版本0.14.0
eit6fx6z5#
这是我使用fetch API的实现,服务器端点发送一个字节流,客户端接收一个字节数组并从中创建一个blob,然后生成一个.xlsx文件。
nwo49xxi6#
我的解决方案。
步骤:1
步骤:2
我用的是文件保护程序库。
阅读更多:https://www.npmjs.com/package/file-saver
步骤:3
为我工作。
uajslkp67#
试试
FileSaver.js
库,可能有用。https://github.com/eligrey/FileSaver.js/
ubof19bj8#
这个答案取决于前端和后端都有一个兼容的返回对象,所以要同时给出前端和后端逻辑。确保后端返回数据是base64编码的,这样下面的逻辑才能工作。
jtw3ybtb9#
如果你正在使用typescript,那么这里有一个工作示例,说明如何将array转换为xlsx并下载它。