71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from openpyxl import load_workbook
|
|
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
|
|
|
|
|
|
INPUT_PATH = Path("/home/fred/Downloads/Definição Ranking_ATUACAPES - Aba1 a Aba4(7).xlsx")
|
|
OUTPUT_PATH = Path("/home/fred/projetos/ranking/docs/Definicao_Ranking_ATUACAPES_estilizada.xlsx")
|
|
|
|
|
|
def apply_styles() -> None:
|
|
wb = load_workbook(INPUT_PATH)
|
|
|
|
header_fill = PatternFill("solid", fgColor="E6F0FF")
|
|
header_font = Font(bold=True, color="102A43")
|
|
alt_fill = PatternFill("solid", fgColor="F7FAFC")
|
|
thin = Side(style="thin", color="CBD5E0")
|
|
border = Border(left=thin, right=thin, top=thin, bottom=thin)
|
|
|
|
for ws in wb.worksheets:
|
|
max_col = ws.max_column
|
|
max_row = ws.max_row
|
|
|
|
# Header styling
|
|
for col in range(1, max_col + 1):
|
|
cell = ws.cell(row=1, column=col)
|
|
cell.fill = header_fill
|
|
cell.font = header_font
|
|
cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
|
|
cell.border = border
|
|
|
|
# Data rows styling
|
|
for row in range(2, max_row + 1):
|
|
row_fill = alt_fill if row % 2 == 0 else None
|
|
for col in range(1, max_col + 1):
|
|
cell = ws.cell(row=row, column=col)
|
|
cell.border = border
|
|
cell.alignment = Alignment(vertical="top", wrap_text=True)
|
|
if row_fill:
|
|
cell.fill = row_fill
|
|
|
|
# Freeze header row
|
|
ws.freeze_panes = "A2"
|
|
|
|
# Auto-filter across the used range
|
|
ws.auto_filter.ref = ws.dimensions
|
|
|
|
# Adjust column widths with caps
|
|
for col in ws.columns:
|
|
col_letter = col[0].column_letter
|
|
max_len = 0
|
|
for cell in col[: min(max_row, 200)]:
|
|
if cell.value is None:
|
|
continue
|
|
text = str(cell.value)
|
|
if len(text) > max_len:
|
|
max_len = len(text)
|
|
width = max(12, min(45, int(max_len * 0.9)))
|
|
ws.column_dimensions[col_letter].width = width
|
|
|
|
# Slightly taller header
|
|
ws.row_dimensions[1].height = 28
|
|
|
|
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
wb.save(OUTPUT_PATH)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
apply_styles()
|