Explorando el blog de Toni
Toni Domenech

El Blog de Toni Domenech

Ideas, código, reflexiones y experimentos digitales

Crear rápido
Panel

Cómo crear una hoja de cálculo avanzada de ingresos y gastos en Excel con ayuda de ChatGPT y mostrarla en un dashboard HTML con Bootstrap

20/04/2026 13:24
Cómo crear una hoja de cálculo avanzada de ingresos y gastos en Excel con ayuda de ChatGPT y mostrarla en un dashboard HTML con Bootstrap

Resumen listo para agente

Qué: Este artículo explica Cómo crear una hoja de cálculo avanzada de ingresos y gastos en Excel con ayuda de ChatGPT y mostrarla en un dashboard HTML con Bootstrap.

Por qué: Sirve para tomar decisiones rápidas con contexto técnico y de negocio.

Cómo: Cómo crear una hoja de cálculo avanzada de ingresos y gastos en Excel con ayuda de ChatGPT y mostrarla en un dashboard HTML con BootstrapLa inteligencia artificial no sustituye el aprendizaj...

Preguntas clave de esta página

  • ¿Qué resuelve exactamente este enfoque?
  • ¿Qué resultados puedo esperar en tiempo y coste?
  • ¿Cómo lo adapto a mi contexto sin rehacer todo?

Cómo crear una hoja de cálculo avanzada de ingresos y gastos en Excel con ayuda de ChatGPT y mostrarla en un dashboard HTML con Bootstrap

La inteligencia artificial no sustituye el aprendizaje de Excel: lo acelera. Para alumnos de más de 45 años, esta combinación es especialmente útil porque permite construir herramientas prácticas sin empezar desde cero y, al mismo tiempo, entender mejor la lógica de una hoja de cálculo bien diseñada.

En este proyecto vamos a crear un libro de Excel avanzado para controlar ingresos y gastos del hogar, usar ChatGPT para generar la estructura, las fórmulas y el código, y terminar mostrando los resultados en un dashboard HTML con Bootstrap. Además, ese mismo panel tendrá un botón para descargar el archivo Excel.

Qué se va a aprender

Al terminar este ejercicio, el alumnado sabrá:

  • Diseñar una hoja de control financiero doméstico en Excel.
  • Pedir a ChatGPT instrucciones útiles y precisas.
  • Crear listas desplegables y validaciones de datos.
  • Usar fórmulas de resumen para ingresos, gastos y ahorro.
  • Exportar resultados a un panel visual en HTML.
  • Añadir un botón de descarga del archivo Excel desde la web.

Material necesario

  • Excel 365, Excel 2021 o una versión equivalente.
  • ChatGPT para pedir estructura, fórmulas y código.
  • Un editor de texto sencillo como Bloc de notas o Visual Studio Code.
  • Un navegador web.

Objetivo del proyecto

Crear una carpeta con estos tres archivos:

proyecto-finanzas/
├── ingresos_gastos_avanzado.xlsx
├── resumen_mensual.csv
└── dashboard.html

El archivo Excel servirá para introducir y organizar la información. El archivo CSV contendrá un resumen mensual exportado desde Excel. El archivo HTML mostrará un panel visual con Bootstrap y permitirá descargar el Excel original.

Paso 1. Pedir a ChatGPT la estructura del libro de Excel

Antes de abrir Excel, conviene pedir a ChatGPT que proponga una estructura clara. Un buen prompt sería este:

Actúa como experto en Excel y finanzas domésticas. Diseña un libro avanzado de ingresos y gastos del hogar con 4 hojas: Movimientos, Categorías, Presupuesto y Resumen. Indica qué columnas debe tener cada hoja, qué listas desplegables debo usar y qué fórmulas necesito para calcular ingresos, gastos, ahorro y desviación frente al presupuesto.

Con una petición como esta, ChatGPT puede devolver una propuesta muy útil. La estructura recomendada para este ejercicio es la siguiente.

Hoja 1: Movimientos

Aquí se introduce cada operación del hogar.

Columnas recomendadas:

  • Fecha
  • Tipo
  • Categoría
  • Subcategoría
  • Descripción
  • Importe
  • Medio de pago
  • Fijo o variable
  • Mes
  • Año
  • Observaciones

Hoja 2: Categorías

Aquí estarán las listas que alimentarán los desplegables.

Ejemplos:

  • Tipos: Ingreso, Gasto
  • Categorías: Vivienda, Alimentación, Transporte, Salud, Ocio, Suministros, Seguros, Nómina, Pensiones, Otros
  • Medios de pago: Efectivo, Tarjeta, Transferencia, Bizum, Domiciliación
  • Naturaleza: Fijo, Variable

Hoja 3: Presupuesto

Esta hoja sirve para marcar cuánto se espera gastar o ingresar por categoría.

Columnas:

  • Mes
  • Categoría
  • Presupuesto
  • Gasto real
  • Diferencia

Hoja 4: Resumen

Será la hoja de análisis.

Campos sugeridos:

  • Total ingresos
  • Total gastos
  • Ahorro neto
  • Porcentaje de ahorro
  • Gasto por categoría
  • Comparativa presupuesto vs gasto real

Paso 2. Crear el libro en Excel

Ahora toca montar el archivo manualmente.

  1. Crear un nuevo libro en Excel.
  2. Renombrar las hojas como Movimientos, Categorías, Presupuesto y Resumen.
  3. Copiar en cada hoja la estructura definida.
  4. Guardar el archivo con el nombre ingresos_gastos_avanzado.xlsx.

Paso 3. Convertir los rangos en tablas

Uno de los mejores hábitos en Excel es convertir los datos en tablas. Así las fórmulas son más limpias y las ampliaciones futuras son mucho más cómodas.

En la hoja Movimientos:

  1. Seleccionar todas las columnas con encabezados.
  2. Ir a Insertar > Tabla.
  3. Marcar la opción La tabla tiene encabezados.
  4. Asignar un nombre a la tabla, por ejemplo: tblMovimientos.

En la hoja Presupuesto:

  • Repetir el mismo proceso y nombrarla como tblPresupuesto.

Paso 4. Crear listas desplegables

Para que el alumnado no escriba categorías distintas para lo mismo, conviene usar validación de datos.

En la hoja Categorías

Crear varias listas verticales, por ejemplo:

A1: Tipo
A2: Ingreso
A3: Gasto

C1: Categoría
C2: Vivienda
C3: Alimentación
C4: Transporte
C5: Salud
C6: Ocio
C7: Suministros
C8: Seguros
C9: Nómina
C10: Pensiones
C11: Otros

E1: MedioPago
E2: Efectivo
E3: Tarjeta
E4: Transferencia
E5: Bizum
E6: Domiciliación

G1: Naturaleza
G2: Fijo
G3: Variable

En la hoja Movimientos

Aplicar validación de datos en las columnas:

  • Tipo → lista de tipos.
  • Categoría → lista de categorías.
  • Medio de pago → lista correspondiente.
  • Fijo o variable → lista correspondiente.

Un prompt útil para ChatGPT sería:

Explícame paso a paso cómo crear listas desplegables en Excel para las columnas Tipo, Categoría, Medio de pago y Fijo o variable usando una hoja auxiliar llamada Categorías.

Paso 5. Añadir columnas calculadas

Para facilitar los resúmenes, conviene que Excel calcule automáticamente el mes y el año a partir de la fecha.

Fórmula para Mes

Si la columna Fecha está en A2, una fórmula sencilla sería:

=TEXTO([@Fecha];"mmmm")

Fórmula para Año

=AÑO([@Fecha])

Con esto, cada nuevo registro tendrá ya identificado el mes y el año sin escribirlos a mano.

Paso 6. Crear los cálculos principales en la hoja Resumen

Aquí es donde el archivo pasa de ser una simple tabla a convertirse en una herramienta útil.

Total de ingresos

=SUMAR.SI.CONJUNTO(tblMovimientos[Importe];tblMovimientos[Tipo];"Ingreso")

Total de gastos

=SUMAR.SI.CONJUNTO(tblMovimientos[Importe];tblMovimientos[Tipo];"Gasto")

Ahorro neto

=B2-B3

Suponiendo que B2 contiene ingresos y B3 gastos.

Porcentaje de ahorro

=SI.ERROR(B4/B2;0)

Gasto por categoría

Si en la celda A10 está escrita una categoría, por ejemplo Vivienda:

=SUMAR.SI.CONJUNTO(tblMovimientos[Importe];tblMovimientos[Tipo];"Gasto";tblMovimientos[Categoría];A10)

Gasto de un mes concreto

Si en F1 está el mes a analizar:

=SUMAR.SI.CONJUNTO(tblMovimientos[Importe];tblMovimientos[Tipo];"Gasto";tblMovimientos[Mes];F1)

Un prompt muy práctico sería este:

Genera las fórmulas de Excel en español para calcular total de ingresos, total de gastos, ahorro neto, porcentaje de ahorro y gasto por categoría usando una tabla llamada tblMovimientos.

Paso 7. Comparar presupuesto contra gasto real

En la hoja Presupuesto, añadir estas fórmulas.

Gasto real

=SUMAR.SI.CONJUNTO(tblMovimientos[Importe];tblMovimientos[Tipo];"Gasto";tblMovimientos[Categoría];[@Categoría];tblMovimientos[Mes];[@Mes])

Diferencia

=[@Presupuesto]-[@[Gasto real]]

Interpretación:

  • Si la diferencia es positiva, se ha gastado menos de lo previsto.
  • Si la diferencia es negativa, se ha superado el presupuesto.

Aquí ya conviene aplicar formato condicional:

  • Verde para resultados positivos.
  • Rojo para negativos.

Prompt recomendado:

Explícame cómo aplicar formato condicional en Excel para que la columna Diferencia se vea en verde si el resultado es mayor o igual que cero y en rojo si es negativo.

Paso 8. Preparar una tabla de resumen mensual para el dashboard

El panel HTML necesita una tabla simple y limpia. Lo más cómodo es crear una pequeña tabla auxiliar en la hoja Resumen con este formato:

La fórmula de ahorro será simplemente:

=[@Ingresos]-[@Gastos]

Una vez completada esta tabla:

  1. Seleccionarla.
  2. Copiarla.
  3. Pegarla en una hoja nueva o guardarla como CSV.
  4. Guardar el archivo con el nombre resumen_mensual.csv.

Este CSV será el puente entre Excel y el dashboard web.

Paso 9. Pedir a ChatGPT el código del dashboard

Aquí entra la parte más atractiva para el alumnado: convertir números en una visualización moderna.

Prompt sugerido:

Genera un archivo dashboard.html con Bootstrap 5 que permita cargar un archivo CSV llamado resumen_mensual.csv desde el ordenador del usuario, muestre tarjetas con total ingresos, total gastos, ahorro neto y porcentaje de ahorro, dibuje un gráfico con Chart.js y añada un botón para descargar un archivo Excel llamado ingresos_gastos_avanzado.xlsx.

Paso 10. Crear el archivo dashboard.html

