今天想幫記帳 App 加入一個功能,「把記帳資料匯出成檔案」。
這樣使用者就可以把自己的記帳紀錄保存下來,也方便之後用 Excel 查看或整理。
讓記帳資料可以匯出
我先在 App.jsx 裡建立 handleExportCSV,把目前的記帳資料轉換成 CSV 格式。
CSV其實就是一種很單純的文字表格格式,用逗號分隔欄位、換行分隔每一筆資料。
但第一次做的時候,我遇到了一個困難:
中文在 Excel 裡變成亂碼。
所以我問 AI 要怎麼樣才能不會變亂碼。
AI 告訴我可以在 CSV 開頭加入** UTF-8 BOM(\uFEFF)**,讓 Excel 能正確辨識檔案的 UTF-8 編碼:
這個 \uFEFF 可以讓 Excel 更正確地辨識 UTF-8 編碼,解決繁體中文亂碼的問題。
不用後端也可以下載檔案?
除此之外,我學到了一個重要的東西:Blob。
我利用瀏覽器提供的 API,把 CSV 文字包裝成檔案,再建立臨時下載連結:
接著建立 標籤觸發下載,下載完成後再把這個臨時 URL 釋放:
這讓我第一次比較完整地理解:
資料 → Blob → 臨時 URL → 觸發下載 → 釋放 URL
而且整個過程都可以直接在瀏覽器完成,不需要另外建立後端下載服務。
CSV 的一些規則
今天了解到CSV 並不是單純「看到逗號就切開」這麼簡單。
如果資料本身包含逗號或雙引號,就需要進行特殊處理。
例如欄位裡如果有雙引號,就要把 " 轉換成 "",並用雙引號包住整個欄位。
這些小細節我都沒有注意到,直到開始真的做匯出功能,才發現一個看似簡單的「下載 Excel」其實還是有不少細節。
我也把原本比較不直覺的「匯出 CSV」改成:匯出 Excel
不是所有人都知道什麼是CSV,這也讓這個app更趨向於大眾可以方便使用的網站。
今天同樣請他做題目給我想,在過程中學到 useMemo 和 useCallback 的差別:
今天的成果展示:
總結:
今天完成了記帳資料的 CSV 匯出功能,也學到: