XLSX-Erstellung, Bearbeitung und Analyse
| Aufgabe | Ansatz |
|---|---|
| Erstellen oder Bearbeiten mit Formeln/Formatierung | openpyxl — siehe Hinweise 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 Bearbeitungsplanung daraus ableiten |
| Modell lesen (Formeln und Werte) | zwei load_workbook-Durchläufe — siehe Hinweise |
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 für jede Ausgabe
- Professionelle Schriftart (Arial, Times New Roman) durchgehend, sofern der Benutzer nichts anderes angibt.
- Null 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 einer, den Sie übernommen haben. - Verwenden Sie Formeln, niemals hartcodierte Ergebnisse. Schreiben Sie
sheet['B10'] = '=SUMME(B2:B9)', nicht den in Python berechneten Gesamtwert. Das Blatt muss neu berechnen, wenn sich seine Eingaben ändern. - Befolgen Sie die Spezifikation des Benutzers buchstabengetreu. Exakte Registerkartennamen, exakte Spaltenüberschriften und die von ihm buchstabierte Formel. Eine Neugestaltung, die etwas anderes berechnet, schlägt fehl, so elegant sie auch sein mag.
- Dokumentieren Sie jede Annahme und jede hartcodierte Zahl dort, wo der Leser sie sieht — ein Zellkommentar oder eine benachbarte Zelle am Ende einer Tabelle. Zitieren Sie eine echte Quelle, wenn eine existiert (
Quelle: 10-K des Unternehmens, GJ2024, Seite 45, Anmerkung zum Umsatz, [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 zu bearbeiten sind, 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 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 (obligatorisch, wenn die Datei Formeln enthält)
openpyxl schreibt Formeln als Zeichenfolgen ohne zwischengespeicherte Werte. Bis Sie neu berechnen, liest jede Formelzelle als None zurück, wenn etwas 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 neu geschrieben, 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 total_errors, nicht der Länge der Liste). Beheben Sie, was benannt wird, und führen Sie es erneut aus. JSON mit einem error-Schlüssel anstelle von status bedeutet, dass nichts neu berechnet wurde, und nur in diesem Fall wird ein Exit-Code ungleich Null zurückgegeben — errors_found hat Exit-Code 0, behandeln Sie einen sauberen Exit also niemals als saubere Arbeitsmappe.
Eine grüne Neuberechnung beweist, dass Ihre Formeln ausgewertet werden, nicht dass sie richtig sind. Ein um eins versetzter 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 verlinkt, verliert diese Links, wenn Sie sie mit openpyxl erneut speichern und dann neu berechnen. Eine solche Formel liest sich wie ='[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 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 überstehen
LibreOffice implementiert weniger Funktionen als Excel, und eine, die es nicht auswerten kann, wird zu einem buchstäblichen #NAME?, das in die von Ihnen gelieferte Datei eingebrannt ist.
- Bevorzugen Sie Funktionen aus der Excel-2007-Ära —
SUMMEWENNS,INDEX,VERGLEICH,WENNFEHLER,SUMMENPRODUKT— die kein Präfix benötigen. - Sechs Funktionen aus der Zeit nach 2007 funktionieren, aber nur mit einem
_xlfn.-Präfix, weil openpyxl Ihre Formel wörtlich in das XML schreibt und Excel Namen aus der Zeit nach 2007 mit Präfix speichert (die Benutzeroberfläche blendet das Präfix aus):_xlfn.TEXTJOIN,_xlfn.CONCAT,_xlfn.IFS,_xlfn.SWITCH,_xlfn.MAXIFS,_xlfn.MINIFS. Ohne Präfix geschrieben, ergeben alle#NAME?. - Verwenden Sie niemals
XVERWEIS,XMATCH,SORTIEREN,FILTER,EINDEUTIGoderSEQUENZ. Die Laufzeitumgebung von LibreOffice kann sie unter keinem Präfix auswerten. Neuere Builds werten sie zwar aus, aber es handelt sich um dynamische Array-Funktionen, und eine mit openpyxl geschriebene Datei hat keine Metadaten für dynamische Arrays, sodass nur die oberste linke Zelle des Bereichs einen Wert erhält — undrecalc.pymeldettotal_errors: 0für das abgeschnittene Ergebnis. Verwenden SieINDEX/VERGLEICHfür Nachschlagevorgänge und sortieren, filtern und deduplizieren Sie in Python, bevor Sie die Zellen schreiben. - Eine Formel, die LibreOffice nicht parsen konnte, wird in Kleinbuchstaben zurückgeschrieben — ein schneller Hinweis neben einem
#NAME?.
openpyxl-Hinweise
- Ein Modell zu lesen erfordert zwei Ladevorgänge.
data_only=Trueliefert zwischengespeicherte Werte, wobei die Formeln verschwunden sind; die Standardeinstellung liefert Formelstrings ohne Werte. Ein Durchlauf kann nicht beides liefern. data_only=Trueist zerstörerisch, wenn Sie speichern. Diese Arbeitsmappe hat keine Formeln mehr, sodass das Speichern jede durch einen Literalwert ersetzt — 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: Schreiben Sie nur die obere linke Ankerzelle. 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:
='Eingaben Annahmen'!$B$5. Ohne Anführungszeichen ergibt er#WERT!.
Finanzmodelle
Sofern der Benutzer nichts anderes angibt oder die vorhandene Datei bereits etwas anderes tut.
Farbe: Blauer Text (0,0,255) für hartcodierte 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 ($Mio.)) · Nullen werden als - dargestellt, auch bei Prozenten ($#,##0;($#,##0);-) · Negative in Klammern · Prozente 0,0%, gespeichert als Brüche (0,15 wird als 15,0% dargestellt; 15 zu speichern ergibt 1500,0%) · Bewertungsmultiplikatoren 0,0x · Jahre als Text ("2024", niemals 2.024).
Struktur: Jede Annahme in einer eigenen beschrifteten Zelle, auf die durch die sie verwendenden Formeln verwiesen wird (=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 · Nenner, die Null sein können, absichern.
Abhängigkeiten
openpyxl, pandas, markitdown (pip, vorinstalliert — nur installieren, wenn ein Import fehlschlägt oder der Befehl fehlt) · LibreOffice (soffice, automatisch für Sandbox-Umgebungen konfiguriert über scripts/office/soffice.py)