如何將 Firestore 資料匯出到 Excel
Excel 無法直接讀取 Firestore,所以每條路線都要經過一個檔案:在 Excel 中開啟的 CSV,或由指令碼替你寫出的 .xlsx。 拿到檔案是容易的部分。開啟它時不讓 Excel 弄亂文字、丟掉前導零或把所有內容塞進一欄,才是大多數人卡住的地方, 本指南也會講到這些。
更新於 2026年9月24日。 方法 1 中的擴充功能 Firexport 是我們開發的。方法 2 不需要它。
簡短回答
- 現在就要某一個查詢的結果: 在控制台的查詢建構工具(Query builder)中用瀏覽器擴充功能匯出 CSV,然後透過資料 > 從文字/CSV(Data > From Text/CSV)匯入。 方法 1
- 整個集合,且數字和日期已經帶有正確類型: 一段寫出 .xlsx 檔案的 Admin SDK 指令碼。 方法 2
- 用 Google 試算表而不是 Excel: 透過檔案 > 匯入(File > Import)匯入任一檔案。 Google 試算表
1. 從 Firebase 控制台匯出 CSV,然後在 Excel 中開啟
Firebase 控制台的 Firestore 頁面有一個查詢建構工具(Query builder),可以執行查詢並把結果顯示在 表格中,但沒有任何下載它們的方法。Firexport 是一款免費的 Chrome 擴充功能,會在這些結果旁邊加入一個「匯出」按鈕。
- 從 Chrome 線上應用程式商店安裝 Firexport。
- 在 Firebase 控制台開啟 Firestore Database,從面板檢視(Panel view)切換到查詢建構工具(Query builder)(「資料」分頁的右上角)。
- 在查詢範圍(Query scope)和路徑(Path)下選擇集合,需要的話加入篩選條件或限制, 然後按一下執行(Run)。
- 按一下結果上方的匯出。Firexport 會走過結果的每一頁,下載一個 CSV 檔案。
- 在 Excel 中,前往資料 > 從文字/CSV(Data > From Text/CSV)(「取得及轉換資料」群組),選擇檔案, 檢查預覽,然後按一下載入(Load)。如果預覽看起來不對,下面的表格會告訴你該改哪個設定。

