XLSX-Erstellung, -Bearbeitung und -Analyse
| Aufgabe | Ansatz |
|---|---|
| Erstellen oder Bearbeiten mit Formeln/Formatierung | openpyxl — siehe Fallstricke unten |
| Massendaten rein oder raus | pandas (read_excel, to_excel) |
| Schnellansicht eines Blatts | markitdown datei.xlsx — ## Blattname pro Blatt; liest auch .xlsm. Keine Zellkoordinaten, daher keine Bearbeitungen darauf planen |
| Lesen eines Modells (Formeln und Werte) | zwei load_workbook-Durchläufe — siehe Fallstricke |
openpyxl,pandasundmarkitdownsind vorinstalliert — führen Sie nichtpip installaus; schreiben Sie das Skript und importieren Sie direkt. Nur wenn ein Import fehlschlägt (oder dermarkitdown-Befehl fehlt):pip installfür das fehlende Paket.
Skriptpfade unten sind relativ zum Verzeichnis dieses Skills.
Anforderungen für 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, ein Fehler existierte vor Ihnen, beweisen Sie es: Laden Sie das Original mitdata_only=Trueund prüfen Sie diese Zelle. Ein von Ihnen eingeführter Fehler sieht genauso aus wie ein übernommener. - Verwenden Sie Formeln, niemals hartcodierte Ergebnisse. Schreiben Sie
sheet['B10'] = '=SUM(B2:B9)', nicht die per Python berechnete Summe. Das Blatt muss neu berechnen, wenn sich seine Eingaben ändern. - Befolgen Sie die Vorgabe des Benutzers wörtlich. Exakte Registerkartennamen, exakte Spaltenüberschriften und die Formel, die er buchstabiert hat. Eine Neugestaltung, die etwas anderes berechnet, schlägt fehl, so elegant sie auch sein mag.
- Dokumentieren Sie jede Annahme und jede fest codierte Zahl dort, wo der Leser sie sieht – einen Zellkommentar oder eine benachbarte Zelle am Ende einer Tabelle. Zitieren Sie eine reale Quelle, wenn eine existiert (
Quelle: Unternehmens-10-K, GJ2024, Seite 45, Anhang zu Umsatzerlösen, [SEC EDGAR URL]); wenn die Zahl vom Benutzer stammt, sagen Sie das klar. - Eine Arbeitsmappe, die Sie erstellen, damit jemand sie ausfüllt, benötigt eine kurze Legende, die benennt, welche Zellen bearbeitet werden sollen, und 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: Übernehmen Sie deren Konventionen exakt. Sie überschreiben jede Richtlinie hier. Finden Sie zuerst ihre 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.
Neuberechnen (zwingend erforderlich, sobald die Datei Formeln enthält)
openpyxl schreibt Formeln als Zeichenfolgen ohne zwischengespeicherte Werte. Bis Sie neu berechnen, liest sich jede
Formelzelle für alles, was zwischengespeicherte Werte liest, als None – 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 direkt ü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 es
zurückgehalten hat – vertrauen Sie total_errors, nicht der Länge der Liste). Beheben Sie, was es benennt, 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, also behandeln Sie eine saubere Beendigung niemals als saubere Arbeitsmappe.
Eine grüne Neuberechnung beweist, dass Ihre Formeln ausgewertet werden, nicht dass sie richtig sind. Ein um 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 ganzes 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 ='[1]Returns Analysis'!$B$2 – die [1] ist ein Index
in die Liste externer 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
enthält. openpyxl entfernt diesen Wert beim Speichern; LibreOffice muss dann den Verweis tatsächlich
auflösen, schlägt fehl, schreibt #NAME? und löscht jeden Verweis. recalc.py weigert sich, in diesem Zustand zu laufen
– 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 überstehen
LibreOffice implementiert weniger Funktionen als Excel, und eine, die es nicht auswerten kann, wird zu einem
buchstäblichen #NAME?, das in der von Ihnen ausgelieferten Datei eingebacken ist.
- 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
_x lfn.-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.TEXTVERKETTEN,_xlfn.KONKAT,_xlfn.WENNS,_xlfn.SCHALTER,_xlfn.MAXWENNS,_xlfn.MINWENNS. Ohne Präfix geschrieben, ergeben alle#NAME?. - Verwenden Sie niemals
XVERWEIS,XVERGLEICH,SORTIEREN,FILTER,EINDEUTIGoderSEQUENZ. Die Laufzeitumgebung von LibreOffice kann sie unter keinem Präfix auswerten. Neuere Builds werten sie zwar aus, aber sie sind übergelaufene Array-Funktionen, und eine mit openpyxl geschriebene Datei hat keine Überlauf-Metadaten, sodass nur die oberste 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 parsen konnte, wird kleingeschrieben zurückgeschrieben – ein schnelles Indiz neben einem
#NAME?.
openpyxl-Fallstricke
- Ein Modell zu lesen erfordert zwei Ladevorgänge.
data_only=Trueliefert zwischengespeicherte Werte, wobei die Formeln verschwunden sind; der Standard liefert Formelzeichenfolgen ohne Werte. Ein Durchlauf kann nicht beides liefern. data_only=Trueist zerstörerisch, wenn Sie speichern. Diese Arbeitsmappe hat keine Formeln mehr, daher ersetzt das Speichern jede einzelne durch einen Literalwert – dauerhaft.data_only=Trueauf 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: Schreiben Sie nur den oberen linken Anker. 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:
='Eingabeannahmen'!$B$5. Ohne Anführungszeichen ergibt es#WERT!.
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 Schlüsselannahmen und Zellen, die der Benutzer ausfüllen soll.
Zahlen: Währung $#,##0, mit der Einheit im Header benannt (Umsatz ($ Mio.)) · Nullen
werden als - dargestellt, auch in Prozenten ($#,##0;($#,##0);-) · Negative in Klammern ·
Prozentsätze 0,0%, gespeichert als Brüche (0,15 wird 15,0% dargestellt; Speichern von 15 wird
1500,0% dargestellt) · Bewertungsmultiplikatoren 0,0x · Jahre als Text ("2024", niemals 2.024).
Struktur: Jede Annahme in einer eigenen beschrifteten Zelle, auf die die sie verwendenden Formeln verweisen
(=B5*(1+$B$6), niemals =B5*1,05) · Formeln konsistent über jeden Prognosezeitraum, da eine
einzelne bearbeitete Zelle in der Mitte einer Zeile der häufigste stille Fehler ist · schützen Sie Nenner, 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)