Erstellung, Bearbeitung und Analyse von XLSX-Dateien
| Aufgabe | Ansatz |
|---|---|
| Erstellen oder Bearbeiten mit Formeln/Formatierung | openpyxl – siehe Fallstricke unten |
| Große Datenmengen ein- oder auslesen | pandas (read_excel, to_excel) |
| Schneller Blick auf ein Blatt | markitdown datei.xlsx – ## Blattname pro Blatt; liest auch .xlsm. Keine Zellkoordinaten, daher keine Bearbeitungen darauf planen |
| Ein Modell lesen (Formeln und Werte) | zwei load_workbook-Durchläufe – siehe Fallstricke |
openpyxl,pandasundmarkitdownsind vorinstalliert – führen Sie nicht zuerstpip installaus; schreiben Sie das Skript und importieren Sie direkt. Nur wenn ein Import fehlschlägt (oder der Befehlmarkitdownfehlt):pip installdes fehlenden Pakets.
Skriptpfade unten sind relativ zum Verzeichnis dieser Fähigkeit.
Anforderungen an jede Ausgabe
- Professionelle Schriftart (Arial, Times New Roman) durchgehend, sofern der Benutzer nichts anderes angibt.
- Keine Formelfehler. Liefern Sie niemals aus, während
recalc.pyerrors_foundmeldet. Wenn Sie glauben, dass ein Fehler bereits vor Ihnen existierte, beweisen Sie es: Laden Sie das Original mitdata_only=Trueund sehen Sie sich diese Zelle an. Ein von Ihnen eingeführter Fehler sieht genauso aus wie ein übernommener. - Verwenden Sie Formeln, niemals hartcodierte Ergebnisse. Schreiben Sie
sheet['B10'] = '=SUMME(B2:B9)', nicht den in Python berechneten Gesamtwert. Das Blatt muss neu berechnet werden, wenn sich seine Eingaben ändern. - Befolgen Sie die Spezifikation des Benutzers wörtlich. Exakte Registerkartennamen, exakte Spaltenüberschriften und die von ihm angegebene Formel. Eine Neugestaltung, die etwas anderes berechnet, ist fehlgeschlagen, so elegant sie auch sein mag.
- Dokumentieren Sie jede Annahme und jede fest codierte Zahl dort, wo der Leser sie sieht – ein Zellenkommentar oder eine benachbarte Zelle am Ende einer Tabelle. Zitieren Sie eine reale Quelle, wenn eine vorhanden ist (
Quelle: Jahresabschluss 10-K, Geschäftsjahr 2024, Seite 45, Anmerkung zu Umsatzerlösen, [SEC EDGAR URL]); wenn die Zahl vom Benutzer stammt, sagen Sie dies klar. - Eine Arbeitsmappe, die Sie erstellen, damit jemand sie ausfüllt, benötigt eine kurze Legende, die angibt, welche Zellen zu bearbeiten sind, sowie eine Beispielzeile mit realistischen Werten, die das erwartete Format zeigt. Fügen Sie eine solche Zeile niemals zu einer Datei hinzu, die Sie bearbeiten sollen.
- Bearbeiten einer vorhandenen Datei: Befolgen Sie deren Konventionen genau. Sie überschreiben jede Richtlinie hier. Finden Sie zuerst die dafür vorgesehenen Eingabezellen – eine bestimmte Schriftfarbe, Füllung oder Schattierung kennzeichnet sie – schreiben Sie nur dort und lassen Sie jede vorhandene Formel unberührt.
Neuberechnung (zwingend erforderlich, wenn die Datei Formeln enthält)
openpyxl schreibt Formeln als Zeichenfolgen ohne zwischengespeicherte Werte. Bis Sie neu berechnen, liest sich jede
Formelzelle als None für alles, was zwischengespeicherte Werte liest – pandas,
load_workbook(data_only=True) und die meisten Vorschauprogramme.
python scripts/recalc.py ausgabe.xlsx [timeout_sekunden] # Standard 30
LibreOffice berechnet jede Formel, die Datei wird an Ort und Stelle überschrieben, und Sie erhalten JSON:
status (success | errors_found), total_formulas, total_errors und eine
error_summary, die bis zu 100 Zellen pro Fehlertyp benennt (locations_truncated sagt, wie viele sie
zurückgehalten hat – vertrauen Sie auf total_errors, nicht auf die Länge der Liste). Beheben Sie, was benannt wird, und führen Sie es erneut aus. JSON mit einem error-Schlüssel anstelle eines status bedeutet, dass nichts neu berechnet wurde, und nur
dieser Fall beendet sich mit einem Fehlercode ungleich Null – errors_found beendet sich mit 0, behandeln Sie eine saubere Beendigung also niemals als saubere Arbeitsmappe.
Eine grüne Neubildung beweist, dass Ihre Formeln ausgewertet werden, nicht, dass sie richtig sind. Ein um plus/minus Eins verschobener Bereich oder ein Verweis auf die falsche Zeile ergibt eine saubere, fehlerfreie Datei mit falschen Zahlen. Schreiben Sie zuerst 2–3 Formeln und prüfen Sie, ob sie die erwarteten Werte liefern, bevor Sie ein Raster aufbauen.
Eine Arbeitsmappe, die auf eine andere Datei verweist, verliert diese Verweise, wenn Sie sie mit openpyxl
neu speichern und dann neu berechnen. Eine solche Formel liest sich als ='[1]Returns Analysis'!$B$2 – die [1] ist ein Index
in die Liste der externen Verweise der Arbeitsmappe und benennt eine separate Datei auf der Festplatte, kein Blatt.
Diese Datei ist hier selten vorhanden, daher ist der zwischengespeicherte Wert der Zelle das Einzige, was ihre Daten
hält. openpyxl entfernt diesen Wert beim Speichern; LibreOffice muss dann den Verweis tatsächlich auflösen, scheitert, schreibt #NAME? und löscht jeden Link. recalc.py weigert sich, in diesem Zustand ausgeführt zu werden
– kopieren Sie die Werte dieser Zellen aus dem Original, bevor Sie darüber speichern (--force überschreibt
und akzeptiert den Verlust).
Auswahl von Formeln, die die Überprüfung überleben
LibreOffice implementiert weniger Funktionen als Excel, und eine, die es nicht auswerten kann, wird zu einem
buchstäblichen #NAME? in der von Ihnen gelieferten Datei.
- Bevorzugen Sie Funktionen aus der Excel-2007-Ära –
SUMMEWENNS,INDEX,VERGLEICH,WENNFEHLER,SUMMENPRODUKT– die kein Präfix benötigen. - Sechs Funktionen nach 2007 funktionieren, aber nur mit einem
_xlfn.-Präfix, weil openpyxl Ihre Formel wörtlich in das XML schreibt und Excel Namen nach 2007 mit Präfix speichert (die Benutzeroberfläche verbirgt das Präfix):_xlfn.TEXTJOIN,_xlfn.CONCAT,_xlfn.IFS,_xlfn.SWITCH,_xlfn.MAXIFS,_xlfn.MINIFS. Ohne Präfix ergeben jeweils#NAME?. - Verwenden Sie niemals
XLOOKUP,XMATCH,SORT,FILTER,UNIQUEoderSEQUENCE. Die Laufzeitumgebung von LibreOffice kann sie unter keinem Präfix auswerten. Neuere Builds werten sie zwar aus, aber sie sind überlaufende Array-Funktionen und eine mit openpyxl geschriebene Datei hat keine Überlauf-Metadaten, sodass nur die obere linke Zelle des Bereichs einen Wert erhält – undrecalc.pymeldettotal_errors: 0für das abgeschnittene Ergebnis. Verwenden SieINDEX/VERGLEICHfür Suchvorgänge und sortieren, filtern und deduplizieren Sie in Python, bevor Sie die Zellen schreiben. - Eine Formel, die LibreOffice nicht analysieren konnte, wird kleingeschrieben zurückgeschrieben – ein schnelles Indiz neben einem
#NAME?.
openpyxl-Fallstricke
- Das Lesen eines Modells erfordert zwei Ladevorgänge.
data_only=Trueliefert zwischengespeicherte Werte ohne die Formeln; die Standardeinstellung liefert Formelzeichenfolgen ohne Werte. Ein Durchlauf kann nicht beides liefern. data_only=Trueist destruktiv, wenn Sie speichern. Diese Arbeitsmappe hat keine Formeln mehr, daher ersetzt das Speichern jede durch einen Literalwert – dauerhaft.data_only=Truebei einer Datei, die openpyxl gerade geschrieben hat, gibt überallNonezurück – führen Sie zuerstrecalc.pyaus. (Eine Formel, deren Ergebnis""ist, wird ebenfalls alsNonezurückgelesen.)- Verbundene Zellen: Nur die obere linke Ankerzelle beschreiben. Jede andere Zelle im Bereich ist eine
MergedCell, deren.valueschreibgeschützt ist. .xlsmverliert seine Makros, es sei denn, Sie übergebenkeep_vba=Trueanload_workbook.- Ein Blattname, der ein Leerzeichen enthält, muss in einem blattübergreifenden Verweis in Anführungszeichen gesetzt werden: ='Assumptions Inputs'!$B$5. Ohne Anführungszeichen wird es zu
#WERT!ausgewertet.
Finanzmodelle
Sofern der Benutzer nichts anderes angibt oder die vorhandene Datei bereits etwas anderes tut.
Farbe: Blauer Text (0,0,255) für fest codierte Eingaben und Szenario-Hebel · Schwarz für Formeln ·
Grün (0,128,0) für Verweise auf ein anderes Blatt · Rot (255,0,0) für Verweise auf eine andere Datei ·
Gelbe Füllung (255,255,0) für wichtige Annahmen und Zellen, die der Benutzer ausfüllen soll.
Zahlen: Währung $#,##0, mit der Einheit in der Kopfzeile (Umsatz ($mm)) · Nullen werden als
- dargestellt, auch in Prozent ($#,##0;($#,##0);-) · Negative in Klammern ·
Prozentsätze 0,0%, gespeichert als Brüche (0.15 wird als 15,0% angezeigt; das Speichern von 15 ergibt
1500,0%) · Bewertungsmultiplikatoren 0,0x · Jahre als Text ("2024", niemals 2,024).
Struktur: Jede Annahme in einer eigenen beschrifteten Zelle, auf die die Formeln verweisen, die sie verwenden
(=B5*(1+$B$6), niemals =B5*1,05) · Formeln über jeden Prognosezeitraum hinweg konsistent, da eine
einzelne bearbeitete Zelle in der Mitte einer Zeile der häufigste stille Fehler ist · Nenner schützen, die Null sein können.
Abhängigkeiten
openpyxl, pandas, markitdown (pip, vorinstalliert – nur installieren, wenn ein Import fehlschlägt oder der Befehl fehlt) · LibreOffice (soffice, automatisch konfiguriert für Sandbox-Umgebungen über scripts/office/soffice.py)