Firexport 的 CSV 以 UTF-8 位元組順序標記開頭,所以即使你只是按兩下檔案,Excel 也能正確讀取非英文文字。不過按兩下 仍會讓 Excel 猜測分隔符號和類型,這就是為什麼匯入對話方塊是更穩妥的路線。在免費版中,時間戳記依控制台顯示的樣子輸出 (例如「August 24, 2026 at 1:16:09 PM UTC+9」),Excel 會把它留作文字。Firexport Advanced(一次性授權)會寫出 Excel 能轉換成日期的 ISO 8601 時間戳記,並還原被控制台用「…」截斷的長對應和陣列。
直接從控制台把你的下一個 Firestore 查詢匯出成能在 Excel 中乾淨開啟的 CSV。
當 Excel 把 CSV 弄壞時
無論你用哪種方式匯出,任何 CSV 都可能出現這些問題。所有修正都在從文字/CSV(From Text/CSV)預覽的設定裡。
| 你看到的現象 | 原因 | 修正 |
|---|---|---|
| 帶重音的文字或非拉丁文字亂碼:「José Müller」顯示成「José Müller」 | CSV 是不帶位元組順序標記(BOM)的 UTF-8,所以 Excel 用系統的舊版編碼讀取 | 使用以 BOM 開頭的 CSV(Firexport 的就是),或把檔案原點(File Origin)設為 65001: Unicode (UTF-8) |
| 每一列都擠在 A 欄裡 | 你所在地區的清單分隔符號是分號(歐洲常見),而檔案用的是逗號 | 把分隔符號(Delimiter)設為逗號 |
| 「00123」變成 123,20 位數的 ID 變成 1.23457E+19 | Excel 會把任何看起來像數字的內容轉成數字,而數字只保留 15 位 | 把資料類型偵測設為不要偵測資料類型(Do not detect data types),讓每一欄都以文字匯入 |
| 時間戳記依文字而不是依日期排序 | 直接開啟時,Excel 會把 2026-08-24T04:16:09Z 這樣的 ISO 8601 文字留作文字。關閉類型偵測後,每一欄都是文字 | 在轉換資料(Transform Data)中把該欄的類型改為日期/時間/時區 |
對應和陣列會以文字形式放在一個儲存格裡,因為一個儲存格只能放一個值。如果你需要把它們的欄位拆成欄,在轉換資料(Transform Data)中選取該欄,使用剖析 > JSON(Parse > JSON),然後展開。 這要求每個儲存格都是有效的 JSON,Firexport Advanced 和下面的指令碼總是這樣寫;免費版在無法把值重新解析成 JSON 時會寫入控制台的文字。
2. 用 Admin SDK 指令碼寫出 .xlsx 檔案
指令碼可以跳過 CSV 這一步,直接寫出 Excel 活頁簿,每個儲存格一開始就是正確的類型:數字是數字,時間戳記是日期,ID 是文字,所以不會丟掉前導零。它需要 Node.js 和一個能讀取 Firestore 的帳戶:專案 Owner 或 Editor,或者 Cloud Datastore Viewer 角色。
- 安裝 Admin SDK 和 ExcelJS:
npm install firebase-admin exceljs - 登入以取得本機憑證:
gcloud auth application-default login。在伺服器上,改為讓GOOGLE_APPLICATION_CREDENTIALS指向服務帳戶金鑰。 - 把下面的指令碼存成
export-to-excel.mjs,替換your-project-id,然後執行node export-to-excel.mjs users。
// Usage: node export-to-excel.mjs users → writes users.xlsx
import ExcelJS from 'exceljs';
import { initializeApp } from 'firebase-admin/app';
import {
getFirestore,
FieldPath,
Timestamp,
GeoPoint,
DocumentReference,
} from 'firebase-admin/firestore';
initializeApp({ projectId: 'your-project-id' });
const db = getFirestore();
const collection = process.argv[2];
if (!collection) throw new Error('Usage: node export-to-excel.mjs <collection>');
// Read the collection 1,000 documents at a time, so large collections don't time out.
const docs = [];
let last;
while (true) {
let query = db.collection(collection).orderBy(FieldPath.documentId()).limit(1000);
if (last) query = query.startAfter(last);
const page = await query.get();
if (page.empty) break;
docs.push(...page.docs);
last = page.docs[page.docs.length - 1];
}
// Firestore types become plain values: timestamps as ISO 8601, references as paths.
function plain(value) {
if (value instanceof Timestamp) return value.toDate().toISOString();
if (value instanceof DocumentReference) return value.path;
if (value instanceof GeoPoint) return { latitude: value.latitude, longitude: value.longitude };
if (value instanceof Uint8Array) return Buffer.from(value).toString('base64');
if (Array.isArray(value)) return value.map(plain);
if (value && typeof value === 'object') {
return Object.fromEntries(Object.entries(value).map(([key, v]) => [key, plain(v)]));
}
return value;
}
// A timestamp field becomes a real Excel date (in UTC). A cell holds one value, so maps and arrays
// go in as JSON text. Strings stay strings, so IDs like "00123" keep their leading zeros.
function cell(value) {
if (value instanceof Timestamp) return value.toDate();
const v = plain(value);
return v !== null && typeof v === 'object' ? JSON.stringify(v) : v;
}
const rows = docs.map((doc) => ({ documentId: doc.id, ...doc.data() }));
// Documents in one collection can have different fields, so the columns are all of them.
const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet(collection.slice(0, 31), { views: [{ state: 'frozen', ySplit: 1 }] });
sheet.columns = columns.map((key) => ({ header: key, key, width: 20 }));
sheet.getRow(1).font = { bold: true };
for (const row of rows) {
const added = sheet.addRow(Object.fromEntries(columns.map((key) => [key, cell(row[key])])));
added.eachCell((c) => {
if (c.value instanceof Date) c.numFmt = 'yyyy-mm-dd hh:mm:ss';
});
}
await workbook.xlsx.writeFile(`${collection}.xlsx`);
console.log(`Wrote ${rows.length} documents to ${collection}.xlsx`);- 活頁簿有一個以集合命名的工作表,帶有粗體且凍結的標題列:一個
documentId欄,然後是每個欄位一欄。 - 時間戳記是顯示為
yyyy-mm-dd hh:mm:ss的 Excel 日期,採用 UTC。對應、陣列和地理位置點是 JSON 文字, 參照是文件路徑。 - 一個 Excel 工作表可容納 1,048,576 列,指令碼在寫入檔案之前會把每一列都放在記憶體中。對於更大的集合,請使用CSV 指南中的 gcloud 和 BigQuery 路線。
Google 試算表
Google 試算表可以開啟這兩種檔案。前往檔案 > 匯入(File > Import),上傳 CSV 或 .xlsx, 然後選擇放到哪裡(新試算表、新工作表或目前的工作表)。
- 對於 CSV,把分隔符號設為逗號(或保留「自動偵測」)。
- 如果你的資料裡有帶前導零的 ID、電話號碼或代碼,請取消勾選將文字轉換為數字、日期和公式(Convert text to numbers, dates, and formulas)。否則試算表會把 「00123」變成 123。
- 一個試算表所有工作表加起來最多可容納 1000 萬個儲存格。
常見問題
Excel 能直接連線 Firestore 嗎?
沒有內建連接器:Excel 的「取得資料」裡沒有 Firestore 資料來源。你需要先匯出一個檔案,要嘛是 Excel 匯入的 CSV,要嘛是指令碼寫出的 .xlsx,如本指南所示。
為什麼 Excel 在我的 CSV 裡顯示「José」這樣的亂碼?
檔案是 UTF-8 但沒有位元組順序標記,所以 Excel 用系統的舊版編碼讀取。請使用以 BOM 開頭的 CSV(Firexport 的就是),或透過資料 > 從文字/CSV(Data > From Text/CSV)匯入並把檔案原點(File Origin)設為 65001: Unicode (UTF-8)。
Excel 或 Google 試算表能容納多少列?
一個 Excel 工作表可容納 1,048,576 列,一個儲存格最多 32,767 個字元。一個 Google 試算表總共可容納 1000 萬個儲存格。對於更大的集合,請用 gcloud 和 BigQuery 匯出成 CSV,並在那裡處理資料。
匯出 Firestore 資料要花錢嗎?
每種方法都會至少讀取一次每份匯出的文件,Firestore 會把這些計為文件讀取。在每日免費配額內不花錢。
