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

文章目录

一、技术方案

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

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

二、前端具体实现

代码

src/utils/transformat.ts

typescript 复制代码
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

typescript 复制代码
 const handleDownload = (file: Blob) => {
     const fileName = `test_${Date.now()}.xlsx`
     const element = document.createElement("a")
     element.href = URL.createObjectURL(file)
     element.download = fileName
     document.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

    • 接着可以把 Uint8Array、ArrayBuffer 转成 Blob。

    • 下载文件时常用:

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

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

      ts 复制代码
      const url = URL.createObjectURL(blob);

注意事项

  • MIME 类型要正确,Excel 用:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  • PDF 用:application/pdf
  • base64 一般比较大,建议后端尽量返回二进制(Blob 流),效率更高。
  • 如果后端要传 base64,最好用 gzip 压缩后再传,否则网络传输会膨胀 30% 左右。
相关推荐
小羊没烦恼!3 分钟前
浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
前端·数据库·后端·python·web安全·oracle
myaifas6 分钟前
新人的第一个任务该怎么选
前端·产品经理
怕浪猫17 分钟前
前端转全栈最低成本的技术栈选择
前端·javascript·面试
狂师19 分钟前
AI时代我们要如何玩抓包测试:Reqable + AI Agent
前端·程序员·测试
data analyse 45621 分钟前
页面卸载时埋点上报总丢失?sendBeacon 上报与补偿方案
大数据·运维·服务器·前端·数据库·人工智能·数据分析
WebInfra29 分钟前
Rsdoctor 2.0 发布:Agent 驱动的全自动优化工具
前端·javascript·node.js
乘风gg31 分钟前
AI Coding 时代最值钱的东西,软件工程(上)
前端·ai编程·claude
IT_陈寒37 分钟前
一文搞懂Vite的核心概念
前端·人工智能·后端
data analyse 45644 分钟前
前端白屏问题按路由和资源加载顺序定位
大数据·前端·人工智能·数据分析·html
mldong1 小时前
推荐一款支持AI的数据可视化一站式报表平台
前端·人工智能