Nero
Ferramenta desktop (PyQt5) para consolidação de dados e geração de relatórios Excel formatados (Consolidado e Individual).
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.
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.
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)