import { Component } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { TableModule ,Table} from 'primeng/table'; import { InputTextModule } from 'primeng/inputtext'; import { SelectModule } from 'primeng/select'; import { TooltipModule } from 'primeng/tooltip'; import { ButtonModule } from 'primeng/button'; import * as FileSaver from 'file-saver'; import * as XLSX from 'xlsx'; @Component({ selector: 'app-ajuste-pd', imports: [ FormsModule, TableModule, InputTextModule, SelectModule, TooltipModule, ButtonModule ], templateUrl: './ajuste-pd.component.html', styleUrl: './ajuste-pd.component.scss' }) export class AjustePdComponent { selectedCity: any = ''; empresas: any[] = [{name: 'Empresa A'}, {name: 'Empresa B'}, {name: 'Empresa C'}]; select1: any = ''; estadoAprobacion: any[] = [{name:'Rechazado'}, {name:'Aprobado'}]; products: any[] = [ { empresa: 'Empresa A', codigoCronograma: '123', codigoCronogramaAjuste: '456', tipoCarga: 'Inicial', estadoRevision: 'Ingresado', analista: 'No asignado', fechaIngreso: '2025-04-29', semaforo: 'green', dato9: 'Ingresado', dato10: 'No asignado', dato15: 'green', dato16: 'green', dato17: 'green', dato18: 'green', dato13: 'Rechazado', dato14: 'green', }, { empresa: 'Empresa A', codigoCronograma: '123', codigoCronogramaAjuste: '456', tipoCarga: 'Inicial', estadoRevision: 'En revisión', analista: 'Gabriel Torres', fechaIngreso: '2025-04-29', semaforo: 'yellow', dato9: 'Ingresado', dato10: 'No asignado', dato15: 'green', dato16: 'green', dato17: 'green', dato18: 'green', dato13: 'Rechazado', dato14: 'green', }, { empresa: 'Empresa A', codigoCronograma: '123', codigoCronogramaAjuste: '456', tipoCarga: 'Inicial', estadoRevision: 'Rechazado', analista: 'Jorge Muñoz', fechaIngreso: '2025-04-29', semaforo: 'red', dato9: 'Ingresado', dato10: 'No asignado', dato15: 'green', dato16: 'green', dato17: 'green', dato18: 'green', dato13: 'Rechazado', dato14: 'green', }, { empresa: 'Empresa A', codigoCronograma: '123', codigoCronogramaAjuste: '456', tipoCarga: 'Inicial', estadoRevision: 'Aprobado', analista: 'Jarolt Matamoros', fechaIngreso: '2025-04-29', semaforo: 'green', dato9: 'Ingresado', dato10: 'No asignado', dato15: 'green', dato16: 'green', dato17: 'green', dato18: 'green', dato13: 'Rechazado', dato14: 'green', }, ]; /** * Exporta los datos de la tabla a un archivo Excel * @param table Referencia a la tabla PrimeNG */ exportExcel(table: Table) { try { // Obtenemos los datos a exportar (usamos los datos filtrados si existen) const dataToExport = this.prepareDataForExport(table); // Creamos el libro de Excel const worksheet = XLSX.utils.json_to_sheet(dataToExport); const workbook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] }; // Aplicamos estilos a las celdas this.applyExcelStyles(worksheet); // Opciones de exportación const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); // Guardamos el archivo this.saveAsExcelFile(excelBuffer, 'ajuste_pd'); console.log('Exportación a Excel completada con éxito'); } catch (error) { console.error('Error al exportar a Excel:', error); } } /** * Prepara los datos para la exportación, traduciendo los nombres de columnas * @param table Referencia a la tabla PrimeNG * @returns Array de objetos con los datos formateados para exportar */ private prepareDataForExport(table: Table): any[] { // Si hay filtros aplicados, usamos los datos filtrados, de lo contrario todos los datos const data = table.filteredValue || table.value; // Mapeamos los datos para tener nombres de columnas en español y legibles return data.map(item => { return { 'Empresa': item.empresa, 'Código de cronograma': item.codigoCronograma, 'Etapa del Servicio': item.codigoCronogramaAjuste, 'Nombre sistema': item.tipoCarga, 'Tipo de inversión': item.estadoRevision, 'Código de glosa PD': item.analista, 'Descripción glosa': item.fechaIngreso, 'Año de Inicio': item.dato9, 'Año de Término': item.dato10, 'Estado aprobación': item.dato13 }; }); } /** * Aplica estilos al worksheet de Excel para mejorar la presentación * @param worksheet Hoja de Excel a la que aplicar estilos */ private applyExcelStyles(worksheet: XLSX.WorkSheet) { // Definimos estilos para los encabezados const headerStyle = { font: { bold: true, color: { rgb: 'FFFFFF' } }, fill: { fgColor: { rgb: '007ACC' } }, // Color azul para los encabezados alignment: { horizontal: 'center', vertical: 'center' } }; // Aplicamos estilos a los encabezados (primera fila) const range = XLSX.utils.decode_range(worksheet['!ref'] || 'A1'); for (let col = range.s.c; col <= range.e.c; col++) { const cellRef = XLSX.utils.encode_cell({ r: 0, c: col }); if (!worksheet[cellRef]) worksheet[cellRef] = { t: 's', v: '' }; // Asignamos el estilo al encabezado worksheet[cellRef].s = headerStyle; } // Ajustamos el ancho de las columnas automáticamente const colWidths = []; for (let col = range.s.c; col <= range.e.c; col++) { colWidths.push({ wch: 15 }); // Ancho predeterminado } worksheet['!cols'] = colWidths; } /** * Guarda el buffer como un archivo Excel * @param buffer Datos del archivo Excel * @param fileName Nombre base del archivo */ private saveAsExcelFile(buffer: any, fileName: string): void { // Definimos el tipo MIME para archivos Excel const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'; const EXCEL_EXTENSION = '.xlsx'; // Creamos un Blob con los datos const data: Blob = new Blob([buffer], { type: EXCEL_TYPE }); // Generamos un nombre de archivo con timestamp para evitar duplicados const today = new Date(); const formattedDate = today.getFullYear().toString() + (today.getMonth() + 1).toString().padStart(2, '0') + today.getDate().toString().padStart(2, '0') + '_' + today.getHours().toString().padStart(2, '0') + today.getMinutes().toString().padStart(2, '0'); // Guardamos el archivo FileSaver.saveAs(data, `${fileName}_${formattedDate}${EXCEL_EXTENSION}`); } }