gpt4 book ai didi

javascript - 使用 java/javascript 和 apache POI 导出 .xls 文件时文件损坏

转载 作者:行者123 更新时间:2023-11-30 20:20:49 25 4
gpt4 key购买 nike

我正在尝试从 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);
}
}

下面是用于下载文件内容的j​​avascript代码。

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 方法解码了该字符串

https://stackoverflow.com/a/20151856/2011294

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 });
}

关于javascript - 使用 java/javascript 和 apache POI 导出 .xls 文件时文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51472768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com