java 从后台下载xlsx格式excel 发现不可读取内容的解决方案

发布于 2019-09-26 作者 风铃 46次 浏览 版块 前端


这种问题是因为没加 Content-Length


需求1:从服务端下载excel模板

这个好办,找到服务端保存的模板,getResourceAsStream拿到输入流,设置Content-length

注意输入流的大小是

public int available() throws IOException {
return 0;
}

这个方法

response.setHeader("Content-Length", String.valueOf(resourceAsStream.available()));

这样就不会报截图的错了


需求2:在程序里生成了workbook导出

这个有点麻烦,因为workbook只提供了write写出到输出流

我提供的方案有点麻烦,希望大佬看到可以给出更好的解决办法!

解决方案:将workbook写入ByteArrayOutputStream

将ByteArrayOutputStream转成byte数组

public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}

这个方法

然后把生成的byte数组放入输入流中

ByteArrayInputStream in = new ByteArrayInputStream(byteArray);

剩下的和上面一样

response.setHeader("Content-Length", String.valueOf(in.available()));

附上第一个需求的代码

InputStream resourceAsStream = ExcelUtils.class.getResourceAsStream("/template/" + fileName);
response.setHeader("Content-Length", String.valueOf(resourceAsStream.available()));
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
OutputStream ouputStream = response.getOutputStream();
// 循环取出流中的数据
byte[] b = new byte[1024];
int len;
while ((len = resourceAsStream.read(b)) > 0) {
ouputStream.write(b, 0, len);
}
resourceAsStream.close();
ouputStream.flush();
ouputStream.close();

收藏
暂无回复