当前位置: 首页 > 面试题库 >

使用Java / javascript和apache POI导出.xls文件时获取损坏的文件

毋举
2023-03-14
问题内容

我正在尝试从Web应用程序下载浏览器中的.xls文件。下面是相同的代码。

try(FileInputStream inputStream = new FileInputStream("C:\\Users\\Desktop\\Book1.xls")){
            response.setContentType("application/vnd.ms-excel");
            //response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Content-Disposition", "attachment; filename=Book1.xls");
            outputStream = response.getOutputStream();
            byte[] buffer = new byte[BUFFERSIZE];
            int bytesRead = -1;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        }

以下是用于下载文件内容的JavaScript代码。

success: function(response, status, xhr) {

                let type = xhr.getResponseHeader('Content-Type');
                let blob = new Blob([response], { type: type });

                if (typeof window.navigator.msSaveBlob !== 'undefined') {
                    // IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created.
                    //These URLs will no longer resolve as the data backing the URL has been freed."
                    window.navigator.msSaveBlob(blob, filename);
                } else {
                    let URL = window.URL || window.webkitURL;
                    let downloadUrl = URL.createObjectURL(blob);
                    if (filename) {
                        // use HTML5 a[download] attribute to specify filename
                        let a = document.createElement("a");
                        // safari doesn't support this yet
                        if (typeof a.download === 'undefined') {
                            window.location = downloadUrl;
                        } else {
                            a.href = downloadUrl;
                            a.download = filename;
                            document.body.appendChild(a);
                            a.click();
                        }
                    } else {
                        window.location = downloadUrl;
                    }
                    setTimeout(function () {
                        URL.revokeObjectURL(downloadUrl);
                    }, 100); // cleanup
                }
            }

我可以下载文件,但是下载的文件内容不是可读格式。如果它是csv文件,则我可以在我的javascript响应对象中看到内容,至于.xls文件,javascript响应对象包含无法读取的格式化数据。

有人可以帮我吗?


问题答案:

如果有人遇到相同的问题,则发布此解决方案,我通过base64将字节数组编码为字符串来解决此问题,如下所示。

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 workbook.write(outputStream);
 String res = Base64.getEncoder().encodeToString(outputStream.toByteArray());

在JavaScript中,我从下面的链接使用base64ToBlob方法解码了该字符串

http://codingdict.com/questions/8184

function base64toBlob(base64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 1024;
    var byteCharacters = atob(base64Data);
    var bytesLength = byteCharacters.length;
    var slicesCount = Math.ceil(bytesLength / sliceSize);
    var byteArrays = new Array(slicesCount);

    for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
        var begin = sliceIndex * sliceSize;
        var end = Math.min(begin + sliceSize, bytesLength);

        var bytes = new Array(end - begin);
        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
            bytes[i] = byteCharacters[offset].charCodeAt(0);
        }
        byteArrays[sliceIndex] = new Uint8Array(bytes);
    }
    return new Blob(byteArrays, { type: contentType });
}


 类似资料:
  • 我正在写一个程序,它需要从excel文件中读取和写入数据,而不考虑格式(xls或xlsx)。 我知道ApachePOI,但它似乎有不同的类来处理xls文件(HSSF)和xlsx(XSSF)文件。 任何人都知道我将如何实现我在这里的目标。(也欢迎使用POI以外的API的想法)。

  • 我正在ServletOutputStream上编写一个excel文件(使用HSSFWorkBook for xls和XSSFWorkBook forxlsx)。作为ServletResponse的一部分下载的excel已损坏并包含垃圾字符。 我尝试过将Excel文件写入FileOutpuStream,它工作正常。Excel文件可读且完好无损。 已经检查了关于同一问题的其他几个StackOverfl

  • 我有一个基于Java的Web应用程序,我正在Microsoft Azure中运行。操作系统:RHEL7.3版本。Web服务器:Apache9所以问题是当上传一个。xlsx文件时,它会给我以下错误。同样的配置,每一个其他的infra(包括AWS,本地),每一件事都运行良好。我很困惑,错误可能在哪里,即在服务器级别配置或Java应用程序代码中的错误? 例外 错误:错误返回类型异常详细信息:位置:com

  • 我正在尝试创建一个zip文件,以便能够通过http发送多个文件。 我的问题是,生成的Zip文件在发送之前和之后都“损坏”。问题是我无法找到我做错了什么,因为我在控制台中没有收到任何错误。 那么,有人有一个想法文件我生成的zip文件损坏? 这是我的代码: 谢谢你的帮助!

  • 我试图使用os.walk()获取文件夹中的所有文件,我使用的代码是: 我正试图通过打印根目录和文件名(如下所示)来消除这个问题,但偶尔会有一个损坏的“文件名”,比如“File4 name.rtf”。我有与“~$le4 name.rtf”相同的文件的另一个版本。问题是在这一步之后,我正在读取所有文件以提取文本,但在读取这些文件时,在名称旁边带有“~$”的文件时出现了一个错误。 下面,我尝试介绍所有不

  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl