Obtenga el archivo de Excel (.xlsx) de la respuesta del servidor en ajax

Tengo un problema al obtener el archivo de Excel y abrir la ventana de descarga en el navegador después de obtener una respuesta (en el método ajax exitoso) con ese archivo. Me he apropiadoContent-Type and Content-Disposition headersIntenté usarGota en js y no pude lograr lo que quería: simple descarga de archivos.
Logré algunas versiones de mi ajax, una de ellas está debajo. Desarrollé ajax que devuelve un archivo de Excel que no pude abrir correctamente porque está dañado (a pesar de la extensión .xlsx).

¿Tal vez el problema es con el tipo de datos inapropiado utilizado en Blob constructor?

Intenté usar "xhr.response" en lugar de "datos" de los argumentos del método de éxito, pero tampoco funciona. Verifiqué los Encabezados de respuesta en las Herramientas para desarrolladores en Chrome y están configurados correctamente.
Lo importante: todos los libros de Excel creados en el lado del servidor son correctos porque funcionaban en la versión anterior cuando los datos se enviaban en URL, no en la publicación ajax.

Método del controlador en el lado del servidor Java / Spring a continuación:

response.reset();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition","attachment;filename=\"" + className + " " +  title + ".xlsx\"");
    try (ServletOutputStream output = response.getOutputStream()){
        workbook.write(output);
        output.flush();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

Mi Ajax para descargar el archivo y abrir la ventana de descarga:

$.ajax({
    url: myUrl,
    type: 'POST',
    data: myData,
    success: function(data, status, xhr) {
        var contentType = 'application/vnd.ms-excel';

        var filename = "";
        var disposition = xhr.getResponseHeader('Content-Disposition');
        if (disposition && disposition.indexOf('attachment') !== -1) {
            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
            var matches = filenameRegex.exec(disposition);
            if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
        }
        console.log("FILENAME: " + filename);

        try {
            var blob = new Blob([data], { type: contentType });

            var downloadUrl = URL.createObjectURL(blob);
            var a = document.createElement("a");
            a.href = downloadUrl;
            a.download = filename;
            document.body.appendChild(a);
            a.click();

        } catch (exc) {
            console.log("Save Blob method failed with the following exception.");
            console.log(exc);
        }

Respuestas a la pregunta(2)

Su respuesta a la pregunta