Skip to content

Exportación Excel en Informes - Guía de Implementación

Módulo: Multi-módulo Tipo: Process / Guide Estado: En desarrollo Fecha: 2025-12-15


Descripción

Esta guía describe el proceso estándar para agregar exportación Excel a cualquier informe del sistema. Cada informe específico tiene su propia documentación de requerimientos en su módulo correspondiente.


Informes con exportación Excel

Implementados

Ninguno aún

Planificados

InformeMóduloDocumento
Balance de Sumas y SaldosContabilidadVer requerimientos
Subdiario de VentasVentasVer requerimientos
Subdiario de ComprasComprasVer requerimientos
Listado de SaldosCta. Cte.Ver requerimientos
Libro DiarioContabilidadVer requerimientos
Mayor AnalíticoContabilidadVer requerimientos

Requerimientos generales

RN-001: Selección de formato

El usuario debe poder elegir entre PDF o Excel mediante el parámetro formato.

json
{
  "codReporte": "codigo-informe",
  "formato": "excel",
  "filtros": { ... }
}

RN-002: Paridad de datos

El Excel debe contener los mismos datos que el PDF con los mismos filtros aplicados.

RN-003: Estructura filtrable

El Excel debe generarse con autofiltros habilitados y estructura que permita análisis.


Arquitectura requerida

Patrón datos/render

Todo informe con soporte Excel debe separar la obtención de datos del renderizado:

reports/{modulo}/
├── {informe}-datos.php    # Obtención de datos (PDF + Excel)
└── {informe}-render.php   # Renderizado HTML (solo PDF)

Ver: Arquitectura de Informes

Funciones helper

Ver: Exportación a Excel

  • debeGenerarExcel($array) - Detecta formato solicitado
  • crearExcel($encabezado, $cuerpo) - Genera Excel
  • enviarExcel($content, $fileName) - Envía respuesta

Estrategias de mapeo para informes agrupados

Cuando un informe agrupa datos por páginas en PDF, usar una de estas estrategias:

EstrategiaDescripciónEjemplo de uso
Columna de grupoAgregar columna con identificadorMayor Analítico (columna Cuenta)
Fila separadoraInsertar fila con texto entre gruposLibro Diario (entre asientos)
Fila de subtotalAgregar totales por grupoBalance (totales por rubro)

Ejemplo: Mayor Analítico

PDF (páginas separadas por cuenta):

[Página 1: Cuenta 1.1.01]
| Fecha | Detalle | Debe | Haber |

Excel (columna de grupo + subtotales):

| Cuenta | Fecha | Detalle | Debe | Haber |
| 1.1.01 | ...   | ...     | ...  | ...   |
| === SUBTOTAL 1.1.01 ===  | XXX  | XXX   |
| 1.1.02 | ...   | ...     | ...  | ...   |

Patrón de código en index.php

php
case 'mi-informe':
    try {
        $database = new Database($db, $schema);
        $conn = $database->getConnection();

        // 1. Obtención de datos (siempre)
        include 'reports/mi-modulo/mi-informe-datos.php';

        if (debeGenerarExcel($array)) {
            // 2a. Ruta Excel
            $encabezado = [
                ['nombre' => 'Columna', 'tipo_filtro' => 'fecha'|null],
                // ...
            ];

            $cuerpo = mapearDatosParaExcel($datos);

            $content = crearExcel($encabezado, $cuerpo);
            enviarExcel($content, 'nombre-informe');
        } else {
            // 2b. Ruta PDF
            ob_start();
            include 'reports/mi-modulo/mi-informe-render.php';
            $html = ob_get_clean();
            $html = formatearPagina($html, TipoPagina::A4);

            $pdfGenerator = new PdfGeneratorService();
            $result = $pdfGenerator->generatePdf($html);

            header('Content-Type: application/pdf');
            header(formatNameFile('nombre-informe'));
            echo $result;
        }
    } catch (Exception $e) {
        ExceptionHandler::handle($e);
    }
    break;

Frontend

Ver: Botón Exportar Excel

Cada vista con exportación Excel debe tener un botón "Exportar Excel" junto al de PDF.


Cómo agregar un nuevo informe

  1. Crear documento de requerimientos en docs/features/{modulo}/{informe}-excel.md
  2. Separar archivo de datos si no existe: {informe}-datos.php
  3. Implementar lógica en index.php según el patrón
  4. Agregar botón en frontend
  5. Actualizar tabla de informes en este documento
  6. Marcar como implementado cuando esté listo

Historial de cambios

FechaVersiónAutorDescripción
2025-12-151.0SistemaCreación de guía genérica