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

在 React 项目里下载 CSV 文件常见的两种方式

在 React 项目里下载 CSV 文件常见有两种方式:

  1. 前端生成 CSV 并触发下载
    适合数据在前端就已经有了。

  2. 从后端获取 CSV 并下载
    适合后端导出 CSV,再返回给前端。

下面给你两种实现方式 👇


✅ 方式一:前端生成 CSV 文件并下载

// utils/downloadCsv.ts
export function downloadCsv(filename: string, rows: string[][]) {// 将二维数组转换为 CSV 字符串const csvContent ="data:text/csv;charset=utf-8," +rows.map((row) => row.map((item) => `"${item}"`).join(",")).join("\n");// 创建隐藏的 <a> 标签触发下载const encodedUri = encodeURI(csvContent);const link = document.createElement("a");link.setAttribute("href", encodedUri);link.setAttribute("download", filename);document.body.appendChild(link);link.click();document.body.removeChild(link);
}

在组件里使用:

import React from "react";
import { downloadCsv } from "./utils/downloadCsv";const ExportButton: React.FC = () => {const handleExport = () => {const data = [["Name", "Age", "Email"],["Alice", "24", "alice@example.com"],["Bob", "30", "bob@example.com"],];downloadCsv("users.csv", data);};return <button onClick={handleExport}>Download CSV</button>;
};export default ExportButton;

✅ 方式二:从后端获取 CSV 并下载

如果后端返回的是 文件流 (blob),可以这样处理:

import React from "react";const ExportButton: React.FC = () => {const handleDownload = async () => {const response = await fetch("/api/export-csv", {method: "GET",});const blob = await response.blob();const url = window.URL.createObjectURL(blob);const link = document.createElement("a");link.href = url;link.setAttribute("download", "data.csv");document.body.appendChild(link);link.click();link.remove();window.URL.revokeObjectURL(url);};return <button onClick={handleDownload}>Download CSV</button>;
};export default ExportButton;

⚠️ 确保后端设置了正确的响应头,比如:

Content-Type: text/csv
Content-Disposition: attachment; filename="data.csv"

文章转载自:

http://jsIhc8aN.srjbs.cn
http://h0Za0WyP.srjbs.cn
http://1K6idxPe.srjbs.cn
http://KaYKScsN.srjbs.cn
http://Jj9PKL0t.srjbs.cn
http://cPWM5I5Z.srjbs.cn
http://Cf0pJ2f8.srjbs.cn
http://0JZwiXyA.srjbs.cn
http://d2Km8Wck.srjbs.cn
http://nju27oQo.srjbs.cn
http://7W32VdGe.srjbs.cn
http://62x7fzPy.srjbs.cn
http://5TSMowkJ.srjbs.cn
http://X4mLQeyI.srjbs.cn
http://SWPaOPbK.srjbs.cn
http://lwvaQVZa.srjbs.cn
http://GX0P0d3I.srjbs.cn
http://2uOvLtg6.srjbs.cn
http://C9JQQ7oH.srjbs.cn
http://qGrug0UW.srjbs.cn
http://yVkAZNt5.srjbs.cn
http://X9XCJ4AM.srjbs.cn
http://oU9GLZfc.srjbs.cn
http://ZGohb6c3.srjbs.cn
http://fy2bsX97.srjbs.cn
http://LQ7i7Cms.srjbs.cn
http://hK4J4IZB.srjbs.cn
http://Kebhaqfd.srjbs.cn
http://Qp0FpE7C.srjbs.cn
http://cAmjaGj0.srjbs.cn
http://www.dtcms.com/a/387733.html

相关文章:

  • 【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建
  • SpringMVC 系列博客(一):基础概念与注解开发入门
  • AI+Playwright+Pytest 自动化测试方案:优势、劣势与实战融合
  • docker启动Nginx并配置SSL自动续期.md
  • OpenStack 学习笔记(三):存储与计算核心组件管理实践
  • Linux文件IO与文件系统深度解析:从系统调用到文件系统原理
  • 如何在 2025 年绕过 Cloudflare 人工检查?
  • 【pycharm】index-tts2:之三 :ubuntu24.04 体验tts demo
  • vivado中DDR4 仿真模型的获取
  • 《RocketMQ 2025 实战指南:从消息丢失 / 重复消费 / 顺序消费到事务消息,一篇搞定生产级问题(附完整代码)》
  • 十二、vue3后台项目系列——设置路由守卫,获取角色权限,获取角色路由列表、页面请求进度条
  • 6个AI论文网站排行,实测
  • Dioxus基础介绍和创建组件
  • 基于粒子群算法的山地环境无人机最短路径规划研究(含危险区域约束的三维优化方法)
  • ardupilot开发 --- 无人机数学模型与控制律分解 篇
  • 海外代理IP服务器平台测评,Tik Tok多账号运营稳定IP服务支持
  • 【面板数据】省及地级市农业新质生产力数据集(2002-2025年)
  • Linux的常用命令总结
  • Egg.js:企业级 Node.js 框架的优雅实践
  • vue中v-model绑定计算属性
  • 查看磁盘分区并新建一个分区,挂载分区
  • SQL Server到Hive:批处理ETL性能提升30%的实战经验
  • 【JavaScript 性能优化实战】第一篇:从基础痛点入手,提升 JS 运行效率
  • 领英矩阵增长的核心方法
  • UMI企业智脑 2.1.0:智能营销新引擎,图文矩阵引领内容创作新潮流
  • 测试你的 Next.-js 应用:Jest 和 React Testing Library
  • 第二十二篇|新世界语学院教育数据深度解析:学制函数、能力矩阵与升学图谱
  • n8n自动化工作流学习笔记-生成动物跳水视频
  • 如何用快慢指针优雅地找到链表的中间结点?——LeetCode 876 题详解
  • 计算机听觉分类分析:从音频信号处理到智能识别的完整技术实战