FirexportGuias
Como exportar dados do Firestore para o Excel
O Excel não consegue ler o Firestore diretamente, então todo caminho passa por um arquivo: um CSV que você abre no Excel, ou um .xlsx que um script grava para você. Conseguir o arquivo é a parte fácil. Abri-lo sem que o Excel embaralhe o texto, derrube os zeros à esquerda ou enfie tudo em uma coluna é onde a maioria trava, e este guia cobre isso também.
Atualizado em 24 de setembro de 2026. O Firexport, a extensão do método 1, é nosso. O método 2 não precisa dele.
A resposta curta
- Os resultados de uma consulta, agora: exporte um CSV do criador de consultas (Query builder) do console com uma extensão do navegador e importe com Dados > De Texto/CSV (Data > From Text/CSV). Método 1
- Uma coleção inteira, com números e datas já tipados: um script do Admin SDK que grava um arquivo .xlsx. Método 2
- Google Sheets em vez do Excel: importe qualquer um dos arquivos com Arquivo > Importar (File > Import). Google Sheets
1. Exportar um CSV do Console do Firebase e abri-lo no Excel
A página do Firestore no Console do Firebase tem um criador de consultas (Query builder) que executa uma consulta e mostra os resultados em uma tabela, mas nada para baixá-los. O Firexport é uma extensão gratuita do Chrome que adiciona um botão Exportar ao lado desses resultados.
- Instale o Firexport pela Chrome Web Store.
- No Console do Firebase, abra Firestore Database e mude de visualização em painel (Panel view) para criador de consultas (Query builder) (canto superior direito da guia Dados).
- Escolha a coleção em Escopo da consulta (Query scope) e Caminho (Path), adicione filtros ou um limite se quiser e clique em Executar (Run).
- Clique em Exportar acima dos resultados. O Firexport percorre todas as páginas dos resultados e baixa um único arquivo CSV.
- No Excel, vá em Dados > De Texto/CSV (Data > From Text/CSV) (no grupo Obter e Transformar Dados), escolha o arquivo, confira a visualização e clique em Carregar (Load). A tabela abaixo diz qual configuração mudar se a visualização parecer errada.

