66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
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
|