Projetos /

Nero

Ferramenta desktop (PyQt5) para consolidação de dados e geração de relatórios Excel formatados (Consolidado e Individual).

Interface da Aplicação Nero - Aba Relatório Consolidado

O Desafio

Após a validação dos dados financeiros pelo Módulo Validador, era necessário consolidar as informações de múltiplas planilhas (uma por convênio ou consignatária) em relatórios finais padronizados e bem formatados para análise gerencial. A criação manual desses relatórios era demorada e sujeita a inconsistências.

O objetivo era desenvolver uma ferramenta que automatizasse a geração de dois tipos principais de relatórios em Excel: um Consolidado, agrupando dados de vários ficheiros, e um Individual, sumarizando informações por consignatária.

A Solução: Nero

Desenvolvi o "Nero", uma aplicação desktop com interface gráfica (PyQt5) focada na geração de relatórios Excel. Ele complementa o fluxo de trabalho iniciado pelo Módulo Validador:

  • Interface com Abas (PyQt5): Organiza as funcionalidades em duas abas claras: "Relatório Consolidado" e "Relatório Individual".
  • Processamento Consolidado (Pandas/QThread): A aba "Consolidado" permite carregar múltiplas planilhas de resultados (geradas pelo Validador). Um worker em background (QThread) processa cada ficheiro, extraindo KPIs (Valor Lançado, Contratos Lançados/Não Lançados, Saldos) com base em análises de colunas flexíveis (`config.py`).
  • Geração de Relatório Individual (Pandas/QThread): A aba "Individual" permite configurar um relatório sumarizado por consignatária, lendo dados de planilhas separadas e calculando totais.
  • Exportação Profissional para Excel (Openpyxl): Gera ficheiros `.xlsx` com formatação detalhada: Cabeçalhos coloridos, fontes, alinhamentos, bordas, formatação numérica (R$), fórmulas `=SUM()` e ajuste automático de colunas.
  • Configuração Flexível (config.py): Permite definir análises para nomes de colunas, tornando o sistema robusto a variações nos ficheiros de entrada.
  • Feedback de Processamento: Uma área de "Log de Execução" em cada aba informa o usuário sobre o progresso e o resultado da geração.

Interface das Abas de Relatório

Visualização das duas principais funcionalidades da aplicação Nero.

Aba Relatório Consolidado
Aba "Relatório Consolidado": Carregamento e processamento de múltiplas planilhas.
Aba Relatório Individual
Aba "Relatório Individual": Configuração e geração de sumário por consignatária.

Código em Destaque

Trecho do `processing.py` (dentro da classe `MiniReportWorker`) que demonstra a utilização da biblioteca Openpyxl para aplicar estilos e formatação avançada às células do relatório Excel gerado, incluindo cores, fontes, bordas e formatos numéricos.

processing.py (Formatação Excel)

import openpyxl
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from openpyxl.utils import get_column_letter
from openpyxl.utils.dataframe import dataframe_to_rows

            workbook = openpyxl.Workbook()
            sheet = workbook.active
            
            header_fill = PatternFill(fill_type="solid", fgColor=self.header_color_code)
            white_fill = PatternFill(fill_type="solid", fgColor="FFFFFF")
            
            header_font = Font(bold=True, color="FFFFFF", size=11)
            title_font = Font(bold=True, size=18, color="2c3e50")
            subtitle_font = Font(bold=True, size=14, color="2c3e50")
            total_font = Font(bold=True, color="2c3e50", size=11)
            data_font = Font(color="2c3e50")
            
            center_align = Alignment(horizontal="center", vertical="center", wrap_text=True)
            left_align = Alignment(horizontal="left", vertical="center")
            right_align = Alignment(horizontal="right", vertical="center")
            
            thin_border = Border(
                left=Side(style="thin"), right=Side(style="thin"), 
                top=Side(style="thin"), bottom=Side(style="thin")
            )
            
            accounting_format = 'R$ #,##0.00' 
            integer_format = '#,##0'
            
            current_row = 4
            
            headers = list(resumo_df.columns)
            for col_idx, header_text in enumerate(headers, 1):
                cell = sheet.cell(row=current_row, column=col_idx, value=header_text)
                cell.font = header_font
                cell.fill = header_fill
                cell.alignment = center_align
                cell.border = thin_border
            
            start_data_row = current_row + 1
            for r_idx, row_data in enumerate(dataframe_to_rows(resumo_df, index=False, header=False)):
                for c_idx, value in enumerate(row_data, 1):
                    row = start_data_row + r_idx
                    cell = sheet.cell(row=row, column=c_idx, value=value)
                    cell.font = data_font
                    cell.fill = white_fill
                    cell.alignment = left_align if c_idx == 1 else center_align
                    cell.border = thin_border
                    
                    if headers[c_idx-1] in ["VALIDAÇÃO", "LANÇAMENTO"]:
                        cell.number_format = accounting_format
                    elif headers[c_idx-1] == "QTD CONTRATOS LANÇADOS":
                        cell.number_format = integer_format

            total_row_idx = sheet.max_row + 1
            total_label_cell = sheet.cell(row=total_row_idx, column=1, value="TOTAL")

            for col_idx in range(2, 5):
                col_letter = get_column_letter(col_idx)
                formula = f"=SUM({col_letter}{start_data_row}:{col_letter}{total_row_idx - 1})"
                total_cell = sheet.cell(row=total_row_idx, column=col_idx, value=formula)