O CSV do Firexport começa com uma marca de ordem de bytes UTF-8, então o Excel lê texto não inglês corretamente mesmo se você só der dois cliques no arquivo. Ainda assim, com dois cliques o Excel adivinha o separador e os tipos, e por isso a caixa de diálogo de importação é o caminho mais seguro. Na versão gratuita, os timestamps saem como o console os mostra (por exemplo “August 24, 2026 at 1:16:09 PM UTC+9”), e o Excel os mantém como texto. O Firexport Advanced, uma licença de compra única, grava timestamps ISO 8601 que o Excel consegue transformar em datas, e restaura mapas e arrays longos que o console corta com “…”.
Exporte sua próxima consulta do Firestore para um CSV que abre limpo no Excel, direto do console.
Quando o Excel estraga um CSV
Isso acontece com qualquer CSV, seja qual for o jeito que você exportou. Todas as correções são configurações na visualização de De Texto/CSV (From Text/CSV).
| O que você vê | Por quê | Correção |
|---|---|---|
| Texto acentuado ou não latino sai embaralhado: “José Müller” aparece como “José Müller” | O CSV é UTF-8 sem marca de ordem de bytes (BOM), então o Excel o lê na codificação legada do seu sistema | Use um CSV que comece com BOM (o do Firexport começa), ou defina Origem do Arquivo (File Origin) como 65001: Unicode (UTF-8) |
| Todas as linhas caem na coluna A | Sua região usa ponto e vírgula como separador de lista (comum na Europa), e o arquivo usa vírgulas | Defina Delimitador (Delimiter) como Vírgula |
| “00123” vira 123, e um ID de 20 dígitos vira 1.23457E+19 | O Excel transforma em número tudo o que parece número, e números guardam só 15 dígitos | Defina a detecção de tipo de dados como Não detectar tipos de dados (Do not detect data types), para que toda coluna chegue como texto |
| Timestamps são ordenados como texto, não como datas | Aberto diretamente, o Excel deixa texto ISO 8601 como 2026-08-24T04:16:09Z como texto. Com a detecção de tipo desligada, toda coluna é texto | Em Transformar Dados (Transform Data), mude o tipo da coluna para Data/Hora/Fuso Horário |
Mapas e arrays chegam como texto em uma célula, porque uma célula guarda um valor. Se precisar dos campos deles como colunas, selecione a coluna em Transformar Dados (Transform Data) e use Analisar > JSON (Parse > JSON), depois expanda. Isso exige JSON válido em toda célula, o que o Firexport Advanced e o script abaixo sempre gravam; a versão gratuita grava o texto do console quando não consegue ler um valor de volta como JSON.
2. Gravar um arquivo .xlsx com um script do Admin SDK
Um script pode pular a etapa do CSV e gravar uma pasta de trabalho do Excel diretamente, com cada célula já no tipo certo: números como números, timestamps como datas e IDs como texto, então nada perde um zero à esquerda. Ele precisa do Node.js e de uma conta que possa ler o Firestore: um Proprietário ou Editor do projeto, ou o papel Leitor do Cloud Datastore.
- Instale o Admin SDK e o ExcelJS:
npm install firebase-admin exceljs - Faça login para obter credenciais locais:
gcloud auth application-default login. Em um servidor, aponteGOOGLE_APPLICATION_CREDENTIALSpara uma chave de conta de serviço. - Salve o script abaixo como
export-to-excel.mjs, substituayour-project-ide executenode 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`);- A pasta de trabalho tem uma planilha com o nome da coleção e uma linha de cabeçalho em negrito e congelada: uma coluna
documentIde depois uma coluna por campo. - Timestamps são datas do Excel mostradas como
yyyy-mm-dd hh:mm:ss, em UTC. Mapas, arrays e geopoints são texto JSON, e referências são caminhos de documento. - Uma planilha do Excel comporta 1.048.576 linhas, e o script mantém todas as linhas na memória até gravar o arquivo. Para coleções maiores, use o caminho do gcloud e BigQuery no guia de CSV.
Google Sheets
O Google Sheets abre os dois arquivos. Vá em Arquivo > Importar (File > Import), envie o CSV ou o .xlsx e escolha para onde ele vai (uma nova planilha, uma nova página ou a atual).
- Para um CSV, defina o separador como Vírgula (ou deixe em Detectar automaticamente).
- Desmarque Converter texto em números, datas e fórmulas (Convert text to numbers, dates, and formulas) se seus dados tiverem IDs, telefones ou códigos com zeros à esquerda. Senão o Sheets transforma “00123” em 123.
- Uma planilha comporta 10 milhões de células no total, somando todas as páginas.
Perguntas frequentes
O Excel consegue se conectar ao Firestore diretamente?
Não com um conector integrado: o Obter Dados do Excel não tem uma fonte Firestore. Você exporta um arquivo primeiro, um CSV que o Excel importa ou um .xlsx que um script grava, como mostra este guia.
Por que o Excel mostra caracteres embaralhados como “José” no meu CSV?
O arquivo é UTF-8, mas não tem marca de ordem de bytes, então o Excel o lê na codificação legada do seu sistema. Use um CSV que comece com BOM (o do Firexport começa), ou importe com Dados > De Texto/CSV (Data > From Text/CSV) e defina Origem do Arquivo (File Origin) como 65001: Unicode (UTF-8).
Quantas linhas o Excel ou o Google Sheets comportam?
Uma planilha do Excel comporta 1.048.576 linhas, e uma célula, no máximo 32.767 caracteres. Uma planilha do Google Sheets comporta 10 milhões de células no total. Para coleções maiores, exporte para CSV com gcloud e BigQuery e trabalhe com os dados lá.
Exportar dados do Firestore custa dinheiro?
Todos os métodos leem cada documento exportado pelo menos uma vez, e o Firestore cobra isso como leituras de documento. Dentro da cota gratuita diária, não custa nada.
