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