您的位置:首页 > 编程语言 > Java开发

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

2018-03-06 13:09 537 查看


这种问题是因为没加 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();



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