Ant Design Pro v4 从后端下载 excel,后端返回的是文件流

高效 DEM 拼接 通过以上步骤的系统实施,能够实现高效、准确的大型地理信息系统 DEM 数据拼接,满足复杂和大规模项目的应用需求。 阅读详情

前后端分离,后端返回文件流,在前端通过请求 api 的方式下载 excel 文件。

前端代码

  • 适用于 v4,应该也适用于 v2.3.1,在 v4 版本下测试通过,如果用的是 v2.3.0,请看最后面的修改方式。
  • 另外,刚用 TypeScript,因为还不是很熟,有些地方还不符合 TypeScript 的编码规范,先将就看~~
export function excelDownload(url, options) {
  let tokenSessionStorage: string | null = sessionStorage.getItem('token');
  let excelFileName : string | null = options.body.excelFileName;

  options = { credentials: 'include', ...options };
  options.body = JSON.stringify({
    method: url,
    jsonStringParameter: JSON.stringify(options.body),
  });

  options.headers = {
    Accept: 'application/json',
    'Content-Type': 'application/json; charset=utf-8',
    Authorization: tokenSessionStorage,
    ...options.headers,
  };

  fetch(url, options)
    .then(response => response.blob())
    .then(blobData => {
      download(blobData, excelFileName);
    });
}

function download(blobData: Blob, forDownLoadFileName: string | null): any {
  const aLink = document.createElement('a');
  document.body.appendChild(aLink);
  aLink.style.display = 'none';
  aLink.href = window.URL.createObjectURL(blobData);
  aLink.setAttribute('download', forDownLoadFileName);
  aLink.click();
  document.body.removeChild(aLink);
}

遇到的坑

前端提交请求的参数体,用的是 options.data,参照了登录的 api 请求方法,在文件 src\services\login.ts 中定义。

export async function fakeAccountLogin(params: LoginParamsType) {
  return request('/api/auth/login', {
    method: 'POST',
    data: params,
  });
}

我的方法是:

export async function exportToExcelCollectionDetail(params) {
  return excelDownload('/api/exportToExcel/collectionDetail', {
    method: 'POST',
    data: params,
  });
}

调用前将 data 转换成 json 数据:

  options.data = JSON.stringify({
    method: url,
    jsonStringParameter: JSON.stringify(options.data),
  });

在后端,只有 method 有值,jsonStringParameter 被“吞”掉了,就象没有传这个参数一样,所以,得到的值是 null。

各种查资料,后来在 fetch 的 github 项目看到,Post JSON,请求的参数用的是 body,代码如下:

fetch('/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Hubot',
    login: 'hubot',
  })
})

于是,将 options.data 改为 options.body:

  options.body = JSON.stringify({
    method: url,
    jsonStringParameter: JSON.stringify(options.body),
  });

记得调用方也要改:

export async function exportToExcelCollectionDetail(params) {
  return excelDownload('/api/exportToExcel/collectionDetail', {
    method: 'POST',
    body: params,
  });
}

竟然就可以了!

在查询数据,以及登录功能,都用的是关键字 data,能正常传递参数,不过,调用的是 umi-request 封装过的 fetch,umi-request 对参数的定义是:

export interface RequestOptionsInit extends RequestInit {
  charset?: 'utf8' | 'gbk';
  requestType?: 'json' | 'form';
  data?: any;
  params?: object;
  responseType?: ResponseType;
  useCache?: boolean;
  ttl?: number;
  timeout?: number;
  errorHandler?: (error: ResponseError) => void;
  prefix?: string;
  suffix?: string;
  throwErrIfParseFail?: boolean;
  parseResponse?: boolean;
  cancelToken?: CancelToken;
}

后端导出 excel 文件的代码片断

// 设置response头信息
response.reset();
response.setContentType("application/x-download;charset=UTF-8");

