当前位置: 首页 > 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.dtcms.com/a/321241.html

相关文章:

  • 【vue】Vue 重要基础知识清单
  • Numpy科学计算与数据分析:Numpy广播机制入门与实践
  • 使用FinTSB框架进行金融时间序列预测的完整指南
  • 算法提升之-启发式并查集
  • 剪映里面导入多张照片,p图后如何再导出多张照片?
  • VScode 文件标签栏多行显示
  • QML中显示二级界面的三种方式
  • 【Git】企业级使用
  • electron自定义国内镜像
  • 静电释放场景误报率↓78%!陌讯多模态融合算法在工业检测的落地优化
  • 【unity实战】用unity实现一个简易的战斗飞机控制器
  • BUG调试案例十七:ENC424J600以太网掉线问题案例
  • uniapp瀑布流最简单的实现方法
  • SonarQube 扫描多个微服务模块
  • 【51单片机2个按键控制流水灯转向】2022-10-25
  • 移动端开发中类似腾讯Bugly的产品推荐与比较-5款APP异常最终产品推荐-卓伊凡|bigniu
  • springBoot集成minio并实现文件的上传下载
  • 华为网路设备学习-28(BGP协议 三)路由策略
  • 怎么实现对三菱PLC的远程调试和PLC远程维护?
  • 【世纪龙科技】数智重构车身实训-汽车车身测量虚拟实训软件
  • 矩阵中的最长递增路径-记忆化搜索
  • 【ESP32-menuconfig(1) -- Build Type及Bootloader config】
  • Vue 项目安全设置方案:XSS/CSRF 防护指南
  • 浅谈:如何复现修复Bug?
  • OpenCV 3 终极指南:创建炫酷自定义窗口与图像显示的艺术
  • 【代码随想录day 14】 力扣 111.二叉树的最小深度
  • Cesium 无人机视角飞行漫游,截屏
  • RabbitMQ详情介绍—七种工作模式
  • springmvc4+hibernate4整合框架的搭建
  • 库函数版独立按键用位运算方式实现(STC8)