From 8c3c93d0870ce96344d7048682a13f4095451dc1 Mon Sep 17 00:00:00 2001 From: luis cespedes Date: Thu, 8 May 2025 13:16:16 -0400 Subject: [PATCH] mejoras excel, ajustes pd --- .../pages/ajuste-pd/ajuste-pd.component.html | 2 - .../pages/ajuste-pd/ajuste-pd.component.ts | 143 +++++++++++++++--- 2 files changed, 119 insertions(+), 26 deletions(-) diff --git a/src/app/pages/ajuste-pd/ajuste-pd.component.html b/src/app/pages/ajuste-pd/ajuste-pd.component.html index 3423a11..383831f 100644 --- a/src/app/pages/ajuste-pd/ajuste-pd.component.html +++ b/src/app/pages/ajuste-pd/ajuste-pd.component.html @@ -68,7 +68,6 @@ Código de cronograma Etapa del Servicio Nombre sistema - Nombre sistema Nombre localidad Tipo de inversión Código de glosa PD @@ -93,7 +92,6 @@ {{ product.codigoCronogramaAjuste }} {{ product.tipoCarga }} {{ product.estadoRevision }} - {{ product.estadoRevision }} {{ product.fechaIngreso }} {{ product.estadoRevision }} {{ product.dato9 }} diff --git a/src/app/pages/ajuste-pd/ajuste-pd.component.ts b/src/app/pages/ajuste-pd/ajuste-pd.component.ts index 02da432..c74b226 100644 --- a/src/app/pages/ajuste-pd/ajuste-pd.component.ts +++ b/src/app/pages/ajuste-pd/ajuste-pd.component.ts @@ -103,21 +103,28 @@ export class AjustePdComponent { dato14: 'green', }, ]; + /** - * Exporta los datos de la tabla a Excel con estilos en los encabezados - * @param table Tabla PrimeNG a exportar - */ + * Exporta los datos de la tabla a Excel con estilos en los encabezados + * @param table Tabla PrimeNG a exportar + */ exportExcelWithStyles(table: Table): void { // Creamos un nuevo libro de trabajo const workbook = new Workbook(); const worksheet = workbook.addWorksheet('Datos'); - // Obtenemos los datos y los cabeceros + // Obtenemos los datos const data = table.filteredValue || table.value; + + // Añadimos la fila de encabezados agrupados + this.addGroupedHeaders(worksheet); + + // Añadimos la fila de encabezados detallados const headers = this.getHeaders(); + worksheet.addRow(headers); // Añadimos los datos a la hoja - this.populateWorksheet(worksheet, headers, data); + this.populateWorksheet(worksheet, data); // Aplicamos estilos a los encabezados this.styleHeaders(worksheet); @@ -129,6 +136,50 @@ export class AjustePdComponent { this.saveExcelFile(workbook); } + /** + * Añade la fila de encabezados agrupados + */ + private addGroupedHeaders(worksheet: any): void { + // Añadir fila de encabezados agrupados + const groupHeaderRow = worksheet.addRow([ + '', '', '', '', '', '', '', '', '', '', + 'Cronograma base vigente', '', '', + 'Cronograma base ajustado', '', '', '', + '', '' + ]); + + // Combinar celdas para los grupos de encabezados + worksheet.mergeCells(1, 11, 1, 13); // Cronograma base vigente (columnas 11-13) + worksheet.mergeCells(1, 14, 1, 17); // Cronograma base ajustado (columnas 14-17) + + // Dar formato a las celdas combinadas + groupHeaderRow.getCell(11).fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: '0066CC' } // Color azul oscuro para "Cronograma base vigente" + }; + groupHeaderRow.getCell(14).fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: '0000CC' } // Color azul más fuerte para "Cronograma base ajustado" + }; + + // Estilo de texto para encabezados agrupados + [11, 14].forEach(cellIndex => { + const cell = groupHeaderRow.getCell(cellIndex); + cell.font = { + name: 'Arial', + size: 12, + bold: true, + color: { argb: 'FFFFFF' } // Texto blanco + }; + cell.alignment = { + horizontal: 'center', + vertical: 'middle' + }; + }); + } + /** * Devuelve los cabeceros para el archivo Excel */ @@ -138,35 +189,50 @@ export class AjustePdComponent { 'Código de cronograma', 'Etapa del Servicio', 'Nombre sistema', + 'Nombre localidad', 'Tipo de inversión', 'Código de glosa PD', 'Descripción glosa', + 'Monto Inversión Total (UF)', 'Año de Inicio', 'Año de Término', - 'Estado aprobación' + 'Mes de Término', + 'Tipo de ajuste', + 'Año de Inicio', + 'Año de Término', + 'Mes de Término', + 'Nota', + 'Estado aprobación', + 'Observación' ]; } /** * Rellena la hoja con los datos de la tabla */ - private populateWorksheet(worksheet: any, headers: string[], data: any[]): void { - // Añadimos las cabeceras - worksheet.addRow(headers); - + private populateWorksheet(worksheet: any, data: any[]): void { // Añadimos los datos data.forEach(item => { worksheet.addRow([ item.empresa, item.codigoCronograma, - item.codigoCronogramaAjuste, - item.tipoCarga, - item.estadoRevision, - item.analista, - item.fechaIngreso, - item.dato9, - item.dato10, - item.dato13 + item.codigoCronogramaAjuste, // Etapa del Servicio + item.tipoCarga, // Nombre sistema + item.estadoRevision, // Nombre localidad + item.fechaIngreso, // Tipo de inversión + item.estadoRevision, // Código de glosa PD + item.dato9, // Descripción glosa + item.dato10, // Monto Inversión Total (UF) + item.dato13, // Año de Inicio (Cronograma base vigente) + item.dato14, // Año de Término (Cronograma base vigente) + item.dato15, // Mes de Término (Cronograma base vigente) + item.dato16, // Tipo de ajuste (Cronograma base ajustado) + item.dato17, // Año de Inicio (Cronograma base ajustado) + item.dato18, // Año de Término (Cronograma base ajustado) + item.dato11, // Mes de Término (Cronograma base ajustado) + item.dato12, // Nota + item.dato13, // Estado aprobación + item.analista // Observación ]); }); } @@ -175,16 +241,17 @@ export class AjustePdComponent { * Aplica estilos a los encabezados */ private styleHeaders(worksheet: any): void { - const headerRow = worksheet.getRow(1); - headerRow.height = 25; + // Estilo para la segunda fila (encabezados detallados) + const detailedHeaderRow = worksheet.getRow(2); + detailedHeaderRow.height = 25; - headerRow.eachCell(cell => { + detailedHeaderRow.eachCell(cell => { // Estilo de texto Encabezado cell.font = { name: 'Arial', size: 12, bold: true, - color: { argb: '000000' } + color: { argb: 'FFFFFF' } // Texto blanco }; // Bordes @@ -200,7 +267,35 @@ export class AjustePdComponent { horizontal: 'center', vertical: 'middle' }; + + // Color de fondo para encabezados normales + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: '0066CC' } // Color azul por defecto + }; }); + + // Aplicar colores específicos según el grupo de encabezados + // Cronograma base ajustado (columnas 14-17) + for (let i = 14; i <= 17; i++) { + const cell = detailedHeaderRow.getCell(i); + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: '0000CC' } // Azul más fuerte + }; + } + + // Estado aprobación y Observación (columnas 18-19) + for (let i = 18; i <= 19; i++) { + const cell = detailedHeaderRow.getCell(i); + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: '28a745' } // Color verde + }; + } } /** @@ -214,7 +309,7 @@ export class AjustePdComponent { this.adjustColumnWidths(worksheet); // Congelamos la primera fila - worksheet.views = [{ state: 'frozen', xSplit: 0, ySplit: 1 }]; + worksheet.views = [{ state: 'frozen', xSplit: 0, ySplit: 2 }]; // Congelamos 2 filas } /** @@ -251,4 +346,4 @@ export class AjustePdComponent { }) .catch(error => console.error('Error al exportar a Excel:', error)); } -} +} \ No newline at end of file