Firexportガイド
Firestore のデータを Excel にエクスポートする方法
Excel は Firestore を直接読めないので、どの道もファイルを経由します。Excel で開く CSV か、スクリプトが代わりに書く .xlsx です。ファイルを得るのは簡単な部分です。Excel が文字を化けさせたり、先頭のゼロを落としたり、すべてを 1 列に 詰め込んだりせずに開くところで多くの人がつまずくので、このガイドはそこも扱います。
2026年9月24日 更新。 方法 1 の拡張機能 Firexport は私たちのものです。方法 2 には不要です。
結論から言うと
- いま、1 つのクエリの結果だけ: コンソールのクエリビルダー(Query builder)からブラウザ拡張機能で CSV をエクスポートし、データ > テキストまたは CSV から(Data > From Text/CSV)で取り込みます。 方法 1
- コレクション全体を、数値と日付の型が付いた状態で: .xlsx ファイルを書く Admin SDK スクリプト。 方法 2
- Excel ではなく Google スプレッドシート: どちらのファイルもファイル > インポート(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 ファイルを 1 つ ダウンロードします。
- 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 の CSV はそうです)か、元のファイル(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)で、その列の型を日付/時刻/タイムゾーンに変える |
マップと配列は 1 つのセルにテキストとして入ります。セルには値が 1 つしか入らないからです。そのフィールドを列にしたい 場合は、データの変換(Transform Data)でその列を選び、解析 > JSON(Parse > JSON)を 使ってから展開します。それにはすべてのセルが有効な JSON である必要があり、Firexport Advanced と下のスクリプトは常に そう書きます。無料版は、値を JSON として読み戻せないときはコンソールのテキストを書きます。
2. Admin SDK スクリプトで .xlsx ファイルを書く
スクリプトなら CSV の段階を飛ばして Excel ブックを直接書けます。各セルが最初から正しい型で、数値は数値、タイムスタンプは 日付、ID はテキストなので、先頭のゼロが失われません。Node.js と、Firestore を読めるアカウントが必要です。プロジェクトの オーナーか編集者、または Cloud Datastore 閲覧者のロールです。
- 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`);- ブックにはコレクション名のシートが 1 つあり、太字の固定されたヘッダー行があります。
documentId列、 続いてフィールドごとの列です。 - タイムスタンプは
yyyy-mm-dd hh:mm:ssで表示される Excel の日付で、UTC です。マップ・配列・ジオポイントは JSON テキスト、参照はドキュメント パスです。 - Excel のシート 1 枚には 1,048,576 行が入り、スクリプトはファイルを書くまで全行をメモリに保持します。より大きな コレクションには、CSV ガイドの gcloud と BigQuery の 道を使ってください。
Google スプレッドシート
Google スプレッドシートはどちらのファイルも開けます。ファイル > インポート(File > Import)に進み、 CSV か .xlsx をアップロードして、入れる場所(新しいスプレッドシート、新しいシート、現在のシート)を選びます。
- CSV の場合、区切り文字をカンマにします(または自動検出のままにします)。
- データに先頭ゼロ付きの ID・電話番号・コードがあるなら、テキストを数値、日付、数式に変換する(Convert text to numbers, dates, and formulas)のチェックを 外します。外さないとスプレッドシートが「00123」を 123 にします。
- スプレッドシート 1 つには、全シート合わせて 1,000 万セルが入ります。
FAQ
Excel は Firestore に直接接続できますか?
組み込みのコネクタではできません。Excel の「データの取得」に Firestore のソースはありません。このガイドのように、まずファイルをエクスポートします。Excel が取り込む CSV か、スクリプトが書く .xlsx です。
CSV で Excel が「José」のような文字化けを表示するのはなぜですか?
ファイルは UTF-8 ですがバイト順マークがないため、Excel がシステムの従来のエンコーディングで読むからです。BOM で始まる CSV を使う(Firexport の CSV はそうです)か、データ > テキストまたは CSV から(Data > From Text/CSV)で取り込み、元のファイル(File Origin)を 65001: Unicode (UTF-8) にしてください。
Excel や Google スプレッドシートには何行まで入りますか?
Excel のワークシート 1 枚には 1,048,576 行が入り、セル 1 つには最大 32,767 文字が入ります。Google スプレッドシート 1 つには合計 1,000 万セルが入ります。より大きなコレクションは、gcloud と BigQuery で CSV にエクスポートし、そこでデータを扱ってください。
Firestore のデータのエクスポートには費用がかかりますか?
どの方法でもエクスポートする各ドキュメントを少なくとも 1 回読み取り、Firestore はそれをドキュメントの読み取りとして課金します。1 日の無料枠の範囲内なら費用はかかりません。
