2016-01-25 191 views
6

我有一個類似的問題,這個問題(Javascript: Exporting large text/csv file crashes Google Chrome):如何保存的.xlsx數據文件作爲BLOB

我想節省excelbuilder.jsEB.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(); 

如果我[Base64.decode(data)]替換上述代碼[data],內容在文件中保存看起來更像預期的Excel數據,但仍不能由Excel打開。

謝謝!

回答

10

我有同樣的問題,因爲你。事實證明,您需要將Excel數據文件轉換爲ArrayBuffer。

var blob = new Blob([s2ab(atob(data))], { 
    type: '' 
}); 

href = URL.createObjectURL(blob); 

的s2ab(字符串數組緩衝液)的方法(這是我從https://github.com/SheetJS/js-xlsx/blob/master/README.md得到)是:

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; 
} 
+3

這似乎不適用於原始數據(即服務器原樣返回的excel文件)。事實上「s」返回未定義。任何線索? – dragonmnl

+0

謝謝,工作完美。 – Dugh