2016-01-25 20 views
6

Ho una domanda simile a questa domanda (Javascript: Exporting large text/csv file crashes Google Chrome):come salvare .xlsx i dati in un file come un blob

Sto cercando di salvare i dati creati da excelbuilder.js 's EB.createFile() funzione. Se metto i dati del file come valore dell'attributo href di un collegamento, funziona. Tuttavia, quando i dati sono grandi, si blocca il browser Chrome. I codici sono come questo:

//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); 

miei codici per creare i dati utilizzando excelbuilder.js è come segue:

var artistWorkbook = EB.createWorkbook(); 
var albumList = artistWorkbook.createWorksheet({name: 'Album List'}); 

albumList.setData(originalData); 

artistWorkbook.addWorksheet(albumList); 

var data = EB.createFile(artistWorkbook); 

Come suggerito dalla risposta della domanda simile (Javascript: Exporting large text/csv file crashes Google Chrome), un blob ha bisogno di essere creato.

Il mio problema è, ciò che viene salvato nel file non è un file Excel valido che può essere aperto da Excel. I codici che uso per salvare il blob è come questo:

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(); 

Se sostituisce la [data] nei codici di cui sopra con [Base64.decode(data)], il contenuto negli sguardi file salvato più come i dati previsti eccellere, ma ancora non può essere aperto da Excel.

Grazie!

risposta

10

Ho avuto lo stesso problema come voi. Si scopre che è necessario convertire il file di dati di Excel in un ArrayBuffer.

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

href = URL.createObjectURL(blob); 

Il s2ab (stringa matrice buffer) Metodo (che ho ricevuto da 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

non sembra funzionare con dati non elaborati (ad esempio il file excel restituito da un server così com'è). Infatti "s" restituisce undefined. qualche indizio? – dragonmnl

+0

Grazie, ha funzionato perfettamente. – Dugh

Problemi correlati