try {
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(excelFileName, "UTF-8") + ".xls");
    //创建一个WorkBook,对应一个Excel文件
    HSSFWorkbook wb = new HSSFWorkbook();
    //在Workbook中,创建一个sheet,对应Excel中的工作薄(sheet)
    HSSFSheet sheet = wb.createSheet(excelFileName);
    HSSFCellStyle headerStyle = getStyleHeader(wb);
    // 填充工作表
    // some code

    //将文件输出
    OutputStream outputStream = response.getOutputStream();
    wb.write(outputStream);
    outputStream.flush();
    outputStream.close();
    wb.close();
} catch (Exception e) {
    e.printStackTrace();
}

ant design pro v2.3.0 版本,导出 excel

修改 src\utils\request.js,在以下代码的 return 之前:

  return (
    fetch(url, newOptions)
      .then(checkStatus)
      //.then(response => cachedSave(response, hashcode))
      .then(response => {
// codes

添加以下代码:

  if (url.includes('exportToExcel')) {
    const { excelFileName } = options.body;

    return fetch(url, newOptions)
      .then(response => response.blob())
      .then(blobData => {
        download(blobData, excelFileName);
      });
  }

前提是,下载 excel 的 api 路径都要添加 exportToExcel。
其中,download 方法在 v2 与 v4 通用,请参照 v4 的代码。
对 newOptions 的处理,在 if (!(newOptions.body instanceof FormData)) { 下添加:

newOptions.headers = {
  Authorization: token,
  Accept: 'application/json',
  'Content-Type': 'application/json; charset=utf-8',
  ...newOptions.headers,
};

newOptions.body = JSON.stringify({
  method: url,
  jsonStringParameter: JSON.stringify(newOptions.body),
});

关于作者

通过Robotstudio修改机器人程序的具体方法和步骤 阅读详情

相关推荐

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

umi-request 获取数据流(xlsx文件)

umi-request 获取数据流(xlsx文件)

qq_32439563的博客 2021

二维otsu算法python_OpenCV-Python系列之OTSU算法

上一个教程中,我们谈到了关于图像二值化的两种方法,一种是固定阈值法,另一种是自适应阈值法,总的来说,自适应阈值法在某些方面要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选手,也就是OTSU算法(又称为大津算法和最大类间方差法)。最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像...

weixin_28834169的博客 1426

react ,ant design中下载后台(spring boot)返回的二进制流文件

前端部分代码 (特别注意):在前端其实,数据的返回合适需要是:Blob类型,代码: responseType = 'blob'; (1):页面调用方法出: const { dispatch, product_no } = this.props; dispatch({ type: 'proProduct_model/exportOverd', ...

HZR_497的博客 2372

基于FPGA的DDR学习——1.基础知识

⚪DDR2(Double Data Rate2)SDRAM是由JEDEC(电子设备工程联合委员会)开发的第三代SDRAM内存技术标准,1.8V工作电压,240线接口,提供了相较于DDR SDRAM更高的运行效能与更低的电压,同样采用在时钟的上升/下降沿同时进行数据传输的基本方式,但拥有两倍于上一代DDR内存预读取能力(即4bit数据预取能力),其常见的频率规范有DDR2 400\533\667\800\1066\1333等,总线频率553MHZ的DDR2内存只需133MHZ的工作频率。

qq_44932488的博客 2070

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 349

react ,ant design中下载文件的方法,后台传送过来的数据是一个二进制流

这里我们介绍的是先上传再下载的情况 1.首先我们需要一个Upload组件 <Upload {...props}> <Button> <Icon type="upload"/> Click to Upload </Button> &lt...

weixin_42424269的博客 9880

SOME/IP协议详解「2.1.2·Payload数据类型序列化」

SOME/IP协议详解「2.1.2·Payload数据类型序列化」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「2.1.2·Payload数据类型序列化」1 大小端问题2 数据对齐填充问题3 都有哪些数据类型 之前简单的概括了一下序列化/反序列化,就是降维打击,从这一章开始到2.1所有章节结束,都在讲解这个降维打击的详细规则与原理 1 大小端问题 首先什么是大小端: 大端:高字节存放到内存的低地址 小端:高字节存放到内存的高地址 假如有一个数据是0x12345678

雪云飞星的博客 4628

文件下载及基于ant-design-vue的文件上传

前言 台风天在家回顾一文件下载和上传功能的实现! 文件下载 点击按钮下载一个文件,一个出现频率极高的业务场景。 我们需要设置response Header中responseType,告诉后端我们需要的数据类型 export const getCartTemplate = () => defHttp.get({ url: Api.api_get_cart_template, // 确保获取类型正确的数据 responseType: 'blob', headers: {

weixin_54858833的博客 3898

OpenCV-Python图形图像处理:自用的一些工具函数源代码

本文为《OpenCV-Python图形图像处理:博主自用的一些工具函数功能及调用语法介绍》内容配套函数的源代码。

老猿Python 2495

【WRF-Chem教程第四期上】运行 WRF-Chem 模型

完整介绍运行 WRF-Chem 模型的详细步骤

WW、forever的博客 3113

react antd Class 组件 点击按钮下载excle文件

工具: export function downLoadFile(base64Data, fileName = "test") { // base64Data 是服务器获取到的数据 const file = blobToFile(dataURLtoBlob(base64Data, 'application/vnd.ms-excel;charset=utf-8'), fileName); // 利用FileSaver.js 下载文件为Excel文件 saveAs(file, fileName.

zhangyubababa的博客 2109

使用 MATLAB/Simulink + Simscape Electrical + Simulink Design Optimization,构建一个沙漠环境中光伏组件灰尘积累与效率下降仿真模型

本文通过,构建了沙漠环境中光伏组件灰尘积累与效率下降仿真模型✅ 建立了风速-沙尘-积尘速率的物理关系✅ 仿真了灰尘积累过程及其对Isc 和 Pmax的影响✅ 量化分析了不同清洁策略的经济性✅ 提出了优化设计与智能运维建议。

xiaoheshang_123的博客 123

Ant Design Pro V4.0结合.NET WebApi通过NPOI导出Excel功能

Ant Design Pro V4.0结合.NET WebApi通过NPOI导出Excel功能 整体思路 先说思路,通过WebApi生成二进制文件流,返给前端。前端通过Blob接收二进制文件流对象以及文件名,实现导出功能。 WebApi端实现 首先来个简单的,读取后端一个Excel文件并以文件流的形式导出 public HttpResponseMessage GetFileStream() { //var path = @"C:\AZCode\AZEviewApiCodeFirst\AZ.EView

醉酒的李白、的博客 515

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

工作中使用到的单词(软件开发)_第五版

本文摘要: 本文为软件开发相关的术语与技术要点整理,主要包含2020-2025年间四版内容更新(No.01-41)。重点包括: 证书文件格式(PEM/P12)差异 外部API通信注意事项(Accept头设置、HTTPS连接问题) Postman工具使用技巧(Cookie管理、请求头设置) WAS配置相关经验(JVM设置、SSL连接问题) 数据库操作命令(DB2表结构修改) IBM安全管理组件(TAM/iv-user机制) 网络通信细节(chunked传输编码特性) 常用开发工具(curl、Postman)的

sun0322 2520

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

antdesgin table 组件下载成excel

现在,当用户点击“下载为Excel”按钮时,表格数据将被下载为一个名为“测试.xlsx”的Excel文件到用户的默认下载位置,而不是直接到桌面。由于浏览器的安全限制,网页应用无法直接将文件保存到用户的桌面,但可以保存到默认的下载文件夹中。并且正确地导入了它,但是仍然遇到这个错误,那么可能需要重启你的开发服务器或者重新构建你的项目来使Vite重新解析模块。前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。函数,确保这个文件位于正确的路径下,并且导入语句正确。

HHX_01的博客 1389

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

js导出csv文件 防止乱码

exportAttributeDetailTableData().then( // 接口 (res) => { // csv文件内容 if (!res) { this.$message.error('导出失败'); return; } else { res = '\ufeff' + res; // 防止乱码 const blob = new Blob.

xinbear的博客 671

umi-request下载数据流

/** * 获取数据流 */ import React from 'react'; import { Button } from 'antd'; import 'antd/dist/antd.css'; import request from 'umi-request'; export default () => { function download() { request('/get-data-stream', { method: 'POST', // 重

dergfg的博客 4291

C# Net6 Ant Design of Blazor + WebApi实现文件上传与下载

详情请参阅Ant Design Blazor官网。创建项目时选择Ant Design Pro Blazor App,如下图: 在修改Startup.cs,以支持对Web Api的支持详细代码如下: 4、在项目中增加Controllers目录和控制器类 在项目中增加Controllers目录,并在此目录下增加控制器类FilesController.cs实现文件上传下载API,代码如下: 5、使用Ant Design Blazor Upload组件开发上传的UI页面 在项目中新增一个razor组件以实现文件上

分享技术,传播知识! 3367

ant design pro 导出 Excel文件 Django返回文件流

最近做文件下载发现,ant design pro 的request发送post/get请求都不能将Django返回的FileResponse对象正确解析了,比如如果直接从浏览器上输入服务器的URL,就能直接下载下来文件,但是如果通过ant design Pro 发送get请求,返回的却是一堆乱码,不是一个文件 解决方法是: Django服务器代码如下: 完整代码: ant de...

jjw_zyfx的博客 1265

React umi Ant Design常用导入、导出Excel文件方案

介绍 项目中常用的导入导出Excel文件方法封装,希望各位多提意见和补充。 一、导入文件 // 导入接口 import requestUpload from 'umi-request'; export async function importFile(params: any) { return requestUpload(`${globalData.url}/api/importFile`, { method: 'POST', ...params, }); } // 使

sinat_15625949的博客 2487

vue + ant-design-vue下载excel表格、填写内容上传excel文件并展示

这是最初的页面样子,因为模板文件后期会改变,所以要请求接口下载并填写,没有数据的时候发放按钮是禁用的 <template> <div> <a-spin tip="Loading..." :spinning="isLoading"> <section class="upload-police-serach-container"> <div style="display: flex; align-items: cen

weixin_43090018的博客 5574

umi.request获取响应头headers里面的内容

下载excel,后端返回的excel的名称在content-disposition里

tangxiaobao2016的博客 1279

antd excl 下载

点击图标后 会下载excl https://blog.youkuaiyun.com/weixin_44037153/article/details/107662027 ** a标签download属性不起作用 ** 首先要明白的是,download属性是HTML5新增的属性,也就是作用在HTML5的基础之上,他可以使a标签的href属性进行下载,如果填写指就会更改你的下载名称,比如: <a href="/images/a.exe" download>点击下载</a> 1 上面这段代码会下.

zhangyubababa的博客 384

【Ajax】一点疑惑,关于 jQuery 的 ajax 接口

一点疑惑 在接触 jQuery 的 ajax api 之前我一直在封装自己的接口 代码: // Ajax 封装 function Ajax() { var makeCallback = function (xhr, callback) { xhr.onerror = function (err) { callback(err, undefined, ...

高厉害 0w0 195

(九)Ajax 进阶、应用、扩展

文章目录一、Ajax 进阶1. FormData(1) 使用 Ajax 提交表单(2) FormData 的基本用法2. 封装 Ajax3. 使用 Promise 改造封装好的 Ajax二、Ajax 应用1. 搜索提示三、Ajax 扩展1. axios(1) axios 是什么(2) axios 的基本用法2. Fetch(1) Fetch 是什么(2) Fetch 的基本用法 一、Ajax 进阶 1. FormData (1) 使用 Ajax 提交表单 <body> <form

weixin_46227563的博客 649
上一篇: 《React进阶之路》第九章示例 bbs-redux-reselect 解读
下一篇: Ant Design Pro v4 开发备忘,TypeScript 版本
uncleAndyChen
博客等级 码龄22年 32粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值