Solución:
Yo tenía el mismo problema que tú. Resulta que necesita convertir el archivo de datos de Excel en un ArrayBuffer.
var blob = new Blob([s2ab(atob(data))], {
type: ''
});
href = URL.createObjectURL(blob);
El método s2ab (cadena a búfer de matriz) (que obtuve de https://github.com/SheetJS/js-xlsx/blob/master/README.md) es:
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;
}
La respuesta anterior es correcta. Asegúrese de tener una cadena de datos en base64 en la variable de datos sin ningún prefijo o cosas así, solo datos sin procesar.
Esto es lo que hice en el lado del servidor (asp.net mvc core):
string path = Path.Combine(folder, fileName);
Byte[] bytes = System.IO.File.ReadAllBytes(path);
string base64 = Convert.ToBase64String(bytes);
En el lado del cliente, hice el siguiente código:
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.setRequestHeader("Content-Type", "text/plain");
xhr.onload = () => {
var bin = atob(xhr.response);
var ab = s2ab(bin); // from example above
var blob = new Blob([ab], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'demo.xlsx';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
xhr.send();
Y me funciona perfectamente.
Esto funciona a partir de: v0.14.0 de https://github.com/SheetJS/js-xlsx
/* generate array buffer */
var wbout = XLSX.write(wb, {type:"array", bookType:'xlsx'});
/* create data URL */
var url = URL.createObjectURL(new Blob([wbout], {type: 'application/octet-stream'}));
/* trigger download with chrome API */
chrome.downloads.download({ url: url, filename: "testsheet.xlsx", saveAs: true });
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)