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

HOW - 在浏览器下载一个 Excel 表格文件

文章目录

  • 一、技术方案
  • 二、前端具体实现
    • 代码
    • 分析
      • 转换逻辑
      • 注意事项

一、技术方案

  1. 后台返回 base64 数据
{code: 0,data: "base64;...",
}
  1. 前端进行数据格式转化并下载成 Excel 文件

这篇文章主要介绍第二个步骤的实现。

二、前端具体实现

代码

src/utils/transformat.ts

export function base64ToBlob(base64: string, mimeType) {const byteCharacters = atob(base64)const byteNumbers = new Array(byteCharacters.length)for (let i = 0; i < byteCharacters.length; i++) {byteNumbers[i] = byteCharacters.charCodeAt(i)}const byteArray = new Uint8Array(byteNumbers)return new Blob([byteArray], { type: mimeType })
}

src/pages/test.tsx

 const handleDownload = (file: Blob) => {const fileName = `test_${Date.now()}.xlsx`const element = document.createElement("a")element.href = URL.createObjectURL(file)element.download = fileNamedocument.body.appendChild(element)element.click()document.body.removeChild(element)}
const onClick = () => {getFileContent(id).then((res) => {if (res.code === 0) {const blob = base64ToBlob(res.data,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")handleDownload(blob)} else {console.error('download failed...')}})
}

分析

转换逻辑

React 本身并没有提供直接的 base64 → Blob → 下载 的 API,因为这是浏览器原生能力。但是浏览器里有几个通用 API 可以用来处理:

  1. atob / btoa

    • atob(base64):把 base64 字符串解码为普通字符串(二进制仍然是字符串形式)。
    • btoa(string):把字符串编码为 base64。
    • ⚠️ 注意:只能处理 非 UTF-8 的 ASCII 字符,遇到中文等多字节字符会报错。
  2. Blob

    • 接着可以把 Uint8ArrayArrayBuffer 转成 Blob

    • 下载文件时常用:

      const blob = new Blob([uint8Array], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
      
  3. URL.createObjectURL

    • 最后把 Blob 转成一个临时的 URL,用于 <a> 下载。

      const url = URL.createObjectURL(blob);
      

注意事项

  • MIME 类型要正确,Excel 用:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • PDF 用:application/pdf
  • base64 一般比较大,建议后端尽量返回二进制(Blob 流),效率更高。
  • 如果后端要传 base64,最好用 gzip 压缩后再传,否则网络传输会膨胀 30% 左右。
http://www.dtcms.com/a/363494.html

相关文章:

  • Qt Demo(3) 之 deepseek 帮我写的关于图像显示的小界面
  • 漫画短剧小程序系统开发:从0到1的核心架构与思路
  • Redis 缓存雪崩实战:从监控告警到3层防护的完整修复
  • 【读论文】美团开源MOE大模型LongCat-Flash
  • Pod自动重启问题排查:JDK 17 EA版本G1GC Bug导致的应用崩溃
  • 线上排查bug的命令
  • 企业微信员工聊天记录能看吗?合规管理三要素一次性说清
  • 企业微信怎么用能高效获客?拆解体检品牌如何实现私域营收提升
  • Windows 和 Linux 服务器 IP 与域名强制绑定方法
  • Zabbix7代理方式监控oracle 23.3
  • C++多线程编程:std::thread, std::async, std::future
  • PHP 8.x与现代Web开发:性能、安全与生态进化
  • 数据库入门实战版
  • 深度学习篇---SGD优化器
  • Java反序列化漏洞揭秘:从原理到攻击实战
  • RabbitMQ消息堆积问题排查:concurrentConsumers 配置的坑与解决方案
  • 网络共享协议
  • 探索JavaScript机器学习:几款流行的库推荐
  • 服务器数据恢复—OceanStor存储数据丢失原来这样恢复
  • linux 命令 awk的常见用法
  • 【LeetCode】3025. 人员站位的方案数 I(康复-T2)
  • 【ComfyUI】SDXL Refiner 提示进一步提升生成图像的质量
  • 族 20 魅族 note16 meizu M20 MEIZU NOTE16 解锁BL bootloader
  • Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?
  • 构建高性能企业级搜索?Amazon CloudSearch全攻略:从核心概念到落地实践
  • 第 2 讲:Kafka Topic 与 Partition 基础
  • 心路历程-vim编辑器
  • 详解kafka streams(二)
  • Kafka 架构详解
  • 数据结构_队列(C语言实现)