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()

Hinweis: Seit Python 3.3 ist IOError ein Alias von OSError. Man könnte also auch except OSError as e: schreiben (vgl. diesen StackOverflow-Beitrag).

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)

Wenn Euch interessiert, wie mithilfe von openpyxl Daten in einer Excel-Datei gespeichert werden können, dann werft einen Blick auf das Open-Source-Projekt imessage_reader, das über Github heruntergeladen werden kann:

$ git clone https://github.com/niftycode/imessage_reader.git

Zuletzt aktualisiert am 1. November 2020

Weiterführende Links