Geschützte Excel-Formulare mit Python bauen — openpyxl in der Praxis
Das Problem: Daten aus dem Feld zurückbekommen
Wer in einer Organisation arbeitet, kennt das: Daten werden zentral gesammelt, aber die Rückmeldung muss von den Leuten vor Ort kommen. In unserem Fall: Rettungswachen müssen monatlich Einsätze prüfen, die in der Abrechnung fehlen. Die Wachenleiter sollen pro Einsatz einen Kommentar eintragen, aber nichts anderes verändern.
Die Lösung: Automatisch generierte Excel-Dateien, die wie Formulare funktionieren. Alle Daten sind gesperrt, nur die Kommentarspalte ist editierbar. Pro Wache eine eigene Datei, alles als ZIP zum Download.
Warum XLSX und nicht ein Webformular?
Berechtigte Frage. Aber in der Praxis:
- Vertraut: Jeder kennt Tabellenkalkulationen, niemand braucht eine Schulung
- Flexibel: Wachenleiter können filtern, sortieren, drucken
- Batch-fähig: 18 Wachen × 12 Monate = 216 Dateien pro Jahr, automatisch generiert
- Kollaborativ: Die Dateien landen in der Nextcloud, ein Ordner pro Wache. Bearbeitung direkt im Browser über Nextcloud Office (Collabora), kein lokales Excel nötig
- Offline-Fallback: Wer will, kann die Datei trotzdem herunterladen und lokal bearbeiten
Der Clou: Die Wachenleiter öffnen ihre XLSX direkt in der Nextcloud, tragen ihren Kommentar in die freigegebene Spalte ein, speichern. Fertig. Kein Upload, kein Mail-Ping-Pong. Und dank Blattschutz können sie nur die Kommentarspalte bearbeiten, der Rest der Daten ist sicher vor versehentlichen Änderungen.
Das Webformular wäre technisch eleganter, aber die Kombination aus XLSX + Nextcloud Office ist pragmatischer (und der Blattschutz funktioniert auch in Collabora).
Die Zutaten
| |
Ein Paket, keine weiteren Abhängigkeiten. openpyxl kann XLSX-Dateien lesen und schreiben, inklusive Styles, Schutz und Formeln.
Der Kern: Geschützte Arbeitsblätter mit einer offenen Spalte
Das Prinzip ist einfach:
- Blattschutz aktivieren: das gesamte Worksheet wird gesperrt
- Alle Zellen auf
locked=Truesetzen (Default) - Die Kommentarspalte auf
locked=Falsesetzen - Passwort vergeben: damit der Schutz nicht versehentlich aufgehoben wird
| |
Das war’s im Kern. 30 Zeilen für ein geschütztes Excel-Formular.
Professionelles Styling
Nackte Tabellen werden ignoriert. Ein bisschen Farbe und Struktur erhöht die Akzeptanz dramatisch:
| |
Die editierbare Spalte bekommt einen gelben Hintergrund: sowohl im Header (kräftiges Orange) als auch in den Datenzellen (zartes Gelb). Das signalisiert sofort: „Hier bist du dran."
Styling anwenden
| |
Spaltenbreiten. Der unterschätzte Qualitätsfaktor
Nichts schreit lauter „automatisch generiert" als Spalten, die alle gleich breit sind. Ein Dict mit sinnvollen Breiten macht den Unterschied:
| |
Tipp: Die Breiten-Einheit in openpyxl entspricht ungefähr der Zeichenbreite. Eine Spalte mit width=50 fasst etwa 50 Zeichen nebeneinander, bevor der Text umbricht.
Batch-Generierung: 18 Wachen, ein ZIP
In der Praxis generieren wir nicht eine Datei, sondern 18 gleichzeitig: eine pro Rettungswache. Jede bekommt nur die Einsätze, die zu dieser Wache gehören. Alles landet in einem ZIP:
| |
Das ZIP kann dann als Download angeboten oder direkt in eine Nextcloud hochgeladen werden:
| |
In unserem Fall landen die einzelnen XLSX-Dateien direkt in der Nextcloud: ein Ordner pro Wache. Die Wachenleiter öffnen ihre Datei über Nextcloud Office im Browser, füllen die Kommentarspalte aus und speichern. Kein Download, kein Upload, kein E-Mail-Versand. Der Workflow reduziert sich auf: Datei öffnen → Spalte ausfüllen → speichern.
Intelligente Feststellungen statt roher Daten
Der eigentliche Mehrwert liegt nicht in der Excel-Generierung, sondern in der Logik dahinter. Statt einfach nur Rohdaten aufzulisten, prüft das System jeden Einsatz gegen die Abrechnungsdatenbank und generiert eine menschenlesbare Feststellung:
| |
Der Wachenleiter sieht also nicht nur „dieser Einsatz fehlt", sondern warum er fehlt und wo er möglicherweise gelandet ist. Das spart Rückfragen und beschleunigt die Bearbeitung erheblich.
Tipps aus der Praxis
1. Passwort ≠ Sicherheit
Der Blattschutz in Excel ist kein Sicherheitsfeature. Das Passwort lässt sich trivial umgehen. Der Schutz verhindert versehentliche Änderungen, nicht böswillige. Für echte Datensicherheit braucht es andere Maßnahmen.
2. freeze_panes ist Pflicht
| |
Eine Zeile Code, aber enorm wichtig: Der Header bleibt beim Scrollen sichtbar. Bei Tabellen mit 200+ Zeilen ist das der Unterschied zwischen brauchbar und unbrauchbar.
3. Dateinamen mit Kontext
| |
Wenn 18 Dateien in einem ZIP liegen, muss der Name selbsterklärend sein. Keine generischen export.xlsx.
4. Leere Tabellen abfangen
| |
Wenn eine Wache im Monat keine fehlenden Einsätze hat: trotzdem eine Datei erzeugen. Das signalisiert „wurde geprüft, nichts offen" (besser als eine fehlende Datei, die Fragen aufwirft).
5. In-Memory statt Dateisystem
| |
Alles passiert im RAM. Keine temporären Dateien, kein Aufräumen, kein Race-Condition-Risiko. Besonders wichtig bei Web-Anwendungen mit mehreren gleichzeitigen Requests.
Fazit
openpyxl macht es überraschend einfach, professionelle Excel-Formulare zu generieren. Der Blattschutz mit gezielt freigegebenen Spalten ist ein Pattern, das in vielen Organisationen sofort nützlich ist — überall dort, wo Daten zentral generiert und dezentral ergänzt werden.
Die Kernzutaten:
Protection(locked=False)für editierbare Zellenws.protection.sheet = True+ Passwort für den Rest- Farbliche Hervorhebung der editierbaren Bereiche
io.BytesIO()für In-Memory-Generierung- ZIP-Archiv für Batch-Verarbeitung
Das gesamte Pattern (von der Datenbankabfrage über die XLSX-Generierung bis zum ZIP-Download) lässt sich in unter 200 Zeilen Python umsetzen. Nicht schlecht für etwas, das in vielen Unternehmen manuell gemacht wird.
Code-Beispiele basieren auf einer produktiven Flask-Anwendung im Rettungsdienst-QM. Das Paket: openpyxl (MIT-Lizenz).