Lesson 33 of 34

OpenPyXL: Automate Excel

OpenPyXL reads and writes modern Excel workbooks. Use it for reports that people need to open, filter, print and share.

Bash
python -m pip install openpyxl
Python
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
from openpyxl.utils import get_column_letter

rows = [
    ("Product", "Units", "Unit Price"),
    ("Keyboard", 12, 79.99),
    ("Mouse", 25, 29.50),
    ("Monitor", 7, 249.00),
]

workbook = Workbook()
sheet = workbook.active
sheet.title = "Sales"

for row in rows:
    sheet.append(row)

sheet["D1"] = "Revenue"
for row_number in range(2, sheet.max_row + 1):
    sheet.cell(row=row_number, column=4, value=f"=B{row_number}*C{row_number}")
    sheet.cell(row=row_number, column=3).number_format = '$#,##0.00'
    sheet.cell(row=row_number, column=4).number_format = '$#,##0.00'

for cell in sheet[1]:
    cell.font = Font(bold=True, color="FFFFFF")
    cell.fill = PatternFill("solid", fgColor="2563EB")

sheet.freeze_panes = "A2"
sheet.auto_filter.ref = sheet.dimensions
for column, width in enumerate((22, 12, 14, 14), start=1):
    sheet.column_dimensions[get_column_letter(column)].width = width

workbook.save("sales-report.xlsx")
Python
from openpyxl import load_workbook

# data_only=True reads cached formula results, not formula text.
workbook = load_workbook("sales-report.xlsx", data_only=False)
sheet = workbook["Sales"]

for product, units, price, formula in sheet.iter_rows(min_row=2, values_only=True):
    print(product, units, price, formula)

# For very large workbooks:
# load_workbook("huge.xlsx", read_only=True)
# Workbook(write_only=True)
Finished reading?Mark it done to track your progress.

Tip: use the ← and → keys to move between lessons.