FirexportGuías
Cómo exportar datos de Firestore a Excel
Excel no puede leer Firestore directamente, así que toda ruta pasa por un archivo: un CSV que abres en Excel, o un .xlsx que un script escribe por ti. Conseguir el archivo es la parte fácil. Abrirlo sin que Excel corrompa el texto, quite los ceros iniciales o meta todo en una columna es donde la mayoría se atasca, y esta guía también cubre eso.
Actualizado el 24 de septiembre de 2026. Firexport, la extensión del método 1, es nuestra. El método 2 no la necesita.
La respuesta corta
- Los resultados de una consulta, ahora mismo: exporta un CSV desde el compilador de consultas (Query builder) de la consola con una extensión del navegador y luego impórtalo con Datos > Desde el texto/CSV (Data > From Text/CSV). Método 1
- Una colección entera, con números y fechas ya tipados: un script del Admin SDK que escribe un archivo .xlsx. Método 2
- Google Sheets en lugar de Excel: importa cualquiera de los dos archivos con Archivo > Importar (File > Import). Google Sheets
1. Exportar un CSV desde Firebase console y abrirlo en Excel
La página de Firestore en Firebase console tiene un compilador de consultas (Query builder) que ejecuta una consulta y muestra los resultados en una tabla, pero nada con qué descargarlos. Firexport es una extensión gratuita de Chrome que agrega un botón Exportar junto a esos resultados.
- Instala Firexport desde Chrome Web Store.
- En Firebase console, abre Firestore Database y cambia de vista de panel (Panel view) a compilador de consultas (Query builder) (arriba a la derecha de la pestaña Datos).
- Elige la colección en Alcance de la consulta (Query scope) y Ruta (Path), agrega filtros o un límite si quieres, y haz clic en Ejecutar (Run).
- Haz clic en Exportar encima de los resultados. Firexport recorre todas las páginas de resultados y descarga un solo archivo CSV.
- En Excel, ve a Datos > Desde el texto/CSV (Data > From Text/CSV) (en el grupo Obtener y transformar datos), elige el archivo, revisa la vista previa y haz clic en Cargar (Load). La tabla de abajo dice qué ajuste cambiar si la vista previa se ve mal.

El CSV de Firexport empieza con una marca de orden de bytes UTF-8, así que Excel lee bien el texto que no es inglés aunque solo hagas doble clic en el archivo. Aun así, con doble clic Excel adivina el separador y los tipos, y por eso el diálogo de importación es la ruta más segura. En la versión gratuita, las marcas de tiempo salen como las muestra la consola (por ejemplo “August 24, 2026 at 1:16:09 PM UTC+9”), y Excel las deja como texto. Firexport Advanced, una licencia de pago único, escribe marcas de tiempo ISO 8601 que Excel puede convertir en fechas, y restaura los mapas y arreglos largos que la consola corta con “…”.
Exporta tu próxima consulta de Firestore a un CSV que se abre limpio en Excel, directamente desde la consola.
Cuando Excel estropea un CSV
Esto pasa con cualquier CSV, lo hayas exportado como lo hayas exportado. Todas las soluciones son ajustes en la vista previa de Desde el texto/CSV (From Text/CSV).
| Lo que ves | Por qué | Solución |
|---|---|---|
| El texto con acentos o no latino sale corrupto: “José Müller” aparece como “José Müller” | El CSV es UTF-8 sin marca de orden de bytes (BOM), así que Excel lo lee con la codificación heredada de tu sistema | Usa un CSV que empiece con BOM (el de Firexport lo hace), o pon Origen de archivo (File Origin) en 65001: Unicode (UTF-8) |
| Todas las filas caen en la columna A | Tu región usa punto y coma como separador de listas (habitual en Europa) y el archivo usa comas | Pon Delimitador (Delimiter) en Coma |
| “00123” se convierte en 123, y un ID de 20 dígitos en 1.23457E+19 | Excel convierte en número todo lo que parece un número, y los números conservan solo 15 dígitos | Pon la detección de tipos de datos en No detectar tipos de datos (Do not detect data types), para que cada columna llegue como texto |
| Las marcas de tiempo se ordenan como texto, no como fechas | Abierto directamente, Excel deja texto ISO 8601 como 2026-08-24T04:16:09Z como texto. Con la detección de tipos desactivada, todas las columnas son texto | En Transformar datos (Transform Data), cambia el tipo de la columna a Fecha/Hora/Zona horaria |
Los mapas y arreglos llegan como texto en una celda, porque una celda contiene un solo valor. Si necesitas sus campos como columnas, selecciona la columna en Transformar datos (Transform Data) y usa Analizar > JSON (Parse > JSON), luego expándela. Eso requiere JSON válido en cada celda, que Firexport Advanced y el script de abajo siempre escriben; la versión gratuita escribe el texto de la consola cuando no puede volver a leer un valor como JSON.
2. Escribir un archivo .xlsx con un script del Admin SDK
Un script puede saltarse el paso del CSV y escribir directamente un libro de Excel, con cada celda ya del tipo correcto: los números como números, las marcas de tiempo como fechas y los ID como texto, así nada pierde un cero inicial. Necesita Node.js y una cuenta que pueda leer Firestore: un Propietario o Editor del proyecto, o el rol Visualizador de Cloud Datastore.
- Instala el Admin SDK y ExcelJS:
npm install firebase-admin exceljs - Inicia sesión para obtener credenciales locales:
gcloud auth application-default login. En un servidor, apuntaGOOGLE_APPLICATION_CREDENTIALSa una clave de cuenta de servicio. - Guarda el script de abajo como
export-to-excel.mjs, reemplazayour-project-idy ejecutanode 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`);- El libro tiene una hoja con el nombre de la colección y una fila de encabezado en negrita e inmovilizada: una columna
documentIdy luego una columna por campo. - Las marcas de tiempo son fechas de Excel mostradas como
yyyy-mm-dd hh:mm:ss, en UTC. Los mapas, arreglos y geopuntos son texto JSON, y las referencias son rutas de documento. - Una hoja de Excel admite 1.048.576 filas, y el script mantiene todas las filas en memoria hasta que escribe el archivo. Para colecciones más grandes, usa la ruta de gcloud y BigQuery de la guía de CSV.
Google Sheets
Google Sheets abre ambos archivos. Ve a Archivo > Importar (File > Import), sube el CSV o el .xlsx y elige dónde va (una hoja de cálculo nueva, una hoja nueva o la actual).
- Para un CSV, pon el separador en Coma (o déjalo en Detectar automáticamente).
- Desmarca Convertir texto en números, fechas y fórmulas (Convert text to numbers, dates, and formulas) si tus datos tienen ID, teléfonos o códigos con ceros iniciales. Si no, Sheets convierte “00123” en 123.
- Una hoja de cálculo admite 10 millones de celdas en total, entre todas sus hojas.
Preguntas frecuentes
¿Puede Excel conectarse a Firestore directamente?
No con un conector integrado: Obtener datos de Excel no tiene una fuente de Firestore. Primero exportas un archivo, ya sea un CSV que Excel importa o un .xlsx que escribe un script, como muestra esta guía.
¿Por qué Excel muestra caracteres corruptos como “José” en mi CSV?
El archivo es UTF-8 pero no tiene marca de orden de bytes, así que Excel lo lee con la codificación heredada de tu sistema. Usa un CSV que empiece con BOM (el de Firexport lo hace), o impórtalo con Datos > Desde el texto/CSV (Data > From Text/CSV) y pon Origen de archivo (File Origin) en 65001: Unicode (UTF-8).
¿Cuántas filas admiten Excel o Google Sheets?
Una hoja de Excel admite 1.048.576 filas, y una celda como máximo 32.767 caracteres. Una hoja de cálculo de Google Sheets admite 10 millones de celdas en total. Para colecciones más grandes, exporta a CSV con gcloud y BigQuery y trabaja con los datos allí.
¿Exportar datos de Firestore cuesta dinero?
Todos los métodos leen cada documento exportado al menos una vez, y Firestore los factura como lecturas de documentos. Dentro de la cuota gratuita diaria no cuesta nada.
