Automating Excel Reporting and Data Validation in Python with openpyxl: Styles, Formulas, and Formatting

While pandas is unmatched for tabular data analysis, its standard .to_excel() export generates plain, unstyled spreadsheets that look unpolished in executive briefings. The openpyxl library empowers Python developers to construct pixel-perfect, professionally formatted Microsoft Excel (.xlsx) workbooks equipped with corporate color palettes, calculated formulas, auto-fitted columns, and interactive data validation dropdowns.

Production Example: Automated Executive Sales Report

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

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Executive Summary"
ws.views.sheetView[0].showGridLines = True

# Colors
HEADER_FILL = PatternFill(start_color="1F497D", end_color="1F497D", fill_type="solid")
HEADER_FONT = Font(name="Segoe UI", size=11, bold=True, color="FFFFFF")
DATA_FONT = Font(name="Segoe UI", size=10)

headers = ["Region", "Product Category", "Units Sold", "Unit Price ($)", "Total Revenue ($)"]
ws.append(headers)

for col_num, _ in enumerate(headers, 1):
    cell = ws.cell(row=1, column=col_num)
    cell.fill = HEADER_FILL
    cell.font = HEADER_FONT
    cell.alignment = Alignment(horizontal="center", vertical="center")

data = [
    ["North America", "SaaS Subscriptions", 1500, 45.00],
    ["Europe", "Hardware Sensors", 820, 120.00],
    ["Asia-Pacific", "Edge Gateways", 410, 250.00]
]

for row_idx, row_data in enumerate(data, start=2):
    ws.cell(row=row_idx, column=1, value=row_data[0]).font = DATA_FONT
    ws.cell(row=row_idx, column=2, value=row_data[1]).font = DATA_FONT
    ws.cell(row=row_idx, column=3, value=row_data[2]).font = DATA_FONT
    ws.cell(row=row_idx, column=4, value=row_data[3]).font = DATA_FONT
    # Dynamic formula
    formula_cell = ws.cell(row=row_idx, column=5, value=f"=C{row_idx}*D{row_idx}")
    formula_cell.font = DATA_FONT
    formula_cell.number_format = "$#,##0.00"

# Auto-fit column widths
for col in ws.columns:
    max_len = max(len(str(cell.value or '')) for cell in col)
    col_letter = get_column_letter(col[0].column)
    ws.column_dimensions[col_letter].width = max(max_len + 4, 12)

wb.save("Executive_Report.xlsx")
print("Saved Executive_Report.xlsx")
Scroll to Top