純前端 JavaScript 實現數據導出到 CSV 格式

CSV格式特點
日常開發中,數據導出到文件通常有兩種方式:

  • 后端處理,以文件流或者資源路徑的方式返回;
  • 后端返回數據,前端按需處理后再觸發瀏覽器的下載事件,已保存到本地文件。

這里介紹后者的一種零依賴的實現方式。

保存內容到文件

通過 JS 創建一個隱藏的超鏈接,并主動點擊觸發下載事件。

/*** 保存內容到文件* @param {*} blob* @param {*} fileName*/
function saveToFile(blob, fileName = "下載文件.txt") {if (!(!!blob && blob.toString() == '[object Blob]')) {blob = new Blob([blob])}let link = document.createElement('a')link.href = window.URL.createObjectURL(blob)    // 創建下載的鏈接link.download = fileName                        // 下載后文件名link.style.display = 'none'document.body.appendChild(link)link.click()                                    // 點擊下載window.URL.revokeObjectURL(link.href)           // 釋放掉blob對象document.body.removeChild(link)                 // 下載完成移除元素
}

生成CSV格式

CSV(Comma-Separated Values,逗號分隔值)是一種純文本格式,用于以表格形式存儲數據,廣泛應用于數據交換和處理,特別是在電子表格軟件(如 Excel)和數據庫系統之間的數據傳輸中。

處理起來也是比較簡單,將二維數組中的子數組以分隔符(默認英文逗號)連接后以換行符拼接即可。這里需要注意特殊字段的處理:

  • 長字符串:特別是本身包含換行符(此時使用 ` 包裹)
  • 數組:通過換行符拼接
const NEW_LINE = "\n"/*** 處理特殊字符,若參數為數組則進行換行轉換* @Param {*} v*/ 
const fixToCsv = v=>{if(Array.isArray(v))return `"${v.join(NEW_LINE).replace(/"/g, "`")}"`if(typeof(v)==='string')return `"${v.replace(/"/g, "`")}"`return v
}/*** 保存到 CSV 默認編碼為 UTF-8* @param {Array|Object} obj - 數據對象,可以是二維數組/Object(包含 headers、rows 屬性)* @param {String} fileName - 文件名* @param {String} newLine - 換行符,默認 \n*/
function saveToCSV(obj, fileName = "下載文件", newLine=NEW_LINE) {let csvText = ""//參數為數組的情況if(Array.isArray(obj)){csvText = Array.isArray(obj[0])? obj.map(v=>v.map(fixToCsv).join(",")).join(newLine): obj.join(newLine)}else if(typeof(obj) === 'object'){let { headers, rows } = objif(!headers && !Array.isArray(headers)) throw Error(`[CSV導出] Object 類型的參數必須傳遞 headers 屬性`)//寫入標題欄csvText += headers.map(h=> typeof(h)==='object'?h.text:h).join(",") + newLinelet headerIds = headers.map(h=> typeof(h)==='object'? h.key:h)rows.forEach((row,rIndex)=>{csvText += headerIds.map(id=>fixToCsv(row[id])).join(",") + newLine})}else if(typeof(obj) === 'string')csvText = objsaveToFile(new Blob([csvText], { type: "application/csv;charset=utf-8" }), `${fileName}.csv`)
}

如何使用

// 拿到后臺數據
const rows = fetch("{API}")
let csv = []
csv.push(["序號","名稱","聯系方式"])
// 處理數據
rows.forEach((row, i)=>{csv.push([`${i+1}`,row.name, row.phone])
})saveToCSV(csv, "用戶導出")

之后瀏覽器會下載最終的 CSV 文件(此時需要注意彈窗攔截)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88855.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

香港理工大學實驗室定時預約

香港理工大學實驗室定時預約 文章目錄香港理工大學實驗室定時預約簡介接單價格軟件界面網站預約界面代碼對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學(系統理論和實戰教程)、提供接單兼職渠道:https://blog.csdn.net/weixin_35770067/article/d…

Spring AI 項目實戰(十七):Spring Boot + AI + 通義千問星辰航空智能機票預訂系統(附完整源碼)

系列文章 序號文章名稱1Spring AI 項目實戰(一):Spring AI 核心模塊入門2Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼)3Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼)4

STM32CubeMX+CLion 使用ARM_CMSIS_DSP

安裝 參考: 【CLion開發stm32】如何使用DSP庫 - 未知的奇跡 - 博客園 實際上這樣配置會出一點小問題,現對其修改 1. 項目根目錄下新建 DSP_LIB文件夾 將目錄STM32CubeMX\Repository\STM32Cube_FW_G4_V1.6.1\Drivers\CMSIS\DSP下的Include文件夾和So…

深入解析C#接口實現的兩種核心技術:派生繼承 vs 顯式實現

—— 如何優雅解決多接口沖突問題 🔍 核心概念速覽 派生成員實現 類通過繼承基類方法隱式滿足接口實現需求 interface IIfc1 { void PrintOut(string s); }class MyBaseClass { // 基類實現方法 public void PrintOut(string s) > Console.WriteLine($"Cal…

鴻蒙項目構建配置

鴻蒙項目構建配置 參考文檔 深入鴻蒙開發之后,一般會遇到以下幾個問題。 每次編譯的時候需要手動配置不同的 versionCode 和 versionName;在使用 git 管理代碼的時候,不同的人或者不在同一臺電腦上,dev eco 這個編譯器需要經常…

os.machine()詳解

核心功能返回硬件架構 返回字符串表示系統的硬件架構,常見值包括: x86_64:64 位 x86 架構(Intel/AMD)armv7l:32 位 ARM 架構(如樹莓派 3B)aarch64:64 位 ARM 架構&#x…

linux-shell腳本

linux-shell腳本一、什么是shell腳本?二、為什么要學習shell腳本?三、腳本執行的方式3.1 bash test.sh3.2 ./test.sh3.3 source test.sh3.4 . test.sh四、變量的使用4.1 變量定義與使用4.2 避免變量混淆4.3 位置變量for循環和位置變量的結合案例4.4 read…

【嵌入式】51單片機學習筆記-Keil5軟件安裝教程

00. 目錄 文章目錄00. 目錄01. Keil C51概述02. Keil C51下載03. Keil C51安裝04. Keil C51注冊05. 附錄01. Keil C51概述 Keil C51 是德國Keil公司(現被ARM收購)開發的嵌入式開發工具,專注于8051單片機的C語言和匯編開發。它是μVision IDE…

ai之 ubuntu本地安裝mineru2.1.0

MinerU 目錄 一、更新內容概述寫在前面的話:總體來看,2.0版本升級為全新的 VLM 解析模式,更優于以前的基礎解析方式。二、MinerU 安裝部署下面使用源碼來進行環境安裝。注意:當前狀態說明推薦解決方案如果是下載插件慢可以 指定阿里源三、MinerU 使用1. 在線體驗2. 命令行使…

華為昇騰NPU與NVIDIA CUDA生態兼容層開發實錄:手寫算子自動轉換工具鏈(AST級代碼遷移方案)

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,按量計費,靈活彈性,頂級配置,學生專屬優惠。 當國產AI芯片崛起遭遇生態壁壘,如何實現CUDA算子到昇騰平臺的無損遷移成為關鍵挑…

GraphRAG Docker化部署,接入本地Ollama完整技術指南:從零基礎到生產部署的系統性知識體系

相關推薦:Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署) 一、技術背景與發展脈絡 1.1 RAG技術演進歷程分析 檢索增強生成(RAG)技術的發展經歷了三個重要…

Android 系統默認Launcher3 菜單模式雙層改成單層-3

Android 系統默認自帶Launcher3 菜單都為雙層模式 各手機大廠的Launcher的菜單模式都為單層 如何將launcher3的菜單模式改為單層模式 mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); mWidgetsButton = findViewById(R.id.widget_butto…

基于k8s環境下pulsar高可用測試和擴縮容(上)

#作者:任少近 文章目錄Pulsar高可用測試1. 測試目的2.當前集群環境說明3. 模擬故障場景4.功能驗證5.結論Pulsar高可用測試 1. 測試目的 本次測試旨在驗證 Apache Pulsar 在某個 Broker 節點宕機(down)的情況下,是否仍能正常提供…

JAVA JVM垃圾收集

JVM 垃圾收集是 Java 自動內存管理的核心,本文通過圍繞 “哪些是垃圾、何時回收、怎么回收、用啥回收器、內存咋分配” 等展開一、判斷哪些是垃圾引用計數法:給對象分配引用計數器,有引用時計數加 1,引用失效減 1 ,計數…

UniHttp生命周期鉤子與公共參數實戰:打造智能天氣接口客戶端

> 通過靈活的生命周期鉤子,我們讓HTTP請求從機械操作進化為智能對話 在現代應用開發中,高效處理HTTP請求是核心能力。本文將深入探索UniHttp框架中強大的**HttpApiProcessor生命周期鉤子**,并演示如何利用其**公共參數填充機制**優雅地處理第三方接口。我們將以百度天…

C++高級編程,類模版成員函數類外實現

#include <iostream> #include <string>//類模版成員函數類外實現 template<class T1,class T2> class Person {//Person構造函數 public:Person(T1 name,T2 age);// {// this->m_Namename;// this->m_Ageage;// }//Person的成員函數void show…

[Linux入門 ] RAID存儲技術概述

一.數據存儲架構 1??存儲系統 2??主機系統 3??互連部件 4??存儲設備與磁盤陣列 二.數據存儲技術 1??數據冗余技術 2??RAID 0 3??RAID 1 4??RAID 2 5??RAID 3 6??RAID 4 三.基于硬件的RAID磁盤陣列 1??陣列卡(RAID控制器) 2??陣列卡種類 …

AI繪畫生成章邯全身像提示詞

融合了歷史元素和視覺表現力&#xff0c;力求生成符合秦末名將章邯身份的全身像。 核心提示詞結構&#xff1a; [主體描述]&#xff0c;[服裝/盔甲細節]&#xff0c;[姿態/神情]&#xff0c;[武器]&#xff0c;[背景/氛圍]&#xff0c;[風格/質量]&#xff0c;[參數] 選項一&…

iOS高級開發工程師面試——關于優化

iOS高級開發工程師面試——關于優化 一、TableView 有什么好的性能優化方案?二、界面卡頓和檢測你都是怎么處理?三、談談你對離屏渲染的理解?四、如何降低APP包的大小?五、日常如何檢查內存泄露?六、APP啟動時間應從哪些方面優化?一、TableView 有什么好的性能優化方案?…

線性基學習筆記

我們稱一個線性空間 V V V 的一個極大線性無關集為這個線性空間的線性基,簡稱基。 異或線性基 在異或空間下,我們定義如下內容。 異或和 設 S S