前端如何接收java后端传输excel文件流?response.setHeader()设置下载中文文件名乱码问题?

前言:

当拿到需求的时候,我首先想要的就是用万能的ajax进行传输,没想到ajax也不是万能的,?

大哭

原因:ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载。

一、前端如何接收文件流

我使用的前端接收文件流的方式很简单,直接使用window.location.href 加 文件URL即可。

  function finStatementExcelExport(){
    window.location.href = "${base.contextPath}/fnd/fin/statement/excelexport?bpId="+bpId;
  }

二、后端如何传送文件流

后端使用POI接口生成excel文件,然后将其写入文件流。

@RequestMapping(value="/fnd/fin/statement/excelexport")
  @ResponseBody
  public ResponseData finStatementLnExcelExport(HlsCusFinStatementHd finStatementHd,HttpServletResponse response){

    response.reset(); // 清除buffer缓存
    try {
      String fileName = "商业伙伴财务报表.xls";
      response.setHeader("Content-Disposition", "attachment;filename="+  URLEncoder.encode(fileName, "UTF-8"));//设置文件名
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);

    HSSFWorkbook wb = new HSSFWorkbook();

    //查询财报模板头表
    List<HlsCusFinStatementHd> finStatementHdList=hlsCusFinStatementHdService.finStatementHdQuery(finStatementHd);

    createSheetByLineType(wb,"BALANCE_SHEET",finStatementHdList);
    createSheetByLineType(wb,"PROFIT_STATEMENT",finStatementHdList);
    createSheetByLineType(wb,"CASH_FLOW_STATEMENT",finStatementHdList);
    createSheetByLineType(wb,"FINANCIAL_INDEX",finStatementHdList);

    OutputStream output;
    try {
      output = response.getOutputStream();
      BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
      bufferedOutPut.flush();
      wb.write(bufferedOutPut);
      bufferedOutPut.close();
    } catch (Exception e) {
      e.printStackTrace();
    }

    return null;
  }

三、response.setHeader()设置下载中文文件名乱码问题

上图中的代码已经解决了中文文件名乱码问题,关键代码如下图所示,下文链接中给出了两种方法,选择其中任意一种即可。

参考:解决Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name) 中文显示乱码

response.setHeader("Content-Disposition", "attachment;filename="+  URLEncoder.encode(fileName, "UTF-8"));//设置文件名

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值