Copiar este código en un archivo llamado dashboard.html.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Dashboard financiero del hogar</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  <style>
    body {
      background: #f4f7fb;
    }
    .card-kpi {
      border: none;
      border-radius: 18px;
      box-shadow: 0 8px 24px rgba(0,0,0,0.08);
    }
    .hero {
      border-radius: 24px;
      background: linear-gradient(135deg, #0d6efd, #6610f2);
      color: white;
      padding: 2rem;
      margin-bottom: 2rem;
    }
    .table-wrap {
      background: white;
      border-radius: 18px;
      box-shadow: 0 8px 24px rgba(0,0,0,0.08);
      padding: 1.25rem;
    }
    .chart-wrap {
      background: white;
      border-radius: 18px;
      box-shadow: 0 8px 24px rgba(0,0,0,0.08);
      padding: 1.25rem;
    }
  </style>
</head>
<body>
  <div class="container py-4">
    <div class="hero">
      <div class="row align-items-center g-3">
        <div class="col-lg-8">
          <h1 class="display-6 fw-bold">Dashboard financiero del hogar</h1>
          <p class="mb-0">Carga tu resumen mensual exportado desde Excel, analiza tus resultados y descarga el archivo original.</p>
        </div>
        <div class="col-lg-4 text-lg-end">
          <a href="ingresos_gastos_avanzado.xlsx" download class="btn btn-light btn-lg">Descargar Excel</a>
        </div>
      </div>
    </div>

    <div class="row g-3 mb-4">
      <div class="col-md-6 col-lg-3">
        <div class="card card-kpi p-3">
          <small class="text-muted">Total ingresos</small>
          <h3 id="kpiIngresos" class="mt-2">0 €</h3>
        </div>
      </div>
      <div class="col-md-6 col-lg-3">
        <div class="card card-kpi p-3">
          <small class="text-muted">Total gastos</small>
          <h3 id="kpiGastos" class="mt-2">0 €</h3>
        </div>
      </div>
      <div class="col-md-6 col-lg-3">
        <div class="card card-kpi p-3">
          <small class="text-muted">Ahorro neto</small>
          <h3 id="kpiAhorro" class="mt-2">0 €</h3>
        </div>
      </div>
      <div class="col-md-6 col-lg-3">
        <div class="card card-kpi p-3">
          <small class="text-muted">% de ahorro</small>
          <h3 id="kpiPorcentaje" class="mt-2">0 %</h3>
        </div>
      </div>
    </div>

    <div class="row g-4 mb-4">
      <div class="col-lg-6">
        <div class="chart-wrap h-100">
          <div class="d-flex justify-content-between align-items-center mb-3">
            <h4 class="mb-0">Cargar resumen mensual</h4>
          </div>
          <input type="file" id="csvFile" class="form-control" accept=".csv">
          <p class="text-muted mt-3 mb-0">Selecciona el archivo <strong>resumen_mensual.csv</strong> exportado desde Excel.</p>
        </div>
      </div>
      <div class="col-lg-6">
        <div class="chart-wrap h-100">
          <h4 class="mb-3">Evolución mensual</h4>
          <canvas id="graficoFinanzas"></canvas>
        </div>
      </div>
    </div>

    <div class="table-wrap">
      <div class="d-flex justify-content-between align-items-center mb-3">
        <h4 class="mb-0">Detalle mensual</h4>
      </div>
      <div class="table-responsive">
        <table class="table table-striped align-middle mb-0">
          <thead>
            <tr>
              <th>Mes</th>
              <th>Ingresos</th>
              <th>Gastos</th>
              <th>Ahorro</th>
            </tr>
          </thead>
          <tbody id="tablaResumen"></tbody>
        </table>
      </div>
    </div>
  </div>

  <script>
    const formatoMoneda = (valor) => {
      return new Intl.NumberFormat('es-ES', {
        style: 'currency',
        currency: 'EUR'
      }).format(valor);
    };

    let grafico;

    document.getElementById('csvFile').addEventListener('change', function(event) {
      const archivo = event.target.files[0];
      if (!archivo) return;

      Papa.parse(archivo, {
        header: true,
        skipEmptyLines: true,
        complete: function(resultado) {
          const datos = resultado.data.map(fila => ({
            mes: fila.Mes,
            ingresos: Number(String(fila.Ingresos).replace(',', '.')) || 0,
            gastos: Number(String(fila.Gastos).replace(',', '.')) || 0,
            ahorro: Number(String(fila.Ahorro).replace(',', '.')) || 0
          }));

          actualizarDashboard(datos);
        }
      });
    });

    function actualizarDashboard(datos) {
      const totalIngresos = datos.reduce((acc, item) => acc + item.ingresos, 0);
      const totalGastos = datos.reduce((acc, item) => acc + item.gastos, 0);
      const totalAhorro = datos.reduce((acc, item) => acc + item.ahorro, 0);
      const porcentaje = totalIngresos > 0 ? (totalAhorro / totalIngresos) * 100 : 0;

      document.getElementById('kpiIngresos').textContent = formatoMoneda(totalIngresos);
      document.getElementById('kpiGastos').textContent = formatoMoneda(totalGastos);
      document.getElementById('kpiAhorro').textContent = formatoMoneda(totalAhorro);
      document.getElementById('kpiPorcentaje').textContent = porcentaje.toFixed(2) + ' %';

      const cuerpoTabla = document.getElementById('tablaResumen');
      cuerpoTabla.innerHTML = '';

      datos.forEach(item => {
        const fila = `
          <tr>
            <td>${item.mes}</td>
            <td>${formatoMoneda(item.ingresos)}</td>
            <td>${formatoMoneda(item.gastos)}</td>
            <td>${formatoMoneda(item.ahorro)}</td>
          </tr>
        `;
        cuerpoTabla.innerHTML += fila;
      });

      const meses = datos.map(item => item.mes);
      const ingresos = datos.map(item => item.ingresos);
      const gastos = datos.map(item => item.gastos);
      const ahorro = datos.map(item => item.ahorro);

      const ctx = document.getElementById('graficoFinanzas').getContext('2d');

      if (grafico) {
        grafico.destroy();
      }

      grafico = new Chart(ctx, {
        type: 'bar',
        data: {
          labels: meses,
          datasets: [
            {
              label: 'Ingresos',
              data: ingresos
            },
            {
              label: 'Gastos',
              data: gastos
            },
            {
              label: 'Ahorro',
              data: ahorro,
              type: 'line'
            }
          ]
        },
        options: {
          responsive: true,
          maintainAspectRatio: true
        }
      });
    }
  </script>
</body>
</html>

Paso 11. Preparar la carpeta del proyecto

Guardar juntos estos archivos:

  • ingresos_gastos_avanzado.xlsx
  • resumen_mensual.csv
  • dashboard.html

Cuando se abra el archivo HTML en el navegador:

  1. Se pulsa en Seleccionar archivo.
  2. Se carga resumen_mensual.csv.
  3. Aparecen los indicadores y el gráfico.
  4. El botón Descargar Excel permite acceder al libro original.

Paso 12. Mejoras que se pueden pedir a ChatGPT

Una vez terminado el ejercicio base, el alumnado puede seguir creciendo con nuevas peticiones. Por ejemplo:

Añade al dashboard un filtro por mes.
Genera una segunda gráfica para comparar presupuesto y gasto real.
Convierte el diseño del dashboard en un estilo más moderno con Bootstrap.
Haz que el archivo muestre en rojo los meses con ahorro negativo.
Propón una macro o una automatización para exportar la tabla Resumen a CSV más rápidamente.

Consejos didácticos para alumnos de más de 45 años

  • Empezar por una versión sencilla antes de complicar el modelo.
  • Guardar siempre una copia del archivo antes de aplicar cambios.
  • Probar una sola mejora cada vez.
  • Pedir a ChatGPT instrucciones concretas, no preguntas demasiado amplias.
  • Revisar las fórmulas generadas por la IA antes de darlas por definitivas.

Errores comunes

1. Las fórmulas no funcionan

Suele ocurrir porque el separador de argumentos cambia según la configuración regional. En muchas versiones en español se usa punto y coma ;.

2. El desplegable no aparece

Normalmente se debe a que la validación de datos apunta a un rango incorrecto.

3. El dashboard no muestra datos

Casi siempre ocurre porque el CSV no tiene exactamente estos encabezados:

  • Mes
  • Ingresos
  • Gastos
  • Ahorro

4. El botón de descarga no encuentra el Excel

Eso significa que el archivo ingresos_gastos_avanzado.xlsx no está en la misma carpeta que dashboard.html.

Conclusión

Este ejercicio permite enseñar algo mucho más valioso que una simple tabla de gastos. Enseña a pensar un flujo completo de automatización: diseñar datos, estructurarlos bien, analizarlos con fórmulas y convertirlos en una presentación visual clara. Y, además, muestra al alumnado que la inteligencia artificial puede ser una gran aliada cuando se usa con criterio.

Excel aporta el orden, ChatGPT acelera el trabajo y Bootstrap da una capa visual moderna y fácil de compartir. Esa combinación es ideal para aprender a automatizar tareas reales con herramientas que ya forman parte del entorno profesional y educativo actual.

Toni Domenech


¿Quieres que esto funcione en tu empresa?

Adaptamos estas ideas a tu contexto concreto con un diagnóstico rápido de 15 minutos.

Pide un diagnóstico

Diagnóstico AI-First en 15 minutos