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).
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
- Dokumentation zu openpyxl
- Excel-Daten mit Python lesen (mit
xlrd
undpandas
) - Daten mit Python und openpyxl in einer Excel-Datei speichern (imessage_reader)