后端生成excel文件使用文件流写出后没反应

suyuha
  • 12

问题描述

我在后端用POI生成了workboot对象 使用wb.write(res.getOutputStream)写入输出流 为什么浏览器没有下载,debug的时候也是正常的没有抛出异常,是需要在前端页面对输入流进行处理吗 ,如果是的话要怎么处理

问题出现的环境背景及自己尝试过哪些方法

后端 springboot 前端react + dva + antd

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
后端代码:
@RequestMapping(value = "/plan/generateExcel", method = RequestMethod.POST)

public @ResponseBody void generateExcel(HttpServletResponse response){
    HSSFWorkbook wb = new HSSFWorkbook();//生成工作簿
    Sheet sheet = wb.createSheet("汇总"); //生成汇总sheet

.....

    response.reset();
    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    try {
        SimpleDateFormat newsdf=new SimpleDateFormat("yyyyMMddHHmmss");
        String date = newsdf.format(new Date());
        response.addHeader("Content-Disposition", "attachment;filename=\""
                + new String(("数据表" + date + ".xls").getBytes("UTF-8"),
                "UTF-8") + "\"");
        OutputStream out = response.getOutputStream();
        wb.write(out);
        out.flush();
        out.close();
    } catch (FileNotFoundException e) {
        JOptionPane.showMessageDialog(null, "导出失败!");
        e.printStackTrace();
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "导出失败!");
        e.printStackTrace();
    }

前端model

*generateExcel({payload},{call}){
        yield call(generateExcel,payload);
        }
刚学react 对这些还不是很了解

你期待的结果是什么?实际看到的错误信息又是什么?

回复
阅读 3.2k
3 个回答
✓ 已被采纳

用fetch请求浏览器把数据给你了, 浏览器当然不会下载,为了兼容性,导出excel用a标签<a href="fetchurl">导出</a>

解决了

    return fetch(url, newOptions)
    .then(res => res.blob())
    .then(data => {
      let blobUrl = window.URL.createObjectURL(data);
      download(blobUrl);
    });

在网上找的代码这样可以实现
具体原因 流程 准备去看blob的相关资料

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