后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件

1、pom.xml文件增加依赖:

复制代码
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>

2、接口代码如下:

复制代码
/**
     * 企业列表--导出
     */
    @GetMapping(value = "/downloadTenantList")
    public void downloadTenantList(HttpServletRequest request,HttpServletResponse response) {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        Workbook wb = new SXSSFWorkbook(500);
        Sheet sheet = wb.createSheet();
        wb.setSheetName(0,"企业");
        Row titleRow1 = sheet.createRow(0);
        titleRow1.setHeightInPoints(30);
        Cell titleCellID = titleRow1.createCell(0);
        titleCellID.setCellValue("ID");
        Cell titleCellName = titleRow1.createCell(1);
        titleCellName.setCellValue("名称");

        Row titleRow2 = sheet.createRow(1);
        titleRow2.setHeightInPoints(30);
        Cell valCellID2 = titleRow2.createCell(0);
        valCellID2.setCellValue("ID");
        Cell valCellName2 = titleRow2.createCell(1);
        valCellName2.setCellValue("名称");
        try
        {
            wb.write(response.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("导出企业Excel异常{}", e.getMessage());
        }
        finally
        {
            IOUtils.closeQuietly(wb);
        }
    }

3、前端代码如下,可以作为参考,但需要根据实际情况整理

复制代码
import { saveAs } from 'file-saver'
function blobValidate(data) {
  return data.type !== 'application/json'
}
/**
* 参数处理
* @param {*} params  参数
*/
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName];
    var part = encodeURIComponent(propName) + "=";
    if (value !== null && value !== "" && typeof (value) !== "undefined") {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
            let params = propName + '[' + key + ']';
            var subPart = encodeURIComponent(params) + "=";
            result += subPart + encodeURIComponent(value[key]) + "&";
          }
        }
      } else {
        result += part + encodeURIComponent(value) + "&";
      }
    }
  }
  return result
}
export function download(url, params, filename, config) {
  downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
  return service.post(url, params, {
    transformRequest: [(params) => { return tansParams(params) }],
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    responseType: 'blob',//使用这个或者{responseType:'arraybuffer'}
    ...config
  }).then(async (data) => {
    const isBlob = blobValidate(data);
    if (isBlob) {
      const blob = new Blob([data])
      saveAs(blob, filename)
    } else {
      const resText = await data.text();
      const rspObj = JSON.parse(resText);
      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
      Message.error(errMsg);
    }
    downloadLoadingInstance.close();
  }).catch((r) => {
    console.error(r)
    Message.error('下载文件出现错误,请联系管理员!')
    downloadLoadingInstance.close();
  })
}

这样就可以通过调用接口的方式导出excel文件,请求接口就可以在header中设置认证头

相关推荐
codeGoogle8 小时前
自研 IM 还是选择第三方 SDK?企业开发者应该如何权衡?
前端·后端·程序员
用户938515635079 小时前
React Context 与自定义 Hook 从底层到实践:「跨层级通信 + 副作用封装」全解析
前端·javascript·react.js
滴滴答答哒10 小时前
VUE3+element-plus MultiSelect 多选下拉组件
前端·javascript·vue.js
其美杰布-富贵-李10 小时前
04 watch 与 Vue 响应式数据流
前端·javascript·vue.js
许彰午10 小时前
在PowerBuilder里手写Excel导出——OLE控制Excel的完整方案
excel
赵大仁11 小时前
生成式 UI 实战:用 JSON Schema + React 动态渲染 AI 界面
前端·ai·react·next.js·前端架构·生成式ui
kyriewen12 小时前
我排查了一个React内存泄漏——罪魁祸首是这3个被忽略的清理函数
前端·javascript·面试
IT_陈寒13 小时前
我又被JavaScript的隐式类型转换坑了
前端·人工智能·后端
其美杰布-富贵-李13 小时前
03 ref、reactive 与 computed 响应式数据
前端·javascript·vue.js
OpenTiny社区13 小时前
GenUI SDK v1.3.0 发布|多框架兼容,一键换物料,渲染器 & 演练场全面增强!
前端·ai编程