Te sugerimos que pruebes esta resolución en un entorno controlado antes de pasarlo a producción, saludos.
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 s2ab (string para array buffer) (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. Por favor, asegúrese de tener un string datos en base64 en la variable de datos sin ninguna prefix 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 );
Comentarios y valoraciones de la guía
Al final de la web puedes encontrar las explicaciones de otros programadores, tú asimismo tienes la habilidad insertar el tuyo si te apetece.