当前位置: 首页 > news >正文

excel 导出

接口

@export_data_bp.route('/downloadPointsData', methods=['GET'])
def downloadPointsData():# 获取必要参数date_ = request.args.get('date_')ta_num = request.args.get('ta_num', type=int)# 查询点位数据data = iotdb_utils.IotdbData()if ta_num > 10:data.points = Points_Stable.points_str[ta_num - 10]else:data.points = Points_All.points_str[ta_num]data.start_time = date_data.end_time = date_utils.days_add(date_, 1)df = iotdb_utils.get_df(data)df.index = df.index.strftime('%Y-%m-%d %H:%M:%S')# 将 DataFrame 写入内存中的 Excel 文件output = io.BytesIO()with pd.ExcelWriter(output, engine='openpyxl') as writer:df.to_excel(writer, index=True, sheet_name='PointsData')output.seek(0)  # 重置指针到文件开头# 返回文件下载return send_file(output,mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',as_attachment=True,download_name=f'{ta_num}ta_points_data_{date_}.xlsx')

前端使用fetch

response.blob() 

response可以直接获取blob对象

        _handleDownload_fetch(item) {            // 使用 fetch APIfetch(`/downloadPointsData?date_=${item.date_}&ta_num=${this.ta_num}`, {method: 'GET',}).then(response => {if (!response.ok) {throw new Error('下载失败');}return response.blob(); // 获取 Blob 数据}).then(blob => {// 创建下载链接const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = `${this.ta_num}ta_points_data_${item.date_}.xlsx`;; // 设置文件名document.body.appendChild(a);a.click();// 清理window.URL.revokeObjectURL(url);document.body.removeChild(a);// alert('下载成功');this.showDownloadModal = false;}).catch(error => {console.error('下载错误:', error);alert('下载失败: ' + error.message);this.showDownloadModal = false;});},

前端使用axios

new Blob([response.data]

blob 对象要自己使用 response.data 和 response.headers['content-type'] 封装

        _handleDownload_axios(item) {            // 使用 axios APIaxios.get(`/downloadPointsData?date_=${item.date_}&ta_num=${this.ta_num}`, {responseType: 'blob', // 关键:告诉 Axios 返回 Blob 数据}).then(response => {if (response.status != 200) {throw new Error('下载失败');}// 直接从 response.data 获取 Blob 对象(无需手动转换)const blob = new Blob([response.data], {type: response.headers['content-type'] // 可选:设置 MIME 类型});return blob;}).then(blob => {// 创建下载链接const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = `${this.ta_num}ta_points_data_${item.date_}.xlsx`; // 设置文件名document.body.appendChild(a);a.click();// 清理window.URL.revokeObjectURL(url);document.body.removeChild(a);// alert('下载成功');this.showDownloadModal = false;}).catch(error => {console.error('下载错误:', error);alert('下载失败: ' + error.message);this.showDownloadModal = false;});},

前端使用接口直接下载

window.location.href

无法获取接口什么时候调用完成

window.location.href = `/downloadPointsData?date_=${item.date_}&ta_num=${this.ta_num}`;

http://www.lryc.cn/news/614053.html

相关文章:

  • Linux Shell:Nano 编辑器备忘
  • 影刀 —— 练习 —— 读取Excel的AB两列组成字典
  • flink闲谈
  • 锂电池保护板测试仪:守护电池安全的核心工具|深圳鑫达能
  • 基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解
  • 碰一碰NFC开发写好评php语言源码
  • Track Any Anomalous Object: A Granular Video Anomaly Detection Pipeline
  • DigitalProductId解密算法php版
  • 基于 Modbus TCP 的飞升 FSH-CF计量泵多段速控制优化研究
  • 如何将视频转为GIF格式,3大视频转为GIF工具
  • 使用Python将中文语音翻译成英语音频
  • 【软考架构】计算机网络中的IP地址表示和子网划分
  • 数据结构(六):树与二叉树
  • LLM驱动的数据分析组合(HoraeDB+Polars+Snorkel AI)
  • LabVIEW数字抽取滤波
  • seo-使用nuxt定义页面标题和meta等信息
  • 如何动态执行 JS 脚本
  • 机器学习概念2
  • [linux] Linux:一条指令更新DDNS
  • 如何在本地使用 DeepSeek Janus-Pro
  • 2025 前端真实试题-阿里面试题分析
  • camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误
  • 富士 Instax 12 和 Instax Mini 11 有什么区别?推荐购买哪一款?
  • 使用OAK相机实现智能物料检测与ABB机械臂抓取
  • Java学习第一百一十七部分——ClickHouse
  • 9:USB摄像头的最后一战(上):MP4音视频合封!
  • 企业AI的双层技术栈架构:融合社区创新与企业级管控的设计蓝图
  • Pytest项目_day10(接口的参数传递)
  • JAVA基础-集合框架
  • 【新启航】航空飞机起落架深孔型腔的内轮廓测量方法探究 - 激光频率梳 3D 轮廓检测