from openpyxl.styles import Alignment, PatternFill, Font, Border, Side from openpyxl.utils import get_column_letter center = Alignment(horizontal="center", vertical="center") left = Alignment(horizontal="left", vertical="center") wrap_left = Alignment(horizontal="left", vertical="center", wrap_text=True) header_fill = PatternFill(start_color="B4C6E7", fill_type="solid") section_fill = PatternFill(start_color="D9E1F2", fill_type="solid") thin_border = Border(*(Side(style="thin"),)*4) def format_cell_multiline(value): """Convert comma-separated or list-style text into multiline text""" if value is None: return "" val = str(value).strip() if val.startswith("[") and val.endswith("]"): val = val[1:-1] val = val.replace("'", "").replace('"', "") return val.replace(", ", "\n").replace(";", "\n").replace(",", "\n").replace(";", "\n") def style_matrice_flux(ws): headers = [ ("Description",2),("Source",4),("Destination",4), ("Application",1),("Port",1),("Miscellaneous",1),("Action",1),("Tier",1),("Active",1) ] col = 1 for label, span in headers: ws.merge_cells(start_row=1, start_column=col, end_row=1, end_column=col + span - 1) c = ws.cell(row=1, column=col, value=label) c.alignment = center c.fill = section_fill c.font = Font(bold=True) col += span wrap_cols = ["Description", "Src Equipement", "Dst Equipement", "Application", "Port", "Src CIDR", "Dst CIDR", "Src Site", "Dst Site", "Miscellaneous", "Action", "Tier", "Active"] wrap_indexes = [] for col_idx, cell in enumerate(ws[2], start=1): if cell.value in wrap_cols: wrap_indexes.append(col_idx) for row in ws.iter_rows(min_row=2, max_row=ws.max_row): for cell in row: if cell.row > 2: if cell.col_idx in wrap_indexes: cell.value = format_cell_multiline(cell.value) cell.alignment = wrap_left else: cell.alignment = left else: cell.font = Font(bold=True) cell.alignment = center cell.fill = header_fill cell.border = thin_border col_widths = { "A": 50, "B": 35, "C": 35, "D": 18, "E": 15, "F": 15, "G": 35, "H": 18, "I": 15, "J": 15, "K": 12, "L": 20, "M": 25, "N": 9, "O": 7, "P": 7 } for col_letter, width in col_widths.items(): ws.column_dimensions[col_letter].width = width