Firexport のロゴ

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 拡張機能です。

  1. Chrome ウェブストアから Firexport をインストールします。
  2. Firebase コンソールで Firestore Database を開き、パネルビュー(Panel view)からクエリビルダー(Query builder)に切り替えます(データタブの右上)。
  3. クエリのスコープ(Query scope)とパス(Path)でコレクションを選び、必要なら フィルタや上限を加えて、実行(Run)をクリックします。
  4. 結果の上のエクスポートをクリックします。Firexport が結果の全ページをたどり、CSV ファイルを 1 つ ダウンロードします。
  5. Excel で データ > テキストまたは CSV から(Data > From Text/CSV)(「データの取得と変換」グループ) に進み、ファイルを選んでプレビューを確認し、読み込み(Load)をクリックします。プレビューがおかしいときに どの設定を変えるかは下の表にあります。
Firebase コンソールの Firestore クエリビルダーと、Firexport がクエリ結果の上に追加したエクスポート ボタン
エクスポート ボタンはクエリビルダーの結果の上にあります。

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 にエクスポートしましょう。

Chrome に追加 — 無料

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 閲覧者のロールです。

  1. Admin SDK と ExcelJS をインストール: npm install firebase-admin exceljs
  2. ローカルの認証情報でサインイン: gcloud auth application-default login。サーバーでは代わりに GOOGLE_APPLICATION_CREDENTIALS でサービス アカウント キーを指定します。
  3. 下のスクリプトを 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 日の無料枠の範囲内なら費用はかかりません。