Recibo datos sin procesar de un Excel cuando envío mi solicitud http. Estoy usando el paquete fileSaver para guardar archivos base64 como pdf (convertidos en un blob) con él y funciona bien. lo que recibo es como la imagen de abajo. Mi pregunta es ¿cómo puedo convertir esto en un blob que se puede guardar sin dañar los datos? tenga en cuenta que cuando guardo esta picadura como archivo en cartero, se guarda bien. este enfoque no funcionó y guarda un Excel corrupto que no se puede abrir:
var blob = new Blob([s2ab(response)], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); FileSaver.saveAs(blob, action.payload.culture + ".xlsx");Resuelto de esta manera: antes de hacer nada, agregue arrayBuffer como response-type a su encabezado de solicitud http.
primero convierta el binario de arraybuffer a base64:
export function arrayBufferToBase64(buffer: ArrayBufferLike) { let binary = ""; let bytes = new Uint8Array(buffer); let len = bytes.byteLength; for (let i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); }luego decodifique esta base64 en un blob:
export const base64toBlob = (b64Data: string, contentType = "", sliceSize = 512): Blob => { const byteCharacters = atob(b64Data); const byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { const slice = byteCharacters.slice(offset, offset + sliceSize); const byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } const blob = new Blob(byteArrays, { type: contentType }); return blob; };Ahora descárgalo:
const blob = base64toBlob(arrayBufferToBase64(response.data)); FileSaver.saveAs(blob, `${orderType}_${formatedDates.from}_${formatedDates.to}.xlsx`);