Excel-Daten mit Pythons openpyxl-Modul lesen

In einem älteren Artikel hatte ich bereits beschrieben, wie man Excel-Dateien mit Python lesen kann. In jenem Beispiel wurden dafür xlrd und pandas genutzt. Mit diesem Artikel möchte ich ein weiteres Modul für die Verwendung von Excel-Dateien vorstellen: openpyxl.

Zunächst muss dieses Modul installiert werden:

pip install openpyxl  # Windows
pip3 install openpyxl  # Linux und macOS

Für dieses Tutorial nutze ich die Statistik zur “Entwicklung von Umsatz und Beschäftigung im Gastgewerbe in Schleswig-Holstein”, herausgegeben vom Statistisches Amt für Hamburg und Schleswig-Holstein, und bereitgestellt über das Open-Data-Portal des Landes Schleswig-Holstein. Die Excel-Datei kann hier heruntergeladen werden.

Es soll die Gesamtbeschäftigtenzahl für alle Monate des Jahres 2018 ausgelesen werden. Diese Daten finden sich im Arbeitsblatt “Tab. 1” in der Spalte “F” (ab F15).

Excel-Beispiel

Den Anfang macht die Import-Anweisung:

import openpyxl

Dann werden die Excel-Datei (workbook) und das Arbeitsblatt (sheet) geladen bzw. entsprechenden Variablen zugewiesen:

excel_file = openpyxl.load_workbook('G_IV_3_m1908_SH.xlsx')
excel_sheet = excel_file['Tab. 1']

Ein einzelner Wert — hier von Zelle F15 (= 101,7) — kann jetzt folgendermaßen gelesen (und mit print() ausgegeben) werden:

value = excel_sheet['F15'].value
print("Der Wert von F15 lautet: {0}".format(value))

Für das Lesen mehrerer Werte einer Spalte (hier: F15 bis F26) können for-Schleifen verwendet werden:

for row_of_cells in excel_sheet['D15':'D16']:
    for cell in row_of_cells:
        print(cell.coordinate, cell.value)

Als Ergebnis werden die Zeilennummern (cell.coordinate) und die dazugehörigen Werte (cell.value) ausgegeben:

F15 101.7
F16 100.5
F17 104.4
F18 108.1
F19 111.4
F20 111.5
F21 114.3
F22 114.1
F23 111.8
F24 110.3
F25 105.4
F26 102.7

Die Werte könnte man auch zu einer Liste hinzufügen:

cell_values = []

for row_of_cells in excel_sheet['F15':'F26']:
    for cell in row_of_cells:
        cell_values.append(cell.value)

print(cell_values)
# -> [101.7, 100.5, 104.4, 108.1, 111.4, 111.5, 114.3, 114.1, 111.8, 110.3, 105.4, 102.7]

Falls sich die Excel-Datei und das Python-Skript nicht im selben Verzeichnis befinden sollten, kann man

load_workbook()

als Argument den Pfad übergeben (hier: ~/Documents/Data/). Der Anfang des Skripts würde dann so aussehen:

from os.path import expanduser
import openpyxl

FILE_PATH = expanduser('~') + '/Documents/Data/G_IV_3_m1908_SH.xlsx'
excel_file = openpyxl.load_workbook(FILE_PATH)

Diese Art der “Pfad-Konstruktion” mit expanduser('~') funktioniert sowohl unter Linux und macOS als auch auf Windows-Systemen.

Es mag sein, dass die Datei nicht geöffnet werden kann. Deswegen ist es sinnvoll, dies mit try/except abzufangen, wobei in diesem Beispiel zusätzlich sys importiert werden muss:

try:
    excel_file = openpyxl.load_workbook(FILE_PATH)
except IOError as e:
    print("ERROR: {0}".format(e))
    sys.exit()

Kompletter Code

Abschließend zur besseren Übersicht hier nochmal der komplette Code:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from os.path import expanduser
import openpyxl
import sys

FILE_PATH = expanduser('~') + '/Documents/Data/G_IV_3_m1908_SH.xlsx'

try:
    excel_file = openpyxl.load_workbook(FILE_PATH)
except IOError as e:
    print("ERROR: {0}".format(e))
    sys.exit()

# excel_file = openpyxl.load_workbook('G_IV_3_m1908_SH.xlsx')

excel_sheet = excel_file['Tab. 1']

value = excel_sheet['F15'].value
print("Der Wert von F15 lautet: {0}".format(value))

cell_values = []

for row_of_cells in excel_sheet['F15':'F26']:
    for cell in row_of_cells:
        cell_values.append(cell.value)

print(cell_values)

Weiterführende